FreeBSD: от sysinstall к ZFS

Опубликовано 02.08.2011

Оригинал:From sysinstall to ZFS-only configuration
Перевод:Сгибнев Михаил

 Я хотел бы рассказать о процессе инсталляции серверов в моей компании.

 Как вы знаете, sysinstall в настоящий момент не поддерживает ZFS или GEOM, но я хотел бы показать вам, как преобразовать систему, установленную с помощью sysinstall на работу только с ZFS. Даже если вы не хотите следовать всем указанным шагам, пожалуйста, посмотрите на dataset ZFS, который, после некоторых модификаций, я считаю довольно оптимальным для FreeBSD.

 После выполнения нижеуказанных действий вы получите зеркалируемый и зашифрованный файл подкачки, GPT разделы и зеркалируемый системный пул ZFS.

 Я предполагаю, что ваш сервер содержит два идентичных диска (ada0 и ada1).

 Запустите процесс установки FreeBSD на первом диске, используя обычный установочный CD/DVD. Установите систему, используя тольуо один слайс и один раздел, после чего перезагрузите компьютер.

 Ваша система теперь установлена и работает с файловой системой UFS. Внесите следующие исправления в /boot/loader.conf:

geom_eli_load="YES"
geom_label_load="YES"
geom_mirror_load="YES"
geom_part_gpt_load="YES"
zfs_load="YES"
vm.kmem_size="6G" # This should be 150% of your RAM.
vfs.zfs.arc_max="3G" # This should be a little less than the amount of your RAM.

 Создадим разделы на втором диске:

# gpart create -s GPT ada1
# gpart add -b 34 -s 128 -t freebsd-boot ada1
# gpart add -s 2g -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l system1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

 Создадим файл подкачки и системный пул ZFS на втором и третьем разделе соответственно:

# gmirror label -F -h -b round-robin swap /dev/gpt/swap1
# zpool create -O mountpoint=/mnt -O atime=off -O setuid=off -O canmount=off system /dev/gpt/system1

 Создадим корневую файловую систему и внесем изменения в /etc/fstab:

# cat > /etc/fstab
system/root / zfs rw,noatime 0 0
/dev/mirror/swap.eli none swap sw 0 0
^D
# zfs create -o mountpoint=legacy -o setuid=on system/root
# zpool set bootfs=system/root system
# mount -t zfs system/root /mnt

 Создайте остальные файловые системы (все должно быть смонтировано ниже /mnt/):

# zfs create -o compress=lzjb system/tmp
# chmod 1777 /mnt/tmp
# zfs create -o canmount=off system/usr
# zfs create -o setuid=on system/usr/local
# zfs create -o compress=gzip system/usr/src
# zfs create -o compress=lzjb system/usr/obj
# zfs create -o compress=gzip system/usr/ports
# zfs create -o compress=off system/usr/ports/distfiles
# zfs create -o canmount=off system/var
# zfs create -o compress=gzip system/var/log
# zfs create -o compress=lzjb system/var/audit
# zfs create -o compress=lzjb system/var/tmp
# chmod 1777 /mnt/var/tmp
# zfs create -o canmount=off system/usr/home
# zfs create system/usr/home/pjd
(create file systems for all your users)

 Включаем ZFS в /etc/rc.conf:

# echo 'zfs_enable="YES"' >> /etc/rc.conf

 Я рекомендую установить в качестве рабочего каталога для системы портов /usr/obj:

# echo WRKDIRPREFIX=/usr/obj >> /etc/make.conf

 Скопируйте всю систему во второй диск (примечание перед one-file-system есть два тире!!):

# cd /
# tar -c --one-file-system -f - . | tar xpf - -C /mnt/

 Отмонтируйте файловую систему ZFS и измените точку монтирования на /. Данное изменение будет унаследовано всеми файловыми системами:

# zfs umount -a
# umount /mnt
# zfs set mountpoint=/ system

 Перезагружаемся. Если машина загрузилась нормально (я на это надеюсь, но…), то вы увидите следующее:

# mount
system/root on / (zfs, local, noatime)
devfs on /dev (devfs, local)
system/tmp on /tmp (zfs, local, noatime, nosuid)
system/usr/home/pjd on /usr/home/pjd (zfs, local, noatime, nosuid)
system/usr/obj on /usr/obj (zfs, local, noatime, nosuid)
system/usr/ports on /usr/ports (zfs, local, noatime, nosuid)
system/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noatime, nosuid)
system/usr/src on /usr/src (zfs, local, noatime, nosuid)
system/var/audit on /var/audit (zfs, local, noatime, nosuid)
system/var/log on /var/log (zfs, local, noatime, nosuid)
system/var/tmp on /var/tmp (zfs, local, noatime, nosuid)

# swapctl -l
Device: 1024-blocks Used:
/dev/mirror/swap.eli 4194300 4888

 Теперь нам необходимо добавить первый диск (ada0):

# dd if=/dev/zero of=/dev/ada0 count=79
# gpart create -s GPT ada0
# gpart add -b 34 -s 128 -t freebsd-boot ada0
# gpart add -s 2g -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l system0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0

# gmirror insert -h -p 1 swap /dev/gpt/swap0
(wait for gmirror to synchronize swap)
# gmirror status
Name Status Components
mirror/swap COMPLETE gpt/swap1
gpt/swap0

# zpool attach system /dev/gpt/system1 /dev/gpt/system0
(wait for pool to resilver)
# zpool status
pool: system
state: ONLINE
scrub: resilver completed after 0h2m with 0 errors on Mon Aug 2 11:28:45 2010
config:

NAME STATE READ WRITE CKSUM
system ONLINE 0 0 0
mirror ONLINE 0 0 0
gpt/system1 ONLINE 0 0 0 55,5M resilvered
gpt/system0 ONLINE 0 0 0 1,67G resilvered

errors: No known data errors

 Ну, собственно, и всё.

 BTW. Поскольку ваш /var/log/ сжат ZFS, вы можете отключить сжатие журналов при ротации в /etc/newsyslog.conf.

 Ниже я указываю причины, по которым использую именно такой dataset:

  • Нет никаких манипуляций со свойствами точек монтирования, за исключением корневой. Когда вы работаете с ZFS, может смущать то, что место каталога в ZFS не соответствует точке монтирования. Свойства точки монтирования всегда наследуются, поэтому при ее изменении вы будете знать, что вся структура каталогов, расположенная ниже наследует ее должным образом и нет необходимости в других изменениях.
  • Обратите внимание на то, что system/usr и system/var не подмонтированы. /usr/bin, /usr/sbin, /var/named и т.д. принадлежат dataset system/root. Это позволяет при обновлении системы создавать снимок только system/root и в случае неудачи откатить его обратно.
  • Вы можете отключить setuid для всех datasets, за исключением system/root и system/usr/local.
  • Вы можете использовать сжатие для /usr/src, /usr/obj, /tmp, /var/tmp, /var/log и /var/audit.
  • Наличие Ос в одном dataset облегчает создание jail. Таким образом, мне для создания jail необходимо клонировать system/root в system/jails/<name> и, при желании, создать дополнительные dataset:
    • system/jails/<name>/etc
    • system/jails/<name>/tmp
    • system/jails/<name>/var
    • system/jails/<name>/usr (set canmount to off)
    • system/jails/<name>/usr/local
    • system/jails/<name>/usr/work (I build ports here)
    • system/jails/<name>/root (jailed root home directory)
      Таким образом, вы можете сделать datasec system/jails/<name> только для чтения и при обновлении основной системы выполнить следующие шаги для обновления jail:

    • Остановить jail
    • Переименовать system/jails/<name> в system/jails/<name>_old
    • Снова клонировать system/jails/<name> из system/root
    • Переименовать все dataset, располагающиеся ниже system/jails/<name>_old в созданный system/jails/<name>
    • Обновить system/jails/<name>/etc
    • Обновить system/jails/<name>/var


[ad name=»Google Adsense»]



 Уважайте труд автора, сохраняйте копирайты.
Реклама на сайте висит не просто так и если статья Вам понравилась, с ее помощью Вы можете отблагодарить автора за проделанную работу. Спасибо!

4 комментария в FreeBSD: от sysinstall к ZFS

  1. Первое предложение поправьте =) Он не хотел участвовать, он хотел поделиться инфой =)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*