понедельник, 28 мая 2012 г.

Установка FreeBSD 9 c ZFS

Ставим freebsd с корнем на zfs

Что 8, что 9 инсталлер штатно не умеет zfs, поэтому надо на обоих грузиться в консоль. Отличия в том, что в 8 это был выкидыш fixit, который был крайне, дико убог, а в 9 появился нормальный shell, который и листать историю умеет, и ls есть, и вообще поведение уже человеческое.

Под 8 версию уже был мануал, теперь сделаем под 9.

Итак, сначала надо удалить все старые разделы. Для 9 сата диск будет ada0

У меня была пачка разделов вида ada0s1{a-g}
gpart delete -i 1 ada0s1
gpart delete -i 2 ada0s1
...
gpart delete -i 1 ada0
gpart destroy ada0

Очищено.
Теперь надо создать разметку (gpt)
gpart create -s GPT ada0

Создадим boot-раздел со смещением в 1Мб (выравнивание на 1Мб полезно, особенно когда диски с 4к секторами), размером 128кб
gpart add -b 1M -s 128k -t freebsd-boot ada0

Теперь файл подкачки. Есть вариант размещения в zfs-пуле, но при падении мы не сможем записать дамп памяти. С другой стороны, нам не придётся тогда зеркалировать своп на случай отвала одного из дисков, поскольку это будет обеспечивать сам zfs. В любом случае, проще сейчас выделить несколько Гб под своп, и при необходимости подключить его, чем возиться потом со смещением рабочего пула и выделением места.
gpart add -s 4G -t freebsd-swap ada0

Потом сам пул.
gpart add -t freebsd-zfs ada0

Осталось поставить загрузчик (см заметку 1)
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

Первая часть закончена. Смотрим gpart show ada0, всё ли в порядке, и переходим к разметке пула.

Если ставим систему на 1 диск, а потом хотим сделать зеркало на 2 - это можно сделать (см первую заметку), но для raid-z без извратов так не сделать, поэтому ставить надо будет сразу на полный набор дисков.

Загрузим zfs
kldload zfs

Создадим сам пул.
zpool create -O atime=off -m /mnt/zfs pool ada0p3

Тут можно получить
cannot mount '/mnt/zfs': failed to create mountpoint
Это потому, что мы загрузились с диска, который примонтирован в RO, так что надо или перемонтировать на запись, что глупо, или использовать место, доступное для записи, например tmp. У меня этот раздел всего 20Мб, но много и не надо - пустой каталог много не занимает, mountpoint и подавно. Но и повторно запустить команду уже не даст - пул создан, просто не примонтирован. Впрочем, примонтировать пул целиком мы уже не сможем - параметр altroot можно задать только при создании. Если сильно надо - надо удалить старый пул (zpool destroy -f pool) и пересоздать. Но сильно это не нужно - просто вместо полных путей надо будет использовать через имя пула (pool/tmp) и потом руками примонтировать созданные каталоги на свои места.

Делаем пул загрузочным
zpool set bootfs=pool pool

!!! Надо переместить хранилище zpool.cache, иначе после перезагрузки у нас пул будет не найден!!!
zpool export pool
zpool import -o cachefile=/tmp/zpool.cache pool
Как мы уже столкнулись, вся корневая ФС у нас в RO, поэтому системе некуда сохранять информацию о нашем пуле и мы не сможем её потом скопировать на наш диск.

Дальше создаем структуру пула, см заметку 1 и линки ниже.
(...)

А теперь сложный момент. Если мы грузились с полного образа -- у нас на диске есть все нужные файлы (в 8 файлы были в /dist, в 9 они переехали в /usr/freebsd-dist), но что если это была версия bootonly? тут будет ещё шаг - надо поднять сеть и выкачать нужные файлы или воспользоваться sysinstall.
Сделаем через выкачать нужное (gentoo-way)
cd /tmp/zfs/tmp
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/base.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/kernel.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/src.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/doc.txz"
fetch "http://ftp6.ru.freebsd.org/pub/FreeBSD/releases/amd64/9.0-RELEASE/lib32.txz" (только для amd64)
Формат файлов xz, поэтому для tar ключи будут такие:
tar --unlink -xpJf file -C path
x - extract
p - restore Permissions
J - xz
f - файл для распаковки
--unlink
-C - change to (dir) - куда распаковать

Если у нас полный дистр был - просто делаем
cd /usr/freebsd-dist

Готовимся к установке.

Распаковываем вручную или скриптом
export DESTDIR=/tmp/zfs
for file in base.txz doc.txz kernel.txz src.txz lib32.txz; do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}) ; done

Если вводить скрипт руками - советую использовать таб, в 9 он работает как надо, и является проверкой, все ли файлы у нас на месте. У меня случайно был пропущен kernel, что было легко обнаружено.

Почему тут нет портов -- поскольку я обновляю через portsnap, первый раз надо сделать extract, так что в данном случае это только зря 1 пакет выкачивать.

Скопируем описание нашего пула в новое место.
cp /tmp/zpool.cache /tmp/zfs/boot/zfs/

Настроим систему.
chroot /tmp/zfs /bin/csh

cat << EOF > /etc/rc.conf
zfs_enable="YES"

hostname="host"
ifconfig_re0="DHCP"

sshd_enable="YES"
EOF

cat << EOF >> /boot/loader.conf
zfs_load="YES"
vfs.root.mountfrom="zfs:pool"
EOF

Если памяти мало, туда же вписываем параметры для zfs

В /etc/fstab:
/dev/ada0p2 none swap sw 0 0
Или можно через метку, если определяли.

Настроим время
tzsetup

!!! Если мы планируем потом попасть в эту систему по ssh - необходимо сделать 2 вещи:
pw useradd remoteuser -m -G wheel
passwd

Добавить пользователя и установить руту пароль. По умолчанию под рутом по сети вход запрещён, su к руту без пароля - плохой знак (хотя и пропустит). Если будем работать только локально, этот шаг пока можно пропустить.

Последний этап -- подготовка к перезагрузке.
exit

zfs unmount -af
cd /
zfs set mountpoint=legacy pool
zfs set mountpoint=/usr pool/usr
zfs set quota=4G pool/tmp
zfs set mountpoint=/tmp pool/tmp
zfs set mountpoint=/var pool/var

!!! Теперь надо сделать zfs list и проверить, что в mountpoint больше нет разделов в legacy, иначе после ребута они не будут примонтированы! Оставить можно только сам пул pool в legacy.
Насчет вложенных разделов (типа /usr/src и подобных) можно особо не переживать - если им специально не выставлялись иные точки монтирования, по наследованию у них будут правильные пути.

reboot

После перезагрузки у нас должна получиться рабочая система.
Если что-то не примонтировалось или просто забыли выставить правильные точки подключения, грузиться надо в single user, потом можно даже без перезагрузки просто Ctrl+D

Если вдруг потребовалось загрузиться в single mode, корень будет в RO, перемонтировать через mount и zfs mount не поможет - это атрибут раздела. Изменить:
zfs set readonly=off pool

Если вдруг корень был не на zfs - оно подмонтировано не будет. Монтировать:
zfs mount -a

Линки
http://wiki.freebsd.org/RootOnZFS
http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror
http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot
http://wiki.opennet.ru/ZFS_%D0%B8_FreeBSD
http://www.lissyara.su/articles/freebsd/file_system/root_zfs_gpt/ Эта заметка достаточно подробная, хоть и сайт бизграмматных школьнегов.
https://sites.google.com/site/luzanov/freebsd/zfs/root_zfs - тут есть скрипт bsdinstall, но для начала надо хотя бы пару раз провести все операции вручную, чтобы понять что там вообще происходит.

Комментариев нет:

Отправить комментарий