Автоматическая установка FreeBSD 8.2-RELEASE на ZFS

    Все мы знаем что время от времени очень редко, практически никогда, но возникает ситуация, при которой внеплановый reset или сбой питания сервера FreeBSD приводит к остановке загрузки с настойчивым требованием запустить fsck от руки. Бывает, сервер соскучился, админ давно его не навещал, а может полнолуние какое, но данное явление в природе встречается. Пришла пора, думаю, переезжать на ZFS — народ рекомендует, стадию бета теста давно прошла, дисковое пространство зря не пропадает, и… в ZFS отсутствует потребность в утилите fsck для проверки целостности файловой системы(!). Проштудировав маны, wiki, лиссяру, пришел к выводу что надо кое-где рашпилем проточить, причесать, лакирнуть и пойдет в массы. Действительно, процесс, по сравнению со стандартным sysinstall, несколько затруднен, но зато быстр как никогда — 2 минуты и сервер с корневым разделом на ZFS готов.

    Да, разумеется мы не будем запускать руками всю ту пачку команд, которую рекомендуют запускать, и не будем возиться с sysinstall, а сделаем скрипт автоматической установки, который запустим из режима Fixit. Для этого понадобится DVD или USBstick вариант инсталяции, сервер где хранится скрипт (доступный по ssh).
    Процесс инсталяции выглядит так: загружаемся, выбираем режим Fixit — CD/DVD, вешаем IP на сетевуху и запускаем скрипт:
    Fixit# ifconfig em0 192.168.1.100/24
    Fixit# ssh user@192.168.1.1 'cat /opt/script/zfs-init' | sh

    Теперь обратимся к содержимому скрипта, он должен сделать следующее:
    1. Разметить диск (GPT — boot, swap0, disk0)
    2. Создать ZFS pool (/root, /tmp, /usr, /var, /opt) — раздел /root сделал отдельно, его можно тоже ограничивать в размере
    3. Закинуть на ZFS фряху с минимальными конфигами для старта

    Скрипт на шелле, просто перечень команд в определенной последовательности. В начале скрипта измените переменные dev (диск), iface (сетевуха), tank (название пула ZFS), hostname (имя хоста), tz (timezone). Вот и он:
    1. #!/bin/sh
    2.  
    3. # Vars
    4. dev=da0
    5. tank=tank
    6. iface=em0
    7. hostname=core.domain.com
    8. tz="Europe/Kiev"
    9.  
    10. # gpart
    11. gpart create -s GPT $dev
    12. gpart add -s 64K -t freebsd-boot $dev
    13. gpart add -s 2G -t freebsd-swap -l swap0 $dev
    14. gpart add -t freebsd-zfs -l disk0 $dev
    15.  
    16. gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 $dev
    17.  
    18. sysctl kern.geom.debugflags=0x10
    19.  
    20. # install ZFS
    21. kldload /mnt2/boot/kernel/opensolaris.ko
    22. kldload /mnt2/boot/kernel/zfs.ko
    23.  
    24. mkdir /boot/zfs
    25. # сreate ZFS pool
    26. zpool create -f $tank /dev/gpt/disk0
    27. zfs set mountpoint=none $tank
    28.  
    29. zfs set atime=off $tank
    30. zfs set checksum=fletcher4 $tank
    31. zfs create -o compression=off -o exec=on $tank/root
    32. zfs set mountpoint=/$tank $tank/root
    33. zpool set bootfs=$tank/root $tank
    34. zfs create -o compression=on -o exec=on -o setuid=off $tank/tmp
    35. zfs set mountpoint=/$tank/tmp $tank/tmp
    36. zfs create $tank/usr
    37. zfs set mountpoint=/$tank/usr $tank/usr
    38. zfs create $tank/var
    39. zfs set mountpoint=/$tank/var $tank/var
    40. zfs create -o compression=off -o setuid=off $tank/opt
    41. zfs set mountpoint=/$tank/opt $tank/opt
    42.  
    43. cd /$tank ; ln -s /usr/home home && cd -
    44. mkdir /$tank/var/tmp 
    45. chmod 1777 /$tank/var/tmp /$tank/tmp
    46.  
    47. # install base system
    48. cd /dist/8.2-*
    49. export DESTDIR=/$tank
    50. for dir in base catpages dict doc info lib32 manpages; do (cd $dir ; echo "y" | ./install.sh) ; done
    51. cd src; ./install.sh all
    52. cd ../kernels ; ./install.sh generic
    53. cd /$tank/boot ; cp -Rlp GENERIC/* /$tank/boot/kernel/
    54.  
    55. # install base configs
    56. cat << EOF > /$tank/etc/rc.conf
    57. zfs_enable="YES"
    58. hostname="$hostname"
    59. ifconfig_$iface="DHCP"
    60. sshd_enable="YES"
    61. ntpd_enable="YES"               
    62. ntpd_program="/usr/sbin/ntpd"   
    63. ntpd_flags="-p /var/run/ntpd.pid -f /var/db/ntpd.drift"
    64. EOF
    65.  
    66. cat << EOF > /$tank/etc/ntp.conf
    67. server 82.207.71.6 iburst maxpoll 9
    68. server 91.198.10.4 iburst maxpoll 9
    69. server 79.142.192.4 iburst maxpoll 9
    70. server 193.193.193.107 iburst maxpoll 9
    71. EOF
    72.  
    73. echo 'zfs_load="YES"' > /$tank/boot/loader.conf
    74. echo "vfs.root.mountfrom=\"zfs:$tank/root\"" >> /$tank/boot/loader.conf
    75.  
    76. cp /mnt2/usr/share/zoneinfo/$tz /$tank/etc/localtime
    77. cp /boot/zfs/zpool.cache /$tank/boot/zfs/zpool.cache
    78.  
    79. cat << EOF > /$tank/etc/fstab
    80. # Device          Mountpoint     FStype  Options         Dump    Pass#
    81. /dev/gpt/swap0    none           swap    sw              0       0
    82. procfs            /proc          procfs  rw              0       0
    83. EOF
    84.  
    85. export LD_LIBRARY_PATH=/mnt2/lib 
    86.  
    87. cd /
    88.  
    89. # correct ZFS mount points and quotas
    90. zfs unmount -a
    91. zfs set mountpoint=/opt $tank/opt
    92. zfs set quota=1G   $tank/tmp   && zfs set mountpoint=/tmp   $tank/tmp
    93. zfs set quota=5G   $tank/usr   && zfs set mountpoint=/usr   $tank/usr
    94. zfs set quota=10G  $tank/var   && zfs set mountpoint=/var   $tank/var
    95. zfs set quota=512m $tank/root  && zfs set mountpoint=legacy $tank/root

    Во время работы скрипта клавиатуру трогать не надо, после окончания просто перегрузите сервер, и войдите в систему юзером root без пароля.

    Материалы по теме: RootOnZFS/GPTZFSBoot, Установка FreeBSD с использованием ZFS в качестве основной.

    Удачи
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 37

      +1
      Красафчег (с)
        –1
        ситуация, при которой внеплановый reset или сбой питания сервера FreeBSD приводит к остановке загрузки с настойчивым требованием запустить fsck от руки


        Я правильно понимаю, что вы решили, что переехать на zfs проще, чем прописать fsck_y_enable в rc.conf? :)
          0
          да, правильно. fsck_y_enable не помогает.
            0
            что ж вы с бедным ufs делали? ни разу такого не было, кроме случаев «винту кабздец».
              +4
              Автору скорее интересно обсудить его успех по ZFS, нежели ваши успехи по UFS :)
              А случаи… они бывают такие разные.
                +2
                да понимаю :)

                я юзать в продакшене zfs пока, простите, сцу.
                  +1
                  Мы примерно год уже используем, правда только под разделы с данными, саму ОС на ufs пока ставим. Полет нормальный )
                    +1
                    тащем-то в бдсм до сих пор актуальна проблема локов при одновременном использовании ufs и zfs на одной машине, можно пошукать в рассылках, были терки. так что может быть у вас полет и нормальный, но, видимо, к производительности нет требований вообще.

                    да и смысла ставить систему на ufs, а данные на другое не вижу вообще.

                    ps: переезд на солярис, — правильное решение проблемы производительности zfs в бдсм.
                      0
                      Да ZFS пулы по производительности неплохо нагружены на многих серверах.
                      На UFS да, особой нагрузки нет.
                      • UFO just landed and posted this here
                    0
                    А почему? Просто последнее время про zfs только хорошести слышу.

                    Я бы заюзал, но возможности нет :)
                  +2
                  Авария на подстанции, переходим на ups, примерно через четыре часа сервер гасится изза падения заряда, ещё где-то через полчаса, собственник помещения запускает генератор но генератора хватает примерно на 3 минуты и изза перегрузки он глохнет, но за это время сервера уже успели подняться, но заряда батареек уже нет. В защиту UFS скажу что админу RHEL востанавливать пришлось значительно дольше.
                    0
                    А у нас ДГУ (дизель-генератор) включается через минуту после того, как гарантированное питание отрубилось. Минуту сбоя питания обычно держат стоечные источники аварийного питания. Отдельно стоящие источники бесперебойного питания включаются, когда уже совсем всё плохо: нету ни гарантийки, ни резервного питания, а часть серверного оборудования выключать ну никак нельзя.
                  +2
                  если нет стабильности электропитания, то не важно какая файловая система, жесткие диски могут физически выходить из строя.

                  но fsck_y помогает вполне, надо лишь выключить к едрене фене SU и возможно некоторые разделы перевести в ro. будет ничуть не хуже. желающим иметь SU, стоит лишь понадеется на gjournal.

                  zfs конеш добро и радость, особенно по части менеджмента. :)
                    0
                    Soft Updates выключать никак нельзя — без него нарушается семантика транзакций на дисковые устройства.

                    > но fsck_y помогает вполне

                    Чем?

                    Опция background_fsck в rc.conf.local задаёт возможность автоматической проверки в фоне. Опция background_fsck_delay отложит проверку на более позднее время или выключит её совсем.
                  0
                  С fsck_y_enable сервер подниматься после отключения питания будет тем дольше, чем больше информации на дисках, подгруженные сервера с толстыми дисками могут подниматься даже десятки минут, да, они поднимутся, но надо ждать. У меня сервер на двух дисках в gmirror проверялся после вытыкания питания порядка 20 минут. А за это время мы успели получить кучу звонков от юзеров.

                  На zfs сервер в такой конфигурации поднимается сразу. Я поднимал на zfs сервер с подобной схемой, два диска zpool в mirror. Вытащил один из дисков, загрузился. Система загрузилась быстро, но пару минут тупила. Вырубил питание (именно вырубил без shutdown). Вставил второй диск. Включил сервер. Машинка поднялась сразу, немного потупила, примерно 2-5 минут и стала нормально реагировать на все. В zpool status через час второй диск стал ONLINE.

                  Мне лично очень нравится возможность юзать все место пула в одном из разделов файловой системы. На ufs часто было, что надо бы пару гиг добавить в /var, а все диски уже разбиты и приходилось как-то выкручиваться. В zfs /var или /usr может занять все свободное место на диске (вернее в пуле). Естественно, нужно помнить, что на корень надо сразу ставить резервирование в 1-2гб.
                  0
                  В 8.2 dedup появился, его можно на весь pool включать.
                    0
                    Не уверен — ZFS Deduplication available in ZFS v21 and higher. В 8.2-RELEASE из коробки v15.
                      +1
                      В релизе да, в stable уже мержнули v28 как и в 9ке.
                        0
                        stable стремно на продакшен ставить :)
                          +6
                          Фраза достойная занесения в скрижали!
                            +1
                            В скрижалях, то есть в Руководстве, уже есть: «FreeBSD-STABLE является нашей веткой разработки, из которой делаются основные релизы. Изменения в этой ветке происходят с разной скоростью, и при этом предполагается, что сначала они были выполнены для FreeBSD-CURRENT в целях тестирования. Однако эта ветка остаётся веткой для разработки, а это значит, что в любой момент времени исходные тексты FreeBSD-STABLE могут оказаться неприменимы для некоторой задачи. Это просто ещё одна ветка при разработке, а не ресурс для конечных пользователей.»
                              0
                              Что еще раз подтверждает, что FreeBSD не для всех.
                              Я, как нуб со стороны, уверен что STABLE стабильна.

                              Не, я согласен, что это вопрос принятых обозначений, но всё-таки, обозначения вводят для внесения ясности, а не сумбура, разброса и шатания.
                            +1
                            да, вы правы, current намного интересней ;)
                              0
                              А как же багфикс и заплатки? :)
                        0
                        А если вместо ssh можно использовать nc? Я не помню есть ли в Fixit nc… Но было бы проще. Можно тогда сетапнуть дефолтрут и скачать данные сразу в файл.
                        А вариант еще проще, написать свой инсталляционный скрипт. Убрать sysinstall.
                          +1
                          Спасибо за заметку. Никогда не задумывался отходить от sysinstall, и так всё быстро. А такой вариант интересно попробовать.
                            0
                            Я бы ещё рекомендовал разбивать диск gpart'ом с отступом от начала диска, кратному 1Мбайту — это позволит нивелировать проблему 4Кб-секторных винтов, во всё большем количестве появляющихся в продаже.
                            0
                            Есть скрипт от Martin Matuska — zfsinstall. Там предусмотрены разные варианты установки. Только там привязка не по gpt-label :/
                            Я ему слал патч, где привязка по gpt-label
                              0
                              zfsinstall моей редакции

                              теперь диски и swap привязаны к label
                              mfsbsd# zpool status tank
                                pool: tank
                               state: ONLINE
                               scan: none requested
                              config:
                              
                                      NAME            STATE     READ WRITE CKSUM
                                      tank            ONLINE       0     0     0
                                        gpt/disk-ad8  ONLINE       0     0     0
                              


                              mfsbsd# cat /mnt/etc/fstab
                              /dev/gpt/swap-ad8 none swap sw 0 0


                              P.S. правки через github я не осилил. Не нашел возможности удалять/откатывать свой гавнокод коммиты.
                                0
                                SWAP можно разместить на ZVOL, тогда надобность в отдельной записи в /etc/fstab отпадёт:

                                % zfs create -V 1Gb poolname/swap
                                % zfs set org.freebsd:swap=on poolname/swap
                                % zfs set checksum=off poolname/swap
                                % swapinfo
                                Device 1M-blocks Used Avail Capacity
                                % swapon /dev/zvol/poolname/swap
                                % swapinfo
                                Device 1M-blocks Used Avail Capacity
                                /dev/zvol/poolname/swap 1024 0 1024 0%
                                %
                                  0
                                  Можно. ZVOL всегда можно успеть сделать на работающем пуле.
                                  Но я все-таки надеюсь, чтоб как-то креш-дампы получать на ZFS.
                                    0
                                    А что может быть интересного от креш-дампов в SWAP? Неразработчику системы «бинарный мусор» неочевиден. Я, как пользователь системы, обычно отключаю креш-дампы и вообще, всю отладочную информацию, так как воспользоваться этим я не смогу, а откатиться на предыдущее состояние системы всегда в состоянии.
                                      0
                                      А мне частенько приходится натыкаться на проблемы и частенько приходится PR заполнять.

                            Only users with full accounts can post comments. Log in, please.