Pull to refresh

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

Reading time5 min
Views6.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
Comments37

Articles

Change theme settings