Яндекс.Метрика

Песочница

Поднимаем FreeBSD 8.2+ на ZFS root с зеркалированием используя GPT с помощью Rescue-System в Hetzner

Не так давно один из моих клиентов решил перенести свои проекты из российского датацентра в Германию в компанию Hetzner. Им был выбран выделенный сервер в конфигурации EX 4S (i7 2600, 32Gb ram, 2x3Tb), за какие то совершенно смешные деньги.
И так как и в дальнейшем планировалось еще докупать аналогичные сервера, решил собрать нужную информацию в единую заметку. Данная заметка является скорее компиляцией и переводом нескольких статей которые мне пришлось использовать когда первый сервер был установлен + что немного от себя.

Наверное не так мало системщиков, которые бы не знали компанию Hetzner. По мимо низких ценников, у них довольно интересно реализована замена недешевой KVM-IP, в виде загрузочных образов систем названных Rescue System. И так как FreeBSD при заказе сервера они сами не устанавливают, то единственный способ установить систему это воспользоваться данной возможностью.

Так что приступим:
Rescue-система активируется из интерфейса Robot. После выбора нужного сервера (Меню «Server» -> кликаем на нужный сервер) выбераем вкладку «Rescue».
В зависимости от архитектуры установленной системы (64 или 32 бита), выбираем соответствующий переключатель.
После активации Rescue-системы увидим автоматически сгенерированный пароль.
Записываем или запоминаем его, так как это — root пароль для Rescue-системы.
Наконец, систему можно перезагрузить. При перезагрузке сервер загрузится в Rescue-системе по сети вместо загрузки с жесткого диска.

Перезагрузку в нашем случае можно сделать:
  • через вкладку «Reset» в Robot
  • или запросив ручную перезагрузку сотрудником дата-центра

Воспользуемся автоматикой (сотрудники не очень расторопны).

После перезагрузки сможем подключиться к серверу по SSH по выделенному для этого сервера IP адресу и войти в систему с логином root и сгенерированным раннее в Rescue-системы паролем.

Так как жесткие диски более 2Tb то будем использовать GPT диски.

Смотрим какие диски мы имеем:

ls -1 /dev/ad* /dev/da* /dev/twed* /dev/aacd* | grep -E '[a-z]{2}[0-9]+$'


Так как rescue-system на базе FreeBSD-8 то вероятнее всего увидим в ответ:

/dev/ad4
/dev/ad6


Создадаем GPT диски:

Так как диски могут быть юзанные сначала удаляем старые разделы

gpart destroy ad4
gpart destroy ad6


потом создаем наши
gpart create -s gpt ad4
gpart create -s gpt ad6


Создадим загрузочную, swap и zfs разделы на обоих дисках:

gpart add -b 34 -s 64k -t freebsd-boot ad4
gpart add -b 34 -s 64k -t freebsd-boot ad6
gpart add -s 16G -t freebsd-swap -l swap0 ad4
gpart add -s 16G -t freebsd-swap -l swap1 ad6
gpart add -t freebsd-zfs -l disk0 ad4
gpart add -t freebsd-zfs -l disk1 ad6


Первый раздел будет содержать gptzfsboot loader который позволит загружаться с ZFS диска. Второй раздел swap. Так как памяти у нас будет 32Gb, а большого смысла зеркалировать swap раздел я не вижу то делаем два по 16Gb. Так же не будем использовать ZFS Swap Volume так как на нем crash dump не создается (а вдруг надо будет). Оставшуюся часть диска выделяем для zfs prool.
При этом сразу же задаем метки для разделов.

Устанавливаем Protected MBR (pmbr) и gptzfsboot loader на оба диска:

gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ad4
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ad6

Это позволит нам загружаться с этих дисков.

Создаем ZFS Pool zroot (zroot это просто название, можно придумать любое, но лучше оставим это):

zpool create zroot mirror /dev/gpt/disk0 /dev/gpt/disk1
zpool set bootfs=zroot zroot


Монтируем zroot в /mnt Rescue системы:

zfs set mountpoint=/mnt zroot


Создаем ZFS файловую систему:

zfs set checksum=fletcher4                                      zroot

zfs create -o compression=on    -o exec=on      -o setuid=off   zroot/tmp
chmod 1777 /mnt/tmp


Алгоритм проверки чексумм fletcher4 (на данный момент по умолчанию и работает лучше чем fletcher2).

zfs create                                                      zroot/usr
zfs create                                                      zroot/usr/home
cd /mnt ; ln -s /usr/home home

zfs create -o compression=lzjb                  -o setuid=off   zroot/usr/ports
zfs create -o compression=off   -o exec=off     -o setuid=off   zroot/usr/ports/distfiles
zfs create -o compression=off   -o exec=off     -o setuid=off   zroot/usr/ports/packages

Включаем компрессию lzjb (быстрая) там где это имеет смысл. И отключаем запуск и setuid в тех местах где он не должен в нормальном состоянии никому понадобиться.
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/usr/src

zfs create                                                      zroot/var
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/var/crash
zfs create                      -o exec=off     -o setuid=off   zroot/var/db
zfs create -o compression=lzjb  -o exec=on      -o setuid=off   zroot/var/db/pkg
zfs create                      -o exec=off     -o setuid=off   zroot/var/empty
zfs create -o compression=lzjb  -o exec=off     -o setuid=off   zroot/var/log
zfs create -o compression=gzip  -o exec=off     -o setuid=off   zroot/var/mail
zfs create                      -o exec=off     -o setuid=off   zroot/var/run
zfs create -o compression=lzjb  -o exec=on      -o setuid=off   zroot/var/tmp
chmod 1777 /mnt/var/tmp


Сжатие может быть on, off, lzjb, gzip, gzip-N (где N целое от 1 (fastest) до 9 (best compresion ratio. gzip идентично gzip-6).
Сжатие вызывает появление задержек при обращении к ZFS файловой системе. Поэтому ставим сжатие там где обращение к данным идет не так часто.

После чего запускаем программу установки FreeBSD (конечно «некошерно», но я визуал, и если есть возможность использовать GUI его использую:

sysinstall


Выбираем опцию «Custom» в главном меню и идем в Options.
В качестве «Install Root» задаем путь к точке монтирования ("/mnt") а версия релиза к примеру 8.2-RELEASE. Выходим по кнопке «q».
Пункты меню «Partition» и «Label» пропускаем переходим к «Distributions». Выбераем «Minimal» дистрибутив и подтверждаем нажатием «OK».
Так же имеет смысл установить GENERIC ядро, хотя с наличием Rescue system это может и не понадобиться никогда.
Заходим в «Media» и выбираем ftp.
При вопросе о сетевых настройках (Network configuration) жмем «Yes».
Подтверждаем всё выбранное нажатием «Commit» в меню. Это действие запускает установку.
Затем вам будет предложено просмотреть меню настройки. Отвечаем «No».
Выходим из «sysinstall».

Настройка

После того как первичная установка завершена, нужно настроить некоторые опции перед первым запуском FreeBSD.

Для этого можно воспользоваться «bsdconfig» предоставляемый Rescue System:

# bsdconfig
Welcome to the Hetzner configuration tool for FreeBSD.

Hostname: lalala.domain.com

Changing local password for root
New Password:
Retype New Password:

Configuring rc.conf... DONE
Enabling SSH login for root... DONE
Configuring resolv.conf... DONE

Congratulations! The configuration has been completed successfully.
You can now use 'reboot' to boot your newly installed FreeBSD system.


Ребут не жмем, так как еще есть над чем поработать.

Правим руками важные файлы:

zfs set readonly=on zroot/var/empty


Делаем /var/empty readonly

Дописываем в fstab наши swap разделы (предварительно удалив все что там есть).
ee /mnt/etc/fstab


# dev              mnt       type    opt       dump   pass
/dev/gpt/swap0     none      swap    sw        0       0
/dev/gpt/swap1     none      swap    sw        0       0


echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf

echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf


Создаем /boot/loader.conf и прописываем в него с чего ZFS бутиться.

cp /boot/zfs/zpool.cache /mnt/boot/zfs/zpool.cache


Устанавливаем zpool.cache для ZFS файловой системы

На последок еще раз проходимся по важным системным файлам проверяя, что ничего не забыли, или то, что скрипты установки все где надо прописали:
/mnt/etc/rc.conf
/mnt/etc/ssh/sshd_config
/mnt/etc/master.passwd
/mnt/etc/hosts
/mnt/etc/resolv.conf


Причем в sshd_config лучше сразу сменить порт на нестандартный. При мервом запуске у нас будет разрешен доступ root по ssh.
Можно сразу же прописать в rc.conf статичные адреса, посмотрев по ifconfig и netstat выдаваемые по DHCP ip/маску и default getaway.
По уму тут стоит добавить в /mnt/etc/auth.conf алгоритм blf, а так же в /mnt/etc/login.conf сменить дефолтный у FreeBSD md5 на blf (blowfish).
Главное не забыть после этого сделать cap_mkdb /etc/login.conf и перегенерить пароль рута, но лучше это делать предварительно сделав:

croot /mnt


А так же при желании можно сразу создать другого пользователя, добавить его в wheel и sshd группы, в sshd_config поставить доступ только для sshd группы и отключить доступ root по ssh.

Финальная часть:
Указываем точки монтирования для файловой системы ZFS.

zfs unmount -a


Размонтируем всё, или zfs не позволит сменить точки.

zfs set mountpoint=legacy zroot
zfs set mountpoint=/tmp zroot/tmp
zfs set mountpoint=/usr zroot/usr
zfs set mountpoint=/var zroot/var


Reboot

Ждем появления нашего сервера в сети. Если вдруг чтото пошло не так, идем в панель управления сервером, выбираем Rescue system, указываем FreeBSD, получаем пароль рута к rescue system.
Идем в перезапуск, заказываем аппаратный перезапуск.
Ждем загрузки rescue system, делаем zpool import, меняем точки монтирования на /mnt/tmp /mnt/usr /mnt/var.
И изучаем, что пошло не так. Наверняка позабыли чтото в /boot/loader.conf или rc.conf.

Материалы которые были использованы:
wiki.hetzner.de/index.php/FreeBSD_Rescue-System/ru
wiki.freebsd.org/RootOnZFS/GPTZFSBoot/Mirror