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

    Песочница

    Поднимаем 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