jump to navigation

FreeBSD & ZFS Haziran 9, 2008

Alchemist | Teknoloji, Unix | trackback | Yazıcı Uyumlu Sayfa Yazıcı Uyumlu Sayfa

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.

    +

    Saygılar.

    Yorumlar »

    1. Dr.ÇAKIR - 09 Haziran 2008

    Çok teknik bir döküman. Hali hazırda FreeBSD kullananlar için ideal. Ama diğer büyük çoğunluğu temsil eden bizler için çok teknik. :)

    Hep bu şekilde detaylı olarak FreeBAS veya Linux kullanmak istemişimdir. Ancak tüm işiniz bu olmayınca sadece evde çalışmayla olacak iş değil.

    2. iyiinsan - 09 Haziran 2008

    ZFS'nin Mac OS X Leopard'la geleceğine dair dedikodular vardı fakat son sistemde ne yazık ki bunu göremedik.

    Hatta bazıları HSF+'nın bırakılıp ZFS'nin varsayılan dosyalama sistemi olarak geleceğinden emindi.

    Şimdi ise Disk Utility'de ZFS'nin adı bile geçmiyor, fakat birkaç satır kodla ZFS'ye okuma/yazma desteğinin açılabildiği söyleniyor.

    Belki de birkaç saat içinde duyuralacağı söylenen Snow Leopard'la gelir. :)

    3. S.. - 10 Haziran 2008

    @iyiinsan

    Belki bir sonraki Macox sürümünde gelir. Çünkü freebsd için de şu anda tam destek söz konusu değil. freebsd 7.1 ile gelecek.

    4. munirekinci - 10 Haziran 2008

    Öncelikle eliniza sağlık.

    Merak ettiğim bir konu var 2TB sınırı işlemci ile alakalı değil mi? Yabancı bir forumda 32Bit işlemci kullanan bilgisayar üzerinde max. 2TB'lık bölüm oluşturulabileceğini/kullanılabileceğini okumuştum?

    Acaba bu limit tam olarak ne ile alakalı?

    5. Alchemist - 10 Haziran 2008

    @Dr Çakır
    Evet biraz fazla teknik oldu gibi :)
    @S..
    FreeBSD 7.0 da yazdığın gibi destek deneysel (experimental) ama şu ana kadar bir sorun yaşamadık. FreeBSD wiki ve forumlarından okuduğum kadarı ile gayet kararlı olarak çalışıyor.
    @munirekinci
    Kullanıcağınız dosya sistemini limitleri üç etken tarafından belirleniyor
    1)İşlemcinizin kaç bit olduğu
    2)Dosya sisteminin adreslemesin kaç bit olduğu
    3)Kullandığınız blok büyüklüğü.

    az bit adresine sahip olan dosya sistemlerinde 2Tbyte limiti aşmanız için yapmanız gereken kullandığınız blok büyüklüğünü arttırmak.Örneğin 32 bit
    dosya sisteminiz varsa normalde 4Kbyte olan blok büyüklüğünü linux çekirdeğini derlerken seçeceğiniz Large Block Size opsiyonunu aktive ederek 8Kbyte a çıkarabilir ve adres sayısı aynı olmasına karşın blok büyüklüğünü arttırarak toplamda adreslenen veri büyüklüğünü yükseltebilirsiniz.Diğer bir yöntemde 32 bit olan dosya sitemini adreslemesini arttırmak. ZFS te 128 adresleme kullanıyor örneğin.Dosya sisteminde 32 bitten üzeri çıktığınızda işlemcinizinde bu bit sayısını destekler bir durumda olmasında fayda var yoksa 32 bit işlemcilerde 4Gbyte üzeri belleğin desteklemesi için geliştirilen PAE (Physical Address Extension) tarzı taklar atmanız gerekebiliyor.Ext3 adreslemesini 48 ve 64 bite çıkaran yamalar mevcut (belkide artık kararlı olmuşlardır)

    Kısaca 32 bit işlemcilerlede 2 Tbyte limiti aşmak mümkün :) Hangi dosya sistemini seçtiğinize göre limitler değişebilir.Dosya sistemlerinin karşılaştırılması için Şu linke bir bak istersen
    http://en.wikipedia.org/wiki/Comparison_of_file_systems

    +
    Saygılar.

    6. S.. - 11 Haziran 2008

    Hm evet öyleymiş, http://www.apple.com/server/macosx/snowleopard/

    7. munirekinci - 12 Haziran 2008

    Teşekkürler Alchemist.

    8. Ankara Bilgisayar Satış Teknoloji ve Elektronik Alışveriş Mağazası - 22 Mart 2009

    Ayrıntılı bilgi ve güzel konu için teşekkürler!