My Shiny Weblog!

programming, photography and lifestyle

ZFS във FreeBSD 8.0

Едно от многото нови неща във FreeBSD 8.0 е поддръжката на ZFS. Друго такова е USB подсистемата в ядрото, тя е пренаписана с цел по-голяма гъвкавост. Аз изпробвах и двете, като минах един 500Gb USB хард диск на ZFS. Идеята на този диск е да бъде непрекъснато с мен, за да не си изгубя данните, ако решат да ми ограбват апартамента отново. Данните на него трябва да са криптирани, за защита от евентуална кражба на самия диск. При включване на диска в компютъра виждаме следното:

ugen2.2: <JMicron> at usbus2                                                                                                                 
umass0: <MSC Bulk-Only Transfer> on usbus2                                                                                                   
umass0:  SCSI over Bulk-Only; quirks = 0x0000                                                                                                
umass0:0:0:-1: Attached to scbus0
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <StoreJet Transcend > Fixed Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: 476940MB (976773168 512 byte sectors: 255H 63S/T 60801C)

Хубавото на новата USB система е, че ugen драйвера не пречи на останалите драйвери, не е необходимо да се прекомпилира ядрото за някои глупави принтери например. В случая диска излиза, като da0. Криптография в самата ZFS все още не е имплементирана. По тази причина за криптографията на диска ще използваме GELI. Инициализираме и закачваме криптирания диск:

# kldload geom_eli
# geli init /dev/da0
# geli attach /dev/da0

За разлика от повечето други файлови системи, в ZFS не работи просто върху някакъв дял от диска. За да си направим ZFS файлова система, трябва да имаме т.нар. zpool. Той представлява някакво множество от устройства, върху които искаме да разположим нашата файлова система. В нашия случай за zpool използваме единствено целия криптиран диск da0.eli. По принцип за zpool можем да използваме различни дялове от дискове, цели дискове, файлове, и т.н. Например от там можем да конфигурираме RAID или да ползваме даден диск, като кеш на група от други дискове. Както и много други интересни неща. Повече информация има в man zpool. Нашия zpool има уникално име, в случая backup:

# kldload zfs
# zpool create backup /dev/da0.eli

По този начин зареждаме ZFS модула в ядрото, създаваме и закачваме в /backup новия zpool. Можем веднага да започнем да го ползваме, като файлова система, записвайки файловете директно на него. Ако го направим обаче, няма да можем да използваме предимствата на ZFS. За това ще създадем три отделни файлови системи на него, за отделните машини, на които ще правим backup:

# zfs create backup/eddie
# zfs create backup/marvin
# zfs create backup/bistromath

Файловите системи са създадени и закачени по местата си. Вече можем да работим с диска. Това са три различни, файлови системи. Можем да им задаваме различни опции и да ги закачваме на различни места. Те обаче използват един и същи zpool, дисковото им пространство е споделено. Те имат динамично нарастване и намаляване – когато записваме файлове в тях, те вземат пространство от общия zpool, когато трием – връщат пространството в общия zpool. Ако решим, че ни трябва още пространство можем просто да добавим ново устройство в този zpool. Понеже данните от едната машина са много, а подлежат на компресия – задаваме опцията за компресиране:

# zfs set compression=gzip backup/bistromath

По този начин всички записани данни, след задаване на опцията ще бъдат компресирани. Данните на другата машина са важни – за това искаме да записваме по две копия:

# zfs set copies=2 backup/marvin

Естествено, това не е RAID1, в случая имаме само един диск. Ако искаме RAID1 трябва да го организираме на ниво zpool. Правенето на такова копие може евентуално да ни спаси от лоши сектори по диска. За проверка на интегритета на данните се използват контролни суми, които са пуснати по подразбиране на всички файлови системи – checksum=on. Пълен списък с опциите има в man zfs. За проверка състоянието на backup можем да ползваме:

# zpool status
  pool: backup
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        backup      ONLINE       0     0     0
          da0.eli   ONLINE       0     0     0

errors: No known data errors

ZFS ни предлага най-различни и доста полезни опции, но за мен най-важното е решаването на проблема с фрагментацията на свободното дисково пространство. Поддръжката на ZFS в 8.0 се води за стабилна, но аз предпочитам да изчакам преди да започна да я ползвам навсякъде. Във версиите преди 8.0 се изискваше сериозен tuning на паметта на ядрото, за използване на ZFS. Това изискване вече го няма, но е препоръчително наличието на поне 2Gb RAM. Не успях да намеря достатъчно информация по темата за използането на GELI със ZFS. Може би този подход крие някакви проблеми?