ZFS havuzunda dosya sistemleri ve disk bölümleri yaratmak için dataset’leri ve ZVOL’leri kullanıyoruz. Daha doğrusu bizim dosya sistemi olarak verdiğimiz kavramın ZFS’teki karşılıkları bunlar.
Dataset
Dataset bir ZFS havuzu altındaki iki temel hiyerarşik yapıdan ilki ve muhtemelen en çok kullanacağınız. Normal bir klasör gibi görüp öyle davranabilirsiniz. Aşağıdaki videoda bu makale için sıfırladığım ZFS havuzumu tekrar yaratıp içinde birkaç dataset oluşturacağım.
Aynı dizin (klasör) gibi görünüyor, o zaman biz bu dataset’leri ne için kullanıyoruz diyebilirsiniz. Çok şey için. Bir kere başladıktan sonra ZFS havuzunuz altında normal klasör yaratmayı bile istemeyeceksiniz o kadar söyleyeyim. )
- ZFS’in kavramsal kolaylığı sayesinde klasör gibi görünüyor. Aslında dataset’ler birer dosya sistemi
- Tüm dataset’ler ZFS havuzunuzdaki alanı paylaşır. Böylece depolama kullanımın öngöremediğiniz alanlara sabit boyut atayıp, daha fazla alan ihtiyacı olunca başınızı belaya sokmazsınız.
- Dataset’leri iç içe oluşturabilirsiniz
- Herhangi bir dosya sistemi gibi kullanıp istediğiniz yere bağlayabiliyorsunuz
- Dataset’lere kota verip boyutlarını sınırlandırabiliyorsunuz
- Sınırlandırmazsanız, ZFS havuzunuzun el verdiği ölçüde veri depolayabilirsiniz
- Her dataset’te sıkıştırma, deduplication gibi farklı ZFS özelliklerini açıp kapatabilirsiniz
- Her dataset’in yedeklerini ayrı ayrı alabilirsiniz
Dataset oluşturma
ZFS’te dataset’leri şu basit komutla oluşturuyorsunuz:
zfs create <havuz adı>/<dataset adı>
zfs create tank/yedeklerim
Örnek olarak benim günlük kullandığım dizüstünü göstereceğim. ZFS listeleme komutu:
zfs list
Bu komutun ucuna bir dataset eklerseniz sadece o dataset’in altındakileri gösterir (hatırlayın, iç içe dataset oluşturabiiyorduk).
Burada:
- tpad0tank0 benim ZFS havuzum. Havuz aynı zamanda en üst seviye dataset’in de adı oluyor
- tpad0tank0/home benim kullanıcılarımın ev dizini. Dikkat ederseniz /home altına bağlanmış durumda
- tpad0tank0/lxc benim LXC sanal makinalarımı koyduğum yer. Normalde bu sanal makinalar /var/lib/lxc altında oluşur. Ben oraya bağlamışım. Her makinanın yedeğini, klonunu ayrı ayrı kolayca alabilmek için de hepsine birer alt dataset oluşturuyorum (daha doğrusu LXC onu otomatik yapıyor)
- tpad0tank0/ornekdataset sizin için daha önce oluşturduğum bir örnek. altında da alt datasetleri var
- tpad0tank0/tpad1tank benim eski laptop’umun diski. Onda da ZFS kullanıyordum. Taşıma işi çok hızlı oldu böylece. 🙂
Dataset’leri yoketmek için zfs destroy komutunu kullanıyorsunuz. Eğer o dataset’lerin altında da dataset’ler varsa ZFS sizi uyarıyor ve -r anahtarını kullanmanızı istiyor. İsterseniz alt dataset’leri kontrol edip elle temizledikten sonra üst dataset’inizi yokedebilirsiniz. Ya da -r anahtarıyla altında datasetler olsun olmasın tek hamlede uçurabilirsiniz.
Kotalar ve rezervasyonlar
ZFS’te bir dataset’in boyutunu sınırlandırabilirsiniz; örneğin bir kullanıcıya verdiğiniz paylaşımın boyutunu. Bu dataset ve bunun alt datasetlerinin toplamı sizin söylediğiniz boyutu geçemez.
Mevcut kotalara bakalım önce:
zfs get quota
Şimdi bu dataset’lerden, diyelim ki ubuntu0 adlı dataset’in kotasını 50GB ile sınırlamak istiyorum.
zfs set quota=50G tpad0tank0/lxc/ubuntu0
zfs get quota
Kotayı kaldırmak için:
zfs set quota=none tpad0tank/lxc/ubuntu0
Dikkat edin; bu kotayı lxc dataset’inin tamamına vermiş olsaydım onun altındaki datasetlerin de toplam sınırı bu olacaktı. Ancak kendilerine ait kotaları olmadığı için size bir kota bilgisi göstermeyeceklerdi.
Rezervasyonlar
Kota ile bir dataset’in belli bir miktardan fazla depolama alanı almasını engelliyorsunuz. Eğer bu dataset’e belli miktarda alanın garanti edilmesini istiyor olsaydınız havuzdan bu alanı rezerve edecektiniz.
Rezerve ettiğiniz alan diğer dataset’ler tarafından kullanılamaz. Böylece aslında dataset’e sabit bir boyut da atamış oluyorsunuz.
Dataset’i istediğiniz yere bağlama
Havuzunuzdaki bir dataset’i istediğiniz yere bağlayabilirsiniz (ki benim yukarıdaki örneklerimde daha önce yaptığımı gördünüz). Dataset’in mountpoint özelliğini vermeniz yeterli.
zfs set mountpoint=<bağlama noktası> <dataset adı>
Şimdi örnek olarak bizim sanal ZFS test makinamızın kullanıcı klasörlerini ZFS altına taşıyalım. Bu durumla mesela sisteminize ZFS’i yeni eklediğinizde karşılaşabilirsiniz. Sistemi baştan kuracak haliniz olmadığına göre…
Ne yaptık? ZFS listeleme dışında kullandığım temel komutlar şöyle:
zfs create tank/home
mv /home/* /tank/home/
zfs set mountpoint=/home tank/home
- ZFS havuzumuzda (tank’ta) bir dataset oluşturdum. Bu dataset’in adını home koydum, başka bir şey koysanız da farketmezdi.
- Mevcut /home dizin içeriğimizi, yani kullanıcı ev dizinlerini bu yeni dataset’e taşıdım.
- Yeni dataset’imin bağlama noktası olarak /home dizinini gösterdim
Bunu genellikle sistem dizinlerini ZFS’e aktarırken kullanırız. Böylece aynı dizini kullanan bir sürü program için ayrı ayrı iş yapmayız; meseal /var/log için bir dataset yaratabiliriz. Ya da web sunucumuzun siteleri barındırdığı dizinleri bu şekilde tutabiliriz.
ZVOL
ZVOL kavramı ZFS havuzunuz altında, sisteminizdeki herhangi bir sabit disk bölümünden farksız kullanabileceğiniz bir alt alan yaratmak demektir. Bu ZVOL’ü istediğiniz gibi biçimlendirebilirsiniz (yani istediğiniz dosya sistemini koyabilirsiniz). ZVOL’ü aşağıdaki komutlarla yaratıp yokedebilirsiniz:
zfs create -v 8G tank/myzvol
zfs destroy tank/myzvol
Yaratırken disk alanı verdiğimize dikkat edin. Bu sistemdeki bir diskin herhangi bir bölümünden farksız bir blok aygıtı olacak. Yani bir boyuta ihtiyacı var.
Yarattığımız ZVOL sistemdeki herhangi bir bölüm gibi kullanılabilmenin yanısıra ZFS’in snapshot, sıkıştırma, deduplication, önbellekleme gibi özelliklerinden faydalanacak. Örneğimizi oluşturup, Ext4 dosya sistemi ile biçimlendirip bir yerlere bağlayalım.
Bu ZVOL işinin kullanım alanlarından biri takas disk bölümü (swap) yaratmaktır. Bir diğeri de ZFS desteklemeyen uygulamalarınız varsa bunlar için kendi dosya sistemlerinde kurulum yapmaktır -mesela MS SQL Server’ın Linux sürümü ZFS üzerinde çalışmıyordu en son. Onu koyduğumu sanallaştırılmış Ubuntu makinasını ZFS yapıp uğraştıktan sonra, bir ZVOL yaratıp, onu XFS ile biçimlendirdim ve MS SQL Server kurulumunu oraya yapabildim.