Pull to refresh

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

Reading time 5 min
Views 6.8K
Все мы знаем что время от времени очень редко, практически никогда, но возникает ситуация, при которой внеплановый 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 в качестве основной.

Удачи
Tags:
Hubs:
+57
Comments 37
Comments Comments 37

Articles