КАКДА: Zfs root on FreeBSD

November 1, 2007

Въведение

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)

Advertisements

11 Responses to “КАКДА: Zfs root on FreeBSD”

  1. sasli Says:

    Здравей!
    Не знам дали е тук мястото да задам глупавия си въпрос, но не знам къде да търся/питам вече и…ето го:
    “Като сложа FreeBSD ще мога ли boot-вам Уиндолса?(не, че изгарям от желание, но ми се налага да го ползвам колкото и да не искам)” според мен би трябвало да може, но не знам за първи път ще се докосна до FreeBSD, а това за zfs е супер добре написано.
    Благодаря предварително!

  2. luchko Says:

    Абе не му е тук мястото – това е личен блог, а не дискусионен форум ;-) Но нищо де…
    Да, може да правиш dualboot система FreeBSD/Windows. Но трябва да използваш Grub вместо зареждача на FreeBSD. Малко по-сложно е от dualboot с Linux.

    http://www.ubergeek.co.uk/howtos/grub-freebsd-windowsxp.html

  3. sasli Says:

    Ок, благодаря много и се извинявам…

  4. luchko Says:

    Няма проблеми ;-)

  5. atan Says:

    А бе и стандартния boot loader на FreeBSD можеш да ползваш. Малко грозно при избора (F1, F2…) ама върши работа:-) При самата инсталация, след като направиш разделянето на диска и видиш след това кое къде се монтира, задаваш дяла на М$, и _не_ задаваш boot флаг на никой дял. Не е необходим GRUB:-)

  6. hq Says:

    Абе то хубаво е указано кое къде и аз пиша без да си имам представа кое какво прави,изпълних всичко от-до както трябва и накрая не буутва.Според мен е защото ето тук:
    /dev/ad1s1a /bootdir ufs 1 1

    не си написал какви параметри да има при маунтване rw,ro… и стартирането ми спира.

  7. hq Says:

    Успях (от 3-тото преинсталиране) да подкарам системата със ZFS! сложих rw параметър на
    /dev/ad1s1a /bootdir
    не знам дали не е по-правилно “ro”,моля автора да сподели мнение.
    Благодаря за лесното упътване!

  8. luchko Says:

    Щом работи значи не си сбъркал, rw звучи логично ;-)
    Все пак се консултирай с по-съвременна документация (тая статия е на над 2 години както виждаш), някои неща все са се променили, а аз не съм в крачка (не ползвам FreeBSD от година и половина някъде)

  9. hq Says:

    ее как ще зарежеш всепризнатата в света №2 по стабилност система …. :)
    Аз просто реших да приключа с ос експериментите върху домашния сървър и да го закова на FreeBSD 8 и помеждудругото да го снабдя и с един ZFS,защото се чува че били поправени много дупки именно в това отношение.
    Иначе бих те помолил ако може да си разменим по едни координати,за един въпрос че не мога да се справя …
    Става въпрос за Xorg и вградена видеокарта SIS,за която няма драйвер,а на FreeBSD 7.2 си вървеше с Xfce.
    Ако можеш да помогнеш ще съм ти много благодарен! Благодаря!

    • luchko Says:

      Координатите ми са в лявата част на страницата ;-) Не знам дали ще мога да помогна, опиши проблема и ще видим.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: