четверг, 7 апреля 2011 г.

Установка FreeBSD с корнем на ZFS, используя GPT

В версии FreeBSD 8.0 и выше ZFS уже является стабильным, поэтому уже можно смело переходить на нее. В данном случае установка идет на один жесткий диск, поэтому дополнительные возможности и преимущества ZFS рассмотрены не будут.

Вообще говоря для ZFS рекомендуется более 8Гб оперативной памяти, чтобы она смогла себя раскрыть.
Приходится настраивать ZFS на машинах с маленьким объемом оперативной памяти например с 1Гб и даже меньше.
Минимальный объем который необходим для работы ZFS это 512Мб.
В статье приведены параметры для слабых машин. В противном случае система может уходить в kernel panic.

Причины перехода серверов на ZFS(для меня):

  • Скорость работы выше в ZFS . по сравнению с UFS (посмотреть можно здесь)
  • Нет необходимости делать fsck -y в Single User mode (честно говоря уже достало), да и время поднятия сервера зачастую очень критично.
  • Контрольная сумма блоков + использование принципа транзакций - как результат большая надежность данных.
  • Возможность быстрого клонирования на другой диск системы.
  • При данной интсаляции, все равно в какой SATA разъем Вы втыкнули свой HDD. Также без разницы в каком из режимов работает SATA (AHCI/IDE) 

Встала задача перенести роутер на новое железо, решил в качестве файловой системы выбрать ZFS. За основу взял руководство.
Установка выполняется FreeBSD 8.2 RELEASE на HDD.

Поехали...
1. Загружаемся с DVD FreeBSD или USB Memstick.

2. Выбираем в sysinstall пункт Fixit .
Примечание: при работе с флешой иногда не хочет зпускаться Fixit на memstick. Помогает Ctrl+R

4. На всякий случай смотрим как HDD видятся в системе

# atacontrol list

5. Создаем диск с GPT

# gpart create -s GPT ad4 
ad4 created 

# gpart show ad4 
=>       34  312581741  ad4  GPT  (149G) 
         34  312581741       - free -  (149G)

6.  Создаю загрузочный раздел.

# gpart add -s 128k -t freebsd-boot ad4  
 ad4p1 added 

# gpart show ad4 
=>       34  312581741  ad4  GPT  (149G) 
         34        256    1  freebsd-boot  (128K) 
        290  312581485       - free -  (149G)
7. Cоздаю своп.
 Примечание: задать нужно метку -l swap0 это для отвязки от имени диска в системе. тогда его можно переставлять у какие угодно порты, fstab править не придется.

# gpart add -s 4G -t freebsd-swap -l swap0 ad4 
ad4p2 added 

# gpart show ad4 
=>       34  312581741  ad4  GPT  (149G) 
         34        256    1  freebsd-boot  (128K) 
        290    4194304    2  freebsd-swap  (4.0G) 
    8388898  304192877       - free -  (145G)
8.Остальное отдаю под ZFS пул.
Примечание: задать нужно метку -l disс0 это для отвязки от имени диска в системе. тогда его можно переставлять у какие угодно порты, fstab править не придется.

# gpart add -t freebsd-zfs -l disс0 ad4 
ad4p3 added 

# gpart show ad4 
=>       34  312581741  ad4  GPT  (149G) 
         34        256    1  freebsd-boot  (128K) 
        290    4194304    2  freebsd-swap  (2.0G) 
    8388898  304192877    3  freebsd-zfs  (145G)

9. Устанавливаю загрузчик. Если дисков несколько и мы планируем использовать их в ZFS рейде тогда загрузчик ставить нужно для каджого из дисков.

Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad4 
bootcode written to ad4

10. Подгружаю модули ядра.

Fixit# kldload /mnt2/boot/kernel/opensolaris.ko 
Fixit# kldload /mnt2/boot/kernel/zfs.ko

11. Cоздаю ZFS пул с именем zroot

Fixit# mkdir /boot/zfs 
Fixit# zpool create zroot /dev/gpt/disc0 
Fixit# zpool set bootfs=zroot zroot

12. Включаем алгоритм fletcher4:

Fixit# zfs set checksum=fletcher4 zroot

13. Создаем необходимые разделы:

Fixit# zfs create -o compression=gzip -o exec=on -o setuid=off zroot/tmp 
Fixit# chmod 1777 /zroot/tmp
Fixit# zfs create zroot/usr
Fixit# zfs create zroot/usr/home
Fixit# cd /zroot
Fixit# ln -s /usr/home home
Fixit# zfs create zroot/var

14. Установка системы: происходит вручную
Fixit# cd /dist/8.2-RELEASE/
Fixit# export DESTDIR=/zroot
Fixit# cd base
Fixit# ./install.sh
Fixit# cd ../catpages
Fixit# ./install.sh
Fixit# cd ../dict
Fixit# ./install.sh
Fixit# cd ../doc
Fixit# ./install.sh
Fixit# cd ../info
Fixit# ./install.sh
Fixit# cd ../kernels
Fixit# ./install.sh generic
Fixit# cd ../manpages
Fixit# ./install.sh
Fixit# cd ../src
Fixit# ./install.sh all

----- для amd64 ------
Fixit# cd ../lib32
Fixit# ./install.sh
----------------------
Fixit# cd /zroot/boot
Fixit# cp -Rlp GENERIC/* /zroot/boot/kernel/

15. Делаем chroot в систему и правим конфиги:

Fixit# chroot /zroot
Fixit# echo 'zfs_enable="YES"' > /etc/rc.conf
Fixit# echo 'hostname="test.mydomain.local"' >> /etc/rc.conf

При маленьком количестве оперативы (менее 512М) система может вылетать в паник с сообщением kmem_map too small. Для того чтоб избежать этого нужно добавить строки про vm.kmem... если оперативы много можно не писать.

Fixit# echo '### ZFS' > /boot/loader.conf
Fixit# echo 'zfs_load="YES"' > /boot/loader.conf
Fixit# echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.prefetch_disable=1' >> /boot/loader.conf
Fixit# echo 'vm.kmem_size="330M"' >> /boot/loader.conf
Fixit# echo 'vm.kmem_size_max="330M"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.arc_max="40M"' >> /boot/loader.conf
Fixit# echo 'vfs.zfs.vdev.cache.size="5M"' >> /boot/loader.conf
Fixit# echo 'loader_logo="beastie"' >> /boot/loader.conf

vm.kmem_size, vm.kmem_size_max – участок памяти используемый ядром для выделения памяти, например, при использовании malloc. Размер этой памяти виртуальный, но постарайтесь сделать его меньшим вашей оперативной памяти.
vfs.zfs.prefetch_disable=1 – отключение режима prefetch. Режим prefetch – режим, когда система “угадывает” что будет прочитано и заранее читает, что может значительно ускорить работу файловой системы. На amd64 при памяти менее 4Гб он отключается автоматически.
На i386 рекомендуется отключать, а на x64 - включать
vfs.zfs.arc_max.   ARC это то, где хранятся кешированные данные пулов (pool). Работа с этим параметров сказывается на производительности, но в случае если у нас памяти мало, то этот параметр можно уменьшить.

16. Устанавливаем пароль суперпользователя, временную зону и выходим из чрута:
Fixit# passwd
Fixit# tzsetup
Fixit# cd /etc/mail
Fixit# make aliases
Fixit# exit
Fixit# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache

17. Редактируем /etc/fstab если жестких дисков несколько и label для свапов разные их нужно все указать в fstab
Fixit# cat << EOF > /zroot/etc/fstab
 # Device                       Mountpoint              FStype  Options         Dump    Pass#
 /dev/gpt/swap0                 none                    swap    sw              0       0
 EOF

18. Экспортируем LD_LIBRARY_PATH:

Fixit# export LD_LIBRARY_PATH=/mnt2/lib

19. Размонтируем все разделы zfs и изменим их точки монтирования:

Fixit# zfs umount -fa
Fixit# zfs set mountpoint=legacy zroot
Fixit# zfs set mountpoint=/tmp zroot/tmp
Fixit# zfs set mountpoint=/usr zroot/usr
Fixit# zfs set mountpoint=/var zroot/var

20. Теперь выходим из Fixit и sysinstall. Перезаргужаемся с жесткого диска и смотрим:

#mount

#zfs list

#zpool status

Полезные ссылки: 

Установка FreeBSD 8.2 на ZFS с использованием GPT
Установка FreeBSD с использованием ZFS в качестве основной
Установка FreeBSD на ZFS, включая корневой раздел.
ZFS Evil Tuning Guide
Руководство по администрированию файловых систем ZFS Solaris
Рейды на ZFS
ZFS on Linux
ZFS Wikipedia
ZFS: работаем со снапшотами
FreeBSD UFS/ZFS Snapshot Management Environment 

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

  1. Очень неудобно читать с таким цветом страницы и цветом шрифта

    Глаза болят!

    ОтветитьУдалить
  2. Цветовую схему подбирал "под себя", как раз из соображений щадящего режима для глаз.
    Я работаю на ЖК мониторах 19+ в текстовом режиме, причем часто в темноте.
    Выглядит на мой взгляд нормально...
    Напишите пожалуйста, что из цветов напрягает глаза? На каком мониторе ? Если предложите более удачное сочетание цветов, буду только рад.

    ОтветитьУдалить
  3. все сделал по инструкции и перепроверил отработку команд. после ребута can't load kernel. уже третий день в поисковике с утра до ночи - ответа нет нигде как быть :(

    ОтветитьУдалить
  4. При первой установке у меня была точно такая же ошибка...
    Обратите внимание, что Вы поставили ядро
    Fixit# ./install.sh generic
    После этой команды ядро падает в /zroot/boot/GENERIC, при этом папка kernel - пустая

    Как оказалось, я просто забыл выполнить команды:
    Fixit# cd /zroot/boot
    Fixit# cp -Rlp GENERIC/* /zroot/boot/kernel/

    После выполнения команд выше, убедитесь, что в папке /zroot/boot/kernel/ есть куча файлов, среди которых kernel и kernel.symbols
    Fixit# ls /zroot/boot/kernel/

    Наврняка у Вас таже ошибка...
    P.S. напишите, помогло или нет. Удачи :)

    ОтветитьУдалить
  5. Достаточно подробно и понятно. Попробовал на виртуалке - все ок. А при установке на реальный сервер выдает
    gptzfs boot : error 1 lba 32
    gptzfs boot : error 1 lba 1
    gptzfs boot : No zfs pools located can't boot

    Ядро скопировано и конфиги тоже проверил.
    Решения пока так и не нашлось.

    ОтветитьУдалить
  6. Посмотрите статью http://www.ukhov.ru/freebsd/NoZFSPoolsLocated. Надеюсь поможет...

    ОтветитьУдалить
  7. Собрал дома на виртуалке , включил интернет через dhcp , собрал пакет mc из текстовых файлов и установил его , поднял доступ по ssh на машину с провами рута (: спасиб :)

    ОтветитьУдалить
  8. спасибо за хаутушку, поднял у себя роутер с файлопомойкой.

    P.S. Цвета, кстати, отличные. Ярослав гонит )

    ОтветитьУдалить
  9. у меня в Fixit нет каталога 8.2-RELEASE в директории /dist

    ОтветитьУдалить
  10. Значит у Вас просто другая версия FreeBSD
    сделайте:
    # ls -l /dist
    Вам выведет содержимое папки /dist , посмотрите, какие папки у Вас есть (должна быть папка вида 8.2-RELEASE).
    И соответственно нужно заменить в команде cd /dist/... на Ваш путь.
    P.S. Если совет не поможет, напишите пожалуйста, с чего ставите и какую версию FreeBSD

    ОтветитьУдалить
  11. hedg, все круто, конечно, но непонятно, как в вашем случае (перенести роутер на новое железо, если я правильно понял) производительность файловой системы влияет на "скорость работы"...

    А цвета, кстати, классные. Вообще, не помню где и когда, но явно до того, когда школоту пустили в интырнеты, и когда мониторы были на основе ЭЛТ, было даже исследование проведено, в результате которого выяснили, что зеленый текст на черном фоне менее всего напрягает глаза.

    ОтветитьУдалить
  12. Я привел общий список преимуществ.
    Производительность файловой системы критична только для некоторых задач, например для высоконагруженной БД.
    В моем случае в основном роутеры, а там более критичны другие параметры, например: ненужность fsck.

    ОтветитьУдалить
  13. hedg, в дополнение тебе. Все роутеры которые я собираю, собираю с кеширующей проксей, например Squid. Соответственно, в таком бешеном потоке чтение\запись кеша очень помогает низкий отклик файловой подсистемы, что нельзя не вспомнить про ZFS с положительной стороны.

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