= bubbalog =Дневникът на моето стадо

ZFS файлова система на FreeBSD 8

Tuesday 03.11.2009 00:03 EEST · Публикувано от в = FreeBSD =, = Мът'рял от нетя =

Оригинали: https://www.ish.com.au/solutions/articles/freebsdzfs

http://luchko.net/2007/11/01/%D0%9A%D0%90%D0%9A%D0%94%D0%90-zfs-root-on-freebsd

От няколко дена яко се запалих да се тествам с това чудо на файловите ситеми… Незнам до колко е наистина вече сигурно да се използва, при FreeBSD 8 прочетох че били премахнали вече етикета “експериментална” и спокойно можела да се използва. Следващата статия си е мой превод на горния линк, като частично в голямата си част е тествана от мен и всичко работи чудесно. Мисля да я поработя и тествам още малко и да я мятам за по сериозно тестване в реални условия на сървъра… па да видим колко е добра. Началото обаче е много обещаващо.

Превода на първия линк си е лично мой, а от втория съм копирал само някои неща, които ми се сториха интересни… Извинявам се ако има неточности.

Какво всъщност е ZFS?

Zfs е последната дума, или по-скоро последният писък във файловите системи. Представя една изцяло нова концепция за това как трябва да работи една такава система, какви възможности трябва да има, какво и как трябва да прави. При нея няма дялове, а просто един “басейн” (pool) в който цопвате колкото си искате файлови системи, които де факто използват неограничено от дялове пространство. Например, да речем, че имате 80 GB твърд диск. Използвате UFS или друга класическа файлова система(Ext3, Resierfs, XFS, няма значение). Инсталирате си някаква система и в началото разпределяте: 1 дял от 1 GB за SWAP, 1 дял от 10 GB за / и един дял от 69 GB за /home. Обаче, след 1 година мястото на / не ви достига поради някаква си причина. Какво правим? Слагаме друг твърд диск, занимаваме се с излишни глупости, имаме излишно главоболие и, разбира се – губим ценно време. А ако бяхме сложили Zfs този проблем въобще нямаше да съществува, защото / щеше да си “вземе” колкото му трябва от /home дяла и дори нямаше да забележим. Е, стига да не ни свърши дисковото пространство като цяло, разбира се.

Zfs привлече вниманието на всички след като Sun направиха анонса, че ще я публикуват като част от OpenSolaris. Някои казват, че заедно с Dtrace това са двете най-хубави неща, които Sun някога са пускали на пазара. За съжаление на Linux потребителите обаче, файловата система (както и всичко, което е под шапката на OpenSolaris) е лицензирана под CDDL. А CDDL е несъвместим с GPL и съответно кода не може да влезе в Linux ядрото.

За мое щастие обаче, този проблем не съществува при BSD лицензираните ядра като това на FreeBSD. И за да съм още по-щастлив Павел Давидек (Pawel Dawidek) направи хубав порт, който в момента е във FreeBSD_7 като експериментална възможност на системата. Все още има няколко остри ръба, но в моя случай само един има съществено значение: FreeBSD не може да стартира директно от Zfs pool (както и от огледален pool и RAIDZ). Boot loader-а  трябва да се нагоди за тази цел и в момента се работи по проблема. Все пак обаче е възможно да използвате Zfs като root фйалова система с един малък, хитър хак, който ще опиша в тази статия.

Внимание! Zfs е нова файлова система и като такава изисква повече ресурси, особено за някои от по-атрактивните си възможности (компресия, снапшоти). Абсолютно непрепоръчително е да инсталирате Zfs на машина с по-малко от 1 GB RAM.

ZFS

ZFS е една прекрасна нова файлова система разработена от Sun и вече преработена за работа на FreeBSD. Тя е многообещаваща със своята семплост и някои големи подобрения, които са:

  • повишена надеждност, множество копие на информацията и “самолекуващ” се RAID
  • елиминиране на досадното “Ами да не направя ли дози дял малко по-голям?!” . Дяловете вече могат да се променят динамично по всяко време и практически са ограничени само от големината на хардуера
  • вградена компресия и криптиране
  • вградено NFS споделяне
  • прости за работа инструменти за създаване на pools, дялове и много други
  • snapshots и rollbacks за бекъп

Повече за командите за работа може да прочетете ето тук

Инсталиране на FreeBSD и конфигурурането му за работа със ZFS

1. Инсталация на FreeBSD

Тъй като ZFS е все още в наистина ранен стадий на своето развитие, FreeBSD все още не я подържа като самостоятелна система. Ето защо е нужно да се приложат някои хватки за да я накараме да работи. Също така системата не може да зареди директно от ZFS дял. Как да заработи всичко обаче ще обясним малко по-натам.

  • Заредете системата от CD
  • Изберете страна и локализация
  • Отидете на “Custom install”
  • Направете с А опцията на “fdisk” един слайс на целия диск
  • разпределете с “Label” както следва:
  • ad0s1a: 1024Mb UFS2 /
    ad0s1b: swap
    ad0s1d: rest of disk

    За да направите D часта я създайте както требва и после с M опцията изтрийте маунтпойнта. Това ще гарантира, че остатъка от диска няма да се маунтне или създаде като файлова система

  • От дистрибуциите изберете “Minimal”
  • Изберете медията за инсталиране, обикновенно CD/DVD

Следва инсталирането на самата система, която ще се инсталира в минимален вариант на създаденя преди едногигабайтов / слайс.

2. Създаване на ZFS pool

След като инсталацията мине и системата се презареди от стартовото меню изберете опция “4 – Single user mode” и натиснете когато ви попита за шел /bin/sh shell.

Маунтнете вече съществуващия /слайс:

# mount -w /

Следва създаване на ZFS pool върху D часта на диска, която създадохме при инсталацията. За име на pool-а може да се използва каквото си име искате, в случая от тук натам аз го наричам bubba

# zpool create bubba /dev/ad0s1d

Създайте няколко допълнителни дялове

# zfs create bubba/root
# zfs create bubba/usr
# zfs create bubba/var
# zfs create bubba/tmp

и направете маунтпойнтове за тях

# zfs set mountpoint=/bubba bubba/root
# zfs set mountpoint=/bubba/usr bubba/usr
# zfs set mountpoint=/bubba/var bubba/var
# zfs set mountpoint=/bubba/tmp bubba/tmp

Време е да погледнем какво сме свършили до тук

#df -h
#zfs list

Редактирайте /etc/rc.conf и настройте системата да зарежда ZFS

# echo ‘zfs_enable=”YES”‘ >> /etc/rc.conf

Седва копирането на UFS зареждащия слайс в ZFS маунтпойнта. така ще имаме работещо копие на системата под ZFS

# find -x / | cpio -pmd /bubba

Ако на този етап се получи някоя грешка може просто да я игнорирате.

3. Решение на проблема със зареждането от ZFS

Проблема който все още остава е, че FreeBSD все още не може да зареди директно от ZFS, защото реално bootloader-а реално нищо не знае за ZFS. Малкия трик е да сложим ядрото в /boot директорията, която е на UFS слайса. По този начин ще заредиме системата от точка, която ZFS може да се маунтне и да продължи процеса на зареждане (?!).

За начало премахнете /bubba/boot който копирахте от UFS слайса преди малко

# rm -rf /bubba/boot

Следващата стъпка е да направим дирктория в която да се маунтва UFS слайса. Това ще бъде полесно на по-късен етап, когато ще е нужно да се опресни съдържанието на този слайс на работеща система. Съща така трябва да сме сигурни, че когато ZFS зарежда ще вижда UFS буутдиректорията.

# mkdir /bubba/bootdir
# cd /bubba
# ln -s bootdir/boot boot

след което трябва да кажем на лоудъра на UFS слайса да зарежда и буутва от съдържанието на ZFS дяла

# echo ‘zfs_load=”YES”‘ >> /boot/loader.conf
# echo ‘vfs.root.mountfrom=”zfs:bubba/root”‘ >> /boot/loader.conf

Редактирайте /bubba/etc/fstab файла, така че UFS слайса да се маунтва на правилното за ZFS място когато зарежда

/dev/ad0s1a /bootdir ufs rw 1 1

Когато след минута ще се наложи да рестартираме системата няма да ни се иска ZFS да маунтне /var /usr /tmp и / в корена, а не както е сега в /bubba. Затова е необходино да се настроят реалните маунтпойнтове:

# zfs set mountpoint=/tmp bubba/tmp
# zfs set mountpoint=/usr
bubba
/usr
# zfs set mountpoint=/var
bubba
/var

Настройте корена за зареждане на “legacy” тъй като не искаме ZFS да се зарежда автоматично, защото тя вече е маунтната от лоудъра

# cd /
# zfs set mountpoint=legacy
bubba
/root

И това е края на целия процес. Рестартирайте системата и може да проверите всичко което сте направили до момента.

# df -h
Filesystem Size Used Avail Capacity Mounted on
bubba/root 282G 454M 281G 0% /
devfs
1.0K 1.0K 0B 100% /dev
/dev/ad0s1a 496M 317M 139M 69% /bootdir
bubba/tmp 281G 1.1M 281G 0% /tmp
bubba/usr 287G 5.7G 281G 2% /usr
bubba/var 281G 76M 281G 0% /var
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
bubba 6.27G 281G 454M none
bubba/root 16.2M 51.3G 16.2M legacy
bubba/tmp 1.10M 281G 1.10M /tmp
bubba/usr 5.75G 281G 5.75G /usr
bubba/var 75.5M 281G 75.5M /var

Всичко до тук е прекрасно. Какво ставаобаче, когато мястото започне да свършва? Много просто, загасете мащината, закачете новия диск и го добавете само с една команда:

# zpool add bubba /dev/ad3

4. Създаване на мирър

Ето още нещо много интересно. Представете си, че на диска имате много важна информация която нямате право да губите. За целта просто трябва да прибавим мирър, огледално копие на файловата система под ZFS. В някои аспекти това решение е по-добро решение дори и от хардуерния RAID, тъй като ZFS може да наблюдава чексумите на дисковете и автоматично да разбере кой от двата диска е с некоректна блок информация, и автоматично да използва другия диск ако е нужно.

  • Закачете новия хард диск и пуснете машината
  • Логнете се като root
  • Пуснете sysinstall и отидете на Custom Install
  • С Fdisk и А опцията направете един дял на целия диск и натиснете “w” за запис на промените
  • С Label разпределете диска по същия начин както е първия диск
    ad1s1a: 1024Mb / (С “M” премахмете маунтпойнта като предния път)(?!)
    ad1s1b: swap
    ad1s1d: остатък за ZFS
  • Излезте от sysinstall

Може да проверите какво имаме сега на машината…

#zpool status

И да прибавите втория диск като мирър (както видяхте, втория диск е ad1)

# zpool attach bubba ad0s1d ad1s1d
# zpool status

което ще покаже двата диска в миръра

pool: bubba
state: ONLINE
scrub: none requested

config:
NAME STATE READ WRITE CKSUM
bubba
ONLINE 0 0 0
mirror ONLINE 0 0 0
ad4s1d ONLINE 0 0 0
ad6s1d ONLINE 0 0 0

errors: No known data errors

До тук добре, вече имаме огледално копие а първия диск, но ако го загубим ще ни трябва съдържанието на UFS слайса да се копира на вториа диск в случай че рестартираме

# newfs /dev/ad1s1a
# mkdir /mnt/bootdir
# mount /dev/ad1s1a /mnt/bootdir
# find -x /bootdir | cpio -pmd /mnt

Това ни дава още една готова за употреба система на втория диск в случай, че първия наистина се скапе тотално, като на втория са също така и всички нужни ни zfs инстрменти.

Също така ни е необходимо да спрем fsck да се стартира при зареждане на системата, за да може ако първия диск пропадне (ad0) системата да продължи да зарежда без проблеми. Това озачава, че процеса на зареждане проверява и ако не намери първия диск (ad0), BIOS-а ще провери за MBR на втория диск (ad1) и ще зареди всички ZFS модули и сисемата ще зареди всичките си модули нормално. За да може това да сработи винаги вие ТРЯБВА ДА СТЕ СИГУРНИ, че /bootdir/zfs/zpool.cache файла е еднакъв на двата хард диска!

Редактирайте /etc/fstab така че UFS слайса да е аунтнат на правилното място коато ZFS се зареди.

/dev/ad0s1a /bootdir ufs rw 1 0
/dev/ad1s1a /mnt/bootdir ufs rw 1 0

Нуждата от /bootdir се появява само когато правите промени по ZFS pool-овете

5. Някои подобрения на /boot/loader.conf

Въпреки, че при FreeBSD 8, експерименталния статут на ZFS е премахнат, все още има някой малки неща за доизглаждане. Всъщност се оказва доста лесно ZFS да се окаже без памет и да срине ядрото. Имено за това се появява нуждата от поставянето на следните редове в /boot/loader.conf (ако сте изградили мирър се убедете, че това трябва да се редактира и /mnt/bootdir/boot/loader.conf)

vm.kmem_size_max=“512M”
vm.kmem_size=“512M”
vfs.zfs.zil_disable=1

Добре е kmem размера да е по-голям, но ако го направите прекалено голям (някъде около 1500Мб). Настройката на памета за ZFS на този етап е все още по скоро изкуство, отколкото някаква точна наука, но тук има и няколко интересни препоръки.

6. Зареждане при инзънредни обстоятелства

(Може да се окаже нужно, ако настроите по предната точка, рестартирате и зареждането забие)

Ако по няккаква причина ZFS откаже да се зареди, винаги може да заредим системата с оригиналната минимална инсталаия която направихе в самото начало. За да стане това ето нужните стъпки:

  • Пуснете машинта да зарежда
  • От стартовото меню изберете “6 – Escape to Loader Prompt”
  • Забранете зареждането на ZFS и деактивирайте zfs модула
    > unset vfs.root.mountfrom
    > disable-module zfs
  • Забранете използването на kmem настрокйката
    > unset vm.kmem_size
    > unset vm.kmem_size_max
  • Настройте да зареди в “Single user mode” и заредете системата
    > set boot_single
    > boot

след което редактирайте ако е необходимо /boot/loader.conf

При проверка

# df -h
# zpool list

ще ви се каже, че нямате никакви ZFS устройства в pool-а. Няма за какво да се притеснявате, защото те могат да се импортнат!

#zpool import -d /boot/zfs

Това ще зареди zpool информацията, така че библиотеките да намерят това което им е нужно (?!), след което е нузно да нашя pool узползвайки алтернативен корен на системата

#zpool import -f -R /bubba buba

и да прверим пал дали всичко вече работи

# df -h
# zpool list

7. Някои полезни команди

Показване на наличните pool-ове/ресурси

#zfs list

Показване на статуса на диск/pool

#zfs status

Смяна на моаунтпойнта на създадените ресурси

#zfs set mountpoint=/<mountpoint> <pool resources>

Ограничаване на използвания ресурс / логическо ограничение в размера

# zfs set quota=10g testpool/testfs/dir1
# zfs set reservation=20g testpool/testfs/dir2

Избор/смяна на ядрото (в режим на boot loader)

> unload kernel
> boot /boot/kernel.old/kernel

* * * * *

Някои полезни линкове:

FreeBSD ZFS progress
FreeBSD quickstart guide
FreeBSD ZFS on root
Zfs
Zfs commited to FreeBSD
Zfs страницата на FreeBSD Wiki
Администриране на Zfs (PDF) Внимание! Има разлики в администрирането на Zfs върху Solaris и върху FreeBSD!
Zfs man page (FreeBSD)
Zpool man page (FreeBSD)

2 коментара за “ZFS файлова система на FreeBSD 8”

  1. Даниел says:

    Като оставим всичко друго настрана, тъй кати ти само си го превел, ZFS си работи достатъчно добре и на FreeBSD 7.2.
    Кода е достатъчно добре синхронизиран с FreeBSD 8.0.

    На компютър с amd64 и поне 2GB памет няма никакви грижи.

  2. Преди само бях чувал за това, но понеже все казваха, че е нещо експеримянтално, не си давах зор да седна и още тогава да го пробвам.
    А иначе, статията не е просто само голо преведена. Паралелно е четено, правено и резултата записван в едно .тхт, което после заедно с превода е оформен в този си вид ;), затова и заглавието е за 8.0

Остави коментар

Писането на кирилица е задължително!
Коментари, които не са на кирилица ще бъдат изтрити без предупреждение.
Всеки коментари съдържащи 1 или повече линка, ще бъдат публикувани след одобрение.