от Лъчезар Петков(2-11-2007)

рейтинг (17)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Малко парадоксално, че публикувам статия, която няма нищо общо с Linux в linux-bg.org, но знам че и *BSD потребители посещават портала.

Автор: Лъчезар П. Петков

Оригинал: тук

Въведение

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.

Стъпка 1.

Най-лесно е от диск. Необходим ви е инсталационен таъкъв на FreeBSD 7. В момента на писане последната версия от бранш 7 е BETA1 и върши работа.

Зареждате диска и избирате Custom Install. От там създавате само един slice за целия диск, в моя случай ad1. След това от менюто Label правите 1 дял от 512 (UFS) MB за / (ad1s1a) и още един за останалото място от твърдия диск, който няма файлова система и няма точка на монтиране (ad1s1d). Това става по следния начин: избирате му някаква точка на монтиране като ви пита инсталатора, например /blah, след това избирате дяла, натискате бутончето M и променяте точката на монтиране на… никаква. :-)

По желание може да направите още един дял за swap с размери според вашата RAM памет (ad1s1b при мен). Продължаваме с меню Distributions и изибирате минималната система. Трябва да я съберем в рамките на тези 512 MB, все пак. И накрая инсталираме. Всичко би трябвало да мине гладко и ако е така - рестартираме машината.

Стъпка 2.

FreeBSD се стартира и при prompt-а в началото избираме Single User Mode. След като се зареди натискаме Enter, за да ни пусне в sh и пишем:

$_ mount -w /

И сега започва забавната част. Правим басейнчето, в което ще цопат монтираните файлови системи. Т.е. нашият pool. В този пример той ще заема целия дял ad1s1d, който направихме преди малко.

$_ zpool create lilly /dev/ad1s1d

Думичката “lilly” тук е просто пример и всъщност е името на pool-а. Можете да си изберете друго, каквото си поискате име. Сега да направим няколко точки на монтиране.

$_ zfs create lilly/usr

$_ zfs create lilly/usr/ports

$_ zfs create lilly/usr/ports/distfiles

$_ zfs create lilly/var

$_ zfs create lilly/tmp

$_ zfs create lilly/home

$_ zfs create lilly/home/username

Сега да видим какво сме направили:
$_ df -h

$_ zfs list

Ммм… :-)

Сръчкваме rc.conf да включва Zfs при стартиране:

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

И сега, както сте забелязали навярно си имаме директория с името на вашият pool в /. Така де, /lilly в моя случай. Обаче, басейнчето горкото е празно. Да го напълним със съдържанието от UFS slice-a, който направихме. По този начин ще имаме работеща система на Zfs дяла.

$_ find -x / | cpio -pmd /lilly

Тъй. Система имаме. Но уви - не можем да я буутнем…

Стъпка 3.

Проблемът, както вече споменах е, че зареждача (ех, че красива дума) не знае нищо за Zfs и не може да буутва от нея. Съответно, ще трябва да буутва от UFS дялчето, което след това директно ни прехвърля в Zfs, като нашият pool вече се монтира като root, а не като самостоятелна директория както сега. Разбира се. Самият UFS дял пък го монтираме на едно скришно място, но за това след малко…

Първо затриваме /boot директорията в /lilly която току що копирахме от UFS дяла:

$_ rm -rf /lilly/boot

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

$_ mkdir /lilly/bootdir

$_ cd /lilly

$_ ln -s bootdir/boot boot

И трябва да кажем на lodaer.conf (който е на UFS дяла) да зарежда Zfs и коя файлова система да използва за / :

$_ echo ‘zfs_load=”YES”‘ >> /boot/loader.conf $_ echo ‘vfs.root.mountfrom=”zfs:lilly”‘ >> /boot/loader.conf

Друга добра идея е да направите файл /bootdir/etc/fstab със следния ред:

lilly / zfs rw 0 0

Сега редактираме един друг fstab, който ще е “официалният”, демек онзи на Zfs файловата система. В този случай /lilly/etc/fstab Пишем следното:

/dev/ad1s1a /bootdir ufs 1 1

Това ще монтира UFS дяла в /bootdir.

Почти приключихме. Създадените вече файлови системи ги помните, нали? Нека им направим точки на монтиране:

$_ zfs set mountpoint=/usr lilly/usr

$_ zfs set mountpoint=/usr lilly/usr/ports

$_ zfs set mountpoint=/usr lilly/usr/ports/distfiles

$_ zfs set mountpoint=/tmp lilly/tmp

$_ zfs set mountpoint=/var lilly/var

$_ zfs set mountpoint=/home lilly/home

$_ zfs set mountpoint=/home/username lilly/home/username

И накрая казваме на zfs да не се монтира самичко, а че ние го монтираме (т.е. не ние, ами loader-a)

$_ zfs set mountpoint=legacy lilly
Стъпка 4.

Рестартираме и сме щастливи!

Още благинки

Може да сте се учудили защо направих отделни системи за /usr/ports и /usr/ports/distfiles. Защото /usr/pors включва само текстови файлове и спокойно можем да включим компресия там, за да спестим място:

$_ zfs set compression=gzip lilly/usr/ports

Това е прекрасно, но няма за какво да компресираме distfiles/ при условие, че файловете там са архиви (=> вече са компресирани):

$_ zfs set compression=off lilly/usr/ports/distfiles

Аз, както и много други имам повече от един твърд диск. Добавянето на друг твърд диск към същия pool става само с една (една!!!) команда на работеща в момента система. В моя случай това е диска ad3:

$_ zpool add lilly /dev/ad3

И пльооос, още 250 GB в басейнчето :-)

Заключение

Това със сигурност е най-невероятната файлова система на всички времена. Струва си да я използвате, независимо дали сте системен админ, администриращ 150 машини или просто краен потребител, като мен. И все пак имайте предвид, че съществуването й във FreeBSD все още е нещо експериментално и че си иска мощна машина.

Относно Лили

Intel Core 2 Duo 3.0 Ghz CPU

2 GB RAM

150 GB HDD

250 GB HDD

Библиография

Zfs

Zfs commited to FreeBSD

Zfs страницата на FreeBSD Wiki

Администриране на Zfs (PDF) Внимание! Има разлики в администрирането на Zfs върху Solaris и върху FreeBSD!

Zfs man page (FreeBSD)

Zpool man page (FreeBSD)



<< Роля и значение на GNU Affero GPL | SAMBA PDC - инсталация, настройка, управление - Част 2 >>