10 Haziran 2008 Salı

FreeBSD & ZFS

BSD ve linux camiasinda FreeBSD ZFS dosya sistemini ilk port eden işletim sistemi oldu. ZFS'i i ilk duydugumda emektar Sun (sparc) sunucularımızdan birini üzerinine sırf denemek için solaris 10 kurmuştum. Kurcalamak fırsat olmadı.Kısmet FreeBSD'ninmiş.

ZFS'in tüm özelliklerini anlatmak çok zor. ZFS yönetimi ile ilgili Sun tarafından yazılan belge 190 sayfa :)
Dolayısı ile benim burda yazdıklarım ZFS'in sadece benim tarafından kullanılan özellikleri.

ZFS kullanmanız için en azından 1Gbyte belleğinizin olması öneriliyor.ZFS klasik dosya sistemlerinin
birçok limit ve zorluklarını ortadan kaldırıyor. Merak edenler ayrıntılarını google'dan aratıp öğrenebilir ama pratikte benim hoşuma gidenler.
# Dosya sistemi maksimim büyüklüğü gibi bir derdiniz yok.(2 Tbyte limitlerle uğraşmaktan bıkanlar için)
Max dosya büyüklüğü limitiniz yok.
Dosya sisteminizin büyüklüğünü ihtiyacınıza göre küçültüp büyütebiliyorsunuz.
İsterseniz verileriniz dosya sistemine sıkıştırılarak aktarılabiliyor.
Yazma işlemleri copy on write olduğu için fsck'ya son :)
Kolayca RAID1,0, 5,6,10, 50 yapma olanağı
Block size'ı sonradan değiştirme olanağı
Disk snapshot alma yeteneği.
Kullanım kolaylığı.

ve burda yazmadığımız birçok güzel özellik. ZFS için kullandığım sunucu 2 adet AMD Opteron 252 işlemcisine sahip üzerinde 4 adet sata disk var. ad6,ad8 ve ad10 disklerini zfs üzerinde raidz2 yapmak için kullanacağız.FreeBSD kurulumu AMD64 dağıtımı üzerinden yapıldı.
# ad4: 35304MB
ad6: 238475MB
ad8: 238475MB
ad10: 238475MB

FreeBSD'de ZFS in açılışta aktif olması için ilk olarak /etc/rc.conf dosyasına aşağıdaki satırları ekiyoruz.

zfs_enable="YES"

Bundan sonra yapmanız gereken FreeBSD wiki'de açıklandığı üzere /boot/loader.conf dosyasının içine aşağıdaki satırları ekleyerek:
vm.kmem_size="512M"

çekirdeğinizde kmem adres alanını ZFS için biraz daha artırmak . Aksi taktirde söyle bir hata ile karşılaşabiliyorsunuz:
Apr 8 06:46:08 nas savecore: reboot after panic: kmem_malloc(131072): kmem_map too small: 528273408 total allocated
Bu durumda 512M değerini daha yükseğe çekmek gerekiyor (1024M).Sunucuda kullandığım diskleri başka sunuculardan söktüğüm için üzerlerinde bad sector bulunmadığından emin olmam gerekiyordu. FreeBSD port kolleksiyonunda bulunan badblocks programı ile tarama yaptım.

[root@alchemist ~]# cd /usr/ports/sysutils/e2fsprogs
[root@alchemist ~]# make install
[root@alchemist ~]# badblocks -o /root/ad10.txt -w -b 4096 -c 512 -s /dev/ad10

Yukarıdaki komut /dev/ad10 'da bad sector varsa numaralarını /root/ad10.txt dosyasının altında yazmasını söylüyor.Şansıma 3 diskte temiz çıktı. Artık ZFS ile oynamaya başlayabiliriz. 3 adet diskimiz vardı. Birine zfs pool'u oluşturalım.

[root@alchemist ~]# zpool create log /dev/ad10

Komut tam olarak bu kadar. ZFS sizin için yarattığınız pool'u /log altına otomatik olarak mount editor.
Bunu ext3, ufs te yapar diyebilirsizi o zaman birde şuna bakalım. 3 diskle RAID 6 (ZFS'te RAIDZ2 olarak geçiyor)
yapalım.

[root@alchemist ~]# zpool create log raidz2 /dev/ad6 /dev/ad8 /dev/ad10

[root@alchemist ~]# df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad4s1a 26389 2306 21971 10% /
devfs 0 0 0 100% /dev
log 232942 0 232942 0% /log

işte bu kadar. RAID5 yapmak için raidz2 yerine raidz yazmanız yeterli. RAID1 yapmak içinse mirror yazıyoruz.
[root@alchemist ~]# zpool create log mirror /dev/ad8 /dev/ad10

Bu kadar kolay olacağını tahmin etmemiştim açıkcası. Pool yaratılması için 1-2 sn beklemeniz yeterli oluyor.Sonra yaratığınız pool'u direkt olarak kullanabiliyorsunuz. FreeBSD üzerinde gmirror ile RAID-1 yazıma bakarsanız RAID olayın ne kadar kolaylaştığını görebilirsiniz. Ben diskleri RAID6 kullanacağım için bundan sonraki kısmı RAID6 yapılandırmasında gösterdim. Yarattığımız pool'un durumuna bir bakalım.

[root@alchemist ~]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
log 696G 338K 696G 0% ONLINE -

[root@alchemist ~]# zpool status
pool: log
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
log ONLINE 0 0 0
raidz2 ONLINE 0 0 0
ad6 ONLINE 0 0 0
ad8 ONLINE 0 0 0
ad10 ONLINE 0 0 0

errors: No known data errors

Bu kısıma kadar olanlar örnekti. Bu örneklerden sonra benim ne yaptığım ve açıklamalarına gelirsek:
#logman adında RAID6 yapılandırmasında bir pool oluşturup içinde logs adı altında bir dosya sistemi yaratalım.
[root@alchemist ~]#zpool create logman raidz2 /dev/ad6 /dev/ad8 /dev/ad10

[root@alchemist ~]#zfs create logman/logs
[root@alchemist ~]# df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad4s1a 26389 2306 21972 9% /
devfs 0 0 0 100% /dev
logman 232942 0 232942 0% /logman
logman/logs 232942 0 232942 0% /logman/logs

#/logman/logs'un büyüklüğü gördüğünüz üzere /logman ile aynı,dosya sistemin büyüklüğünü 10 Gbyte olarak ayarlayalım:
[root@alchemist ~]# zfs set quota=10g logman/logs

[root@alchemist ~]# df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad4s1a 26389 2306 21972 9% /
devfs 0 0 0 100% /dev
logman 232942 0 232942 0% /logman
logman/logs 10240 0 10239 0% /logman/logs

#/logman/logs altına sistem log dosyalarını atacağımdan dolayı bu kısmı sıkıştırılmış şekilde kullanmak istiyorum.ZFS sıkıştırma özelliğini açıp en üst seviye olan 9 'a ayarlayalım:
[root@alchemist ~]#zfs set compression=on logman/logs
[root@alchemist ~]#zfs set compression=gzip-9 logman/logs

#Dosya sisteminin değiştirebileceğimiz diğer özelliklerin görmek için:

[root@alchemist ~]# zfs get all logman/logs

NAME PROPERTY VALUE SOURCE
logman/logs type filesystem -
logman/logs creation Tue May 27 13:52 2008 -
logman/logs used 22.9K -
logman/logs available 10.0G -
logman/logs referenced 22.9K -
logman/logs compressratio 1.04x -
logman/logs mounted yes -
logman/logs quota 10G local
logman/logs reservation none default
logman/logs recordsize 128K default
logman/logs mountpoint /logman/logs default
logman/logs sharenfs off default
logman/logs checksum on default
logman/logs compression gzip-9 local
logman/logs atime on default
logman/logs devices on default
logman/logs exec on default
logman/logs setuid on default
logman/logs readonly off default
logman/logs jailed off default
logman/logs snapdir hidden default
logman/logs aclmode groupmask default
logman/logs aclinherit secure default
logman/logs canmount on default
logman/logs shareiscsi off default
logman/logs xattr off temporary
logman/logs copies 1 default

#Şu ana kadar hangi komutları kullanmışız:

[root@alchemist ~]# zpool history
History for 'logman':
2008-05-27.13:52:03 zpool create logman raidz2 /dev/ad6 /dev/ad8 /dev/ad10
2008-05-27.13:52:53 zfs create logman/logs
2008-05-27.13:58:39 zfs set quota=10g logman/logs
2008-05-27.13:59:09 zfs set compression=on logman/logs
2008-05-27.14:00:39 zfs set compression=gzip-9 logman/logs

#Disklerin okuma/yazma istatistiklerine 10 sn ortalamalı olarak bir bakalım:

[root@alchemist ~]# zpool iostat 10
capacity operations bandwidth
pool used avail read write read write
---------- ----- ----- ----- ----- ----- -----
logman 526K 696G 0 1 33 3.34K
logman 526K 696G 0 0 0 0

#Logman altinda yarattiliginiz temp dizinini /usr/tmp altına mount edelim ama büyüklüğü 2 Gbyte olsun:

[root@alchemist ~]# mkdir /usr/tmp
[root@alchemist ~]# zfs create logman/temp
[root@alchemist ~]# zfs set quota=2g logman/temp
[root@alchemist ~]# zfs set mountpoint=/usr/tmp logman/temp

[root@alchemist ~]# df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad4s1a 26389 2306 21972 9% /
devfs 0 0 0 100% /dev
logman 232942 0 232942 0% /logman
logman/logs 10240 0 10239 0% /logman/logs
logman/temp 2048 0 2047 0% /usr/tmp

#Beğenmedik diyelim :) Yarattığmız kısmı umout edip yok edelim:

[root@alchemist ~]#zfs umount /usr/tmp/
[root@alchemist ~]# zfs destroy logman/temp

#Son olarak normalde yaratığımız dosya sistemlerini /etc/fstab altına yazmamız lazım değil mi ? Ona da gerek yok:

[root@alchemist ~]# zfs mount -a

yeterli.

Kaynak: PCLabs

Hiç yorum yok: