Что то типа путевых записок, и размышлений об жизни, ну и о FreeBSD конечно, иногда какие нибудь новости и что то типа переводов.

12.01.2009

Как установить FreeBSD на ZFS

За последние время тема уже наверное успела стать небольшим баяном, как в англоязычной части так и в русскоязычной, и процесс не описал наверное уже только ленивый, но все одно напишу и я авось устанавливал, систему с загрузкой сразу с ZFS и к тому же на новую схему разделов GPT так что сделаю полное описание, вдруг кому поможет.
Исходные условия имеем десктоп с 2мя Тбайтными винчестерами, загрузочную флешку изготовленную по методу описанному парой постов раньше, ну и соответственно желание установить FreeBSD-СURRENT (для более ранних систем способ вряд ли применим, ну может быть для 7.1) на эту машину с загрузкой с ZFS раздела, итак приступим.
Загружаемся с флешки, благо сейчас это поддерживают наверное все материнские платы, для этого надо или включить данную опцию в биосе, часть становится доступной только если флешку уже была вставлена до начала загрузки, или нажать что нибудь вроде F8, и выбрать нужный девайс в загрузочном меню, так же зависит от биоса. Да и флешка тут не принципиальна можно грузится со старого диска или по PXE, или с СД с образа livefs, просто у меня СДпривода не было, а с сетью тоже как то не заладилось.
После, надеюсь, успешной загрузки сначала размечаем диски, я выбрал схему с разделом для системы в 27Гб, разделом своп 2Гб, и остальное под данные. Решение разделить систему и данные в принципе ни чем не обосновано, просто паранойя вдруг все рухнет, а так может выйдет хоть что то реанимировать :) Процесс разбивки с новым gpart прост до безобразия
# gpart create -s GPT da4
ad4 created
# gpart bootcode -b /boot/pmbr da4
da4 has bootcode
# gpart add -b 34 -s 128 -t freebsd-boot da4
da4p1 added
# gpart bootcode -p /boot/gptzfsboot -i 1 da4
# gpart add -b 128 -s 60000000 -t freebsd-zfs da4
da4p2 added
test# gpart add -b 60000162 -s 4000000 -t freebsd-swap da4
da4p3 added
# gpart add -b 64000162 -s 1889524973 -t freebsd-zfs da4
da4p4 added

Так же разбиваем второй диск, в моем случае это da6, как видно в примере на диски сразу же записывается загрузчик способный загрузить систему с ZFS раздела, записал на оба, так как реализую зеркало, но дергать диски пока не пробовал решил потренироваться для начала на виртуалке. После разбивки обоих дисков на разделы, у нас получится, что то похожее на это
> gpart show
=> 34 1953525101 ad4 GPT (932G)
34 128 1 freebsd-boot (64K)
162 60000000 2 freebsd-zfs (29G)
60000162 4000000 3 freebsd-swap (1.9G)
64000162 1889524973 4 freebsd-zfs (901G)

=> 34 1953525101 ad6 GPT (932G)
34 128 1 freebsd-boot (64K)
162 60000000 2 freebsd-zfs (29G)
60000162 4000000 3 freebsd-swap (1.9G)
64000162 1889524973 4 freebsd-zfs (901G)

=> 34 3905340 da0 GPT (1.9G)
34 128 1 freebsd-boot (64K)
162 2000000 2 freebsd-ufs (977M)
2000162 1905212 - free - (930M)

После этого создаем ZFS POOL'ы и соответственно разделы на них
# zpoll create system mirror ad4p2 ad6p2
# zpoll create data mirror ad4p4 ad6p4
# zfs create system/usr
....
# zfs create data/home/andrey

Да система должна быть собрана с опцией LOADER_ZFS_SUPPORT=yes в make.conf, если это не так то надо исправить это
# echo LOADER_ZFS_SUPPORT=yes >>/etc/make.conf
собираем loader и загрузочный код
# cd /usr/src/sys/boot
# make cleandir; make cleandir
# make obj depend all install

Так как процедура требует наличия исходных текстов, то об этом лучше позаботится заранее, я сделал это когда изготавливал флешку, и да не забудьте прописать эту опцию в уже установленной системе, а то есть шанс потренироваться в ее востановлении после первой же пересборки мира, и перезагрузки.
Потом правим файлы /boot/loader.conf, /etc/rc.conf и
/etc/fstab
> cat /boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:system"
> cat /etc/rc.conf
ifconfig_DEFAULT=DHCP
hostname=desk.local
zfs_enable="YES"
sshd_enable="YES"
> cat /etc/fstab
#/dev/da0p2 / ufs ro 1 1
/dev/ad4p3 none swap sw 0 0
/dev/ad6p3 none swap sw 0 0

еше советуют проверить существует ли файл boot/zfs/zpool.cache и если такового нет, то создать его следующим способом
# mkdir /boot/zfs
# zpool export you_pool && zpool import you_pool
# cp /boot/zfs/zpool.cache /you_pool/boot/zfs

Но например у меня все было нормально и так так что не проверял.
Ну вот в принципе и все копируем систему на новое место, и задаем точки монтирования для созданных ZFS разделов.
# tar cf - --one-file-system * | tar xpf - -C /mnt
# zfs set mountpoint=legacy system
# zfs set mountpoint=/usr system/usr
...
# zfs set mountpoint=/home/andrey data/home/andrey
# zpool set bootfs=system system

Ну вот вроде и все можно набрать команду reboot и компьютер мирно перезагрузится в уже новую систему с корневым разделом на ZFS, и можно будет увидеть примерно такой вывод команды df
> df -h
Filesystem Size Used Avail Capacity Mounted on
system 28G 486M 27G 2% /
devfs 1.0K 1.0K 0B 100% /dev
data 882G 0B 882G 0% /data
data/home 882G 0B 882G 0% /home
data/home/andrey 882G 128K 882G 0% /home/andrey
system/root 27G 5.3M 27G 0% /root
system/tmp 27G 0B 27G 0% /tmp
system/usr 28G 245M 27G 1% /usr
system/var 27G 128K 27G 0% /var

Ну и напоследок несколько не вредных рекомендаций, та корневая система с которой вы производите установку должна быть смонтирована в режиме rw, в некоторых источниках вместо команды # zfs set mountpoint=legacy you_pool рекомендуется #zfs set mountpoint=/ you_pool но последний вариант у меня приводил к куче ошибок и последующие команды работы с ZFS не функционировали, а выдавали ошибки.
Так же ещё несколько полезных команд, если у вас уже есть размеченные ZFS разделы то их можно подключить с помощью команды zpool import -a , смонтировать все имеющиеся разделы zfs mount -a, но вообще то врядли кому понадобится но вдруг, убить пул zpool destroy you_pool после этой операции, как я понял данные будет востановить если и возможно то крайне проблематично, так что действуйте обдуманно :)
Некоторые советуют сначала устанавливать систему на один диск, а потом подключать второй, но по моему это не совсем оптимально, ибо устанавливаем мы все равно с какого то носителя, так зачем лишние движения :)
Ну и в итого несколько доводов, за то а нафига оно вообще все нужно, жили как то и без этого. Во первых и наверное самое главное ZFS обещает нам высокую надежность и отсутствие необходимости применения fsck а на дисках доступных уже сейчас рядовому пользователю эта процедура может затянутся на ощутимое время. Во вторых практически не надо думать о размере разделов, ибо все место пула доступно всем разделам, можно ограничить квотами (с этим вроде были проблемы пока не уточнял), можно создавать шифрованные разделы, и менять свойства разделов на лету, вроде как плюсы пока закончились, из минусов сырость технологии, не полная реализация функций, как говорят требовательность к ресурсам, хотя на свежей системе, без нагрузки этого не видно, вот шапка top с машины с 1 ssh сессией
last pid: 1273; load averages: 0.00, 0.00, 0.00 up 0+01:05:51 02:14:25
23 processes: 1 running, 22 sleeping
CPU 0: 0.0% user, 0.0% nice, 0.0% system, 0.0% interrupt, 100% idle
CPU 1: 0.0% user, 0.0% nice, 0.0% system, 0.0% interrupt, 100% idle
Mem: 14M Active, 2340K Inact, 71M Wired, 120K Cache, 2371M Free
Swap: 3906M Total, 3906M Free

Пока и все, в ходе эксплуатации ещё чего придумается, ну если кому интересно спрашивайте, авось все равно планирую ещё потренироваться на виртуалке, ибо пока ставил понял что все не совсем тривиально, и процесс таит подводные камни.

UPD: По итогам обсуждения на форуме FreeBSD пришел к выводу что статья полностью актуальна только для FreeBSD-CURRENT, так как FreeBSD 7.х хотя и поддерживает gpt но похоже не поддерживает загрузку сразу с ZFS по крайней мере файла /boot/gptzfsboot там просто нет, хотя загрузчик для GPT схемы есть, тут напрашивается 2 решения либо просто создать загрузочный boot на ufs, либо попробовать выяснить в рассылки почему нет gptzfsboot для второй задачи, мой уровень английского слишком слаб :(

19 комментариев:

  1. > рекомендуется #zfs set mountpoint=/ you_pool но последний вариант у меня приводил к куче ошибок и последующие команды работы с ZFS не функционировали, а выдавали ошибки.

    ЕМНИП, ошибки можно игнорировать. Основная мысль заключается в том, что мы сохраняем в метаданных `mountpoint=/' для корневого pool'а. Ошибок при монтировании можно избежать, если отключить временно автомонтировании с помощью `zfs umount -a'. В таком случае ZFS не будет пытаться перемонтировать dataset'ы на новое место при смене mountpoint.

    > Некоторые советуют сначала устанавливать систему на один диск, а потом подключать второй, но по моему это не совсем оптимально, ибо устанавливаем мы все равно с какого то
    носителя, так зачем лишние движения :)

    А данные откуда берем? Данные, коими заполняем pool... С CD/DVD, с usb-flash? Или все-таки с одного из хардов, кой уйдет в mirror? Например, моя ситуация актуальная для перевода gmirror+ufs -> zfs-mirror без backup'ов и внешних устройств, такая типичная домашная файлопомойка (smb/nfs).

    > можно создавать шифрованные разделы,

    шифрованые dataset'ы — нет. pjd@ не захотел портировать zfs-crypto, ибо не mainstream. Так что юзаем пока zvol + geli.

    Из частоиспользуемых пока нет только acl. Появится только вместе с NFSv4-сервером (это NFS с нормальными lock'ами и id mapping'ом). Оно уже юзабельно, но пока продолжает вариться в perforce-котле. А extattr используется мало кем и в основном только в рамках MAC framework.

    ps1, я бы куски вывода команд в статье засунул в < pre>
    ps2, ты используешь ssh в виртуалке?! :O

    ОтветитьУдалить
  2. >Ошибок при монтировании можно избежать, если отключить временно автомонтировании с помощью `zfs umount -a'

    Хм такого совета пока не встречал, но #zfs set mountpoint=legacy you_pool тожже работает, и как я понял выполняет ту же функцию, или я не прав?

    >А данные откуда берем?

    Ну да с носителя с которого ставимся, в моем случае с загрузочной флешки, но да это у меня конечно новые диски были, при случае gmirror+ufs -> zfs-mirror без потери данных конечно так не выкрутится, но согласись что довольно экстремальный случай :)

    > шифрованые dataset'ы — нет.

    Ну да я про zvol + geli только пока и встречал, но если честно, а многим ли это надо, особенно пока все это в таком эксперементе.

    >ps1, я бы куски вывода команд в статье засунул в < pre>

    Да надо похоже подправить стандартный шаблон, а то он для листингов не очень подходит, где то помнится я у себя во френдленте видел советы, поищу на досуге

    > ps2, ты используешь ssh в виртуалке?! :O

    Это не виртуалка это живой десктоп, а пишу я последнее время все больше с ноута, прогресс блин :)

    ОтветитьУдалить
  3. > Хм такого совета пока не встречал, но #zfs set mountpoint=legacy you_pool тожже работает, и как я понял выполняет ту же функцию, или я не прав?

    А `mountpoint=legacy' разве работает с `zfs mount -a', коя проходит на стадии выполнения rc.d скриптов и соответствует zfs_enable=YES в rc.conf(5)? Или надо засорять fstab(5) zfs-related точками монтирования?

    Я способ с `mountpoint=/' использую еще со времен импорта ZFSv6 в апреле 2007 на ZFS-only машинах... неужели я прозевал более удобный способ? :blush:

    ОтветитьУдалить
  4. Ну вчера вот так систему собрал все вроде работает да и вот Ulf Lilleengen (lulf) тоже так описывает, правда с `zfs mount -a' не пробовал когда виртуалку подниму попробую, но думаю это будет не совсем скоро.

    ОтветитьУдалить
  5. спасибо большое за статью
    надеюсь, руки дойдут попробовать

    ОтветитьУдалить
  6. Ну пожалуй статья это слишком громко, так путевые заметки, а попробовать стоит, ну может не полностью переходить на ZFS но завести раздельчик и посмотреть что такое, тут еше вспомнил можно же делать снапшеты очень просто, на FreeBSD форуме даже скриптик видел, надо будет попробовать :)

    ОтветитьУдалить
  7. Не подскажите мне что может это значить?
    # gpart bootcode -p /boot/gptzfsboot -i 1 ad2
    gpart: /boot/gptzfsboot: No such file or directory


    У меня FreeBSD 7.2
    Правда я не загружаюсь с флешки, я просто мучаю пустой диск.
    в конфиги всё подобавлял ядро пересобрал и установил, вот это тоже делал

    собираем loader и загрузочный код
    # cd /usr/src/sys/boot
    # make cleandir; make cleandir
    # make obj depend all install

    ОтветитьУдалить
  8. 2 sEr

    Ваша ситуация описана в UPD, как и пути ее решения ;)
    Можно конечно ещё попробовать обновится до STABLE но надо посмотреть по CVS добавили ли там, такую возможность, то что добавили ZFSv13 новость была, может и загрузку добавили.

    ОтветитьУдалить
  9. привет!
    спасибо за то что поделился опытом. А то бьюсь который час, а маленькую мелочь с перекомпиляцией лоадера упустил!

    про производительность хотел сказать - надо МНОГО памяти!
    я себе собрал raidz1 из четырех 1.5Т винтов и на всем этом крутится торрент - тормозил прилично.
    нарастил памяти до 4Гб, отдал в zfs'ный кэш половину - сразу стало веселей жить.

    ОтветитьУдалить
  10. ну вероятно при малом объеме памяти или при других нестандартных вещах, можно что то покрутить в настройках и будет не так паршиво, а по умолчанию там все настроено на средние и большие файлы, и много памяти, но извините меня что такое сейчас даже 4Гб у меня в ноуте столько :)

    ОтветитьУдалить
  11. Привет!
    Сделал все как в статье, но при перезагрузки получаю:
    \
    can`t load 'kernel'
    OK ls
    open '/' failed: no such file of directory
    Что я мог сделать не так?
    FreeBSD 8.0 RELEASE

    ОтветитьУдалить
  12. Судя по всему либо не записался загрузчик, либо записался не туда, опция LOADER_ZFS_SUPPORT в 8ке вроде уже не актуально, уточнение было по моему в вики у лисяры, но хуже от нее стать не должно.
    В общем проверьте загрузчик и попробуйте записать его еще раз, так же проверьте не ошиблись ли где то вот в этом районе
    zfs_load="YES"
    vfs.root.mountfrom="zfs:system"
    и вроде все должно взлететь :)

    ОтветитьУдалить
  13. да загружчик записался, а вот раздел с ZFS не видит :(
    FreeBSD/i386 bootstrap loader, Revivsion 1.1
    (user@host? Sat Dec 12 12:41:58 EET 2009)
    can`t load 'kernel'

    ОтветитьУдалить
  14. так zfs_load="YES" не забыт?
    ну и дальше пытаться разобраться чего этой заразе надо, тут удаленно помочь очень сложно ;)
    Если лениво разбираться то можно попробовать переставить :)

    ОтветитьУдалить
  15. #more boot/loader.conf
    zfs_load="YES"
    vfs.root.mountfrom="zfs:data"

    ОтветитьУдалить
  16. загрузчик перезаписал
    #gpart bootcode -b boot/pmbr -p boot/gptzfsboot -i 1 ad0

    # gpart show
    => 34 8388541 ad0 GPT (4.0G)
    34 128 1 freebsd-boot (64K)
    162 1024000 2 freebsd-swap (500M)
    1024162 7364413 3 freebsd-zfs (3.5G)

    ОтветитьУдалить
  17. Этот комментарий был удален автором.

    ОтветитьУдалить
  18. 1)
    >># gpart add -b 34 -s 128 -t freebsd-boot da4
    А почему именно 34 ? ;) Довольно не простой вопрос ))) Требует чтения спецификации GPT

    2) Дополните, что -b и -p указывают на аналоги /boot/boot0 , /boot/boot1 . В мане man gpart в секции BOOTSTRAPPING любопытная инфа по поводу этих двух ключей. Просто люди, как правило, не совсем понимают процесс загрузки машины в условиях GPT

    ОтветитьУдалить
  19. 1) на сколько мне не изменяет склероз просто не затирать MBR, хотя дело давно было может там и ещё чего есть :) Про GPT я помнится в тот период не мало для себя открыл, хотя до чтения спеков не докатился

    2) Да люди вообще частенько много чего не понимают.

    Блин надо бы уже переписать это стыдобищу, ведь время то бежит, а сюда всё так же стабильно заглядывают

    ОтветитьУдалить

Здесь можно записать свои мысли о посте :)
Если ваш ответ не появился сразу, не паникуйте, тут работает спамоловка, и вероятно вы угодили в неё, так как были анонимом или в вашем посте ссылка, ну или вас не любит google.
Я проснусь и одобрю комент ;)