AdTech AI PostgreSQL О компании
OS · Linux 14 февраля, 2025 Сергей Томулевич

Ubuntu 18.04 root on ZFS

Регламент развёртывания Ubuntu 18.04 с root-разделом на ZFS. Подготовка дисков, ZFS пулы, разделы, GRUB, snapshot и swap.

0. Подготовка сервера

ZFS не работает корректно с аппаратными RAID-массивами из-за проблем с Write cache. Файловая система требует полный контроль над операциями записи. Все диски следует перевести в HBA Mode либо настроить индивидуальные RAID с отключённым Write Cache.

Агрегация сетевых портов может быть отключена на время установки для упрощения процесса.

1. Подготовка установочного окружения

1.1. LiveCD

Загрузка: http://releases.ubuntu.com/18.04/ubuntu-18.04.1-desktop-amd64.iso.

Загрузиться с LiveCD, выбрать «Try Ubuntu» и открыть терминал (Ctrl+Alt+T).

1.2. Обновление и репозитории

sudo apt-add-repository universe
sudo apt update

1.5. Установка поддержки ZFS

apt install --yes debootstrap gdisk zfs-initramfs

2. Разметка дисков

2.0. Конфигурации массивов

Два диска: один MIRROR (RAID1). Опциональный третий диск как SPARE или RAIDZ.

Четыре диска:

Отказоустойчивость (от лучшего к худшему): RAIDZ2 → MIRROR+MIRROR → RAIDZ. Производительность (от лучшего к худшему): MIRROR+MIRROR → RAIDZ → RAIDZ2.

2.1. Подготовка к разметке

apt install --yes mdadm
lsblk
sgdisk --zap-all /dev/{{ disk name }}

2.2. Разметка дисков

Boot-раздел:

sgdisk -a1 -n1:34:2047 -t1:EF02 /dev/{{ disk name }}

Основной раздел (на всё пространство):

sgdisk -n2:0:0 -t2:BF01 /dev/{{ disk name }}

2.3. Создание ZFS пула

zpool create                	\
    -o ashift=12            	\
    -O atime=off            	\
    -O canmount=off         	\
    -O compression=lz4      	\
    -O checksum=fletcher4   	\
    -O normalization=formD  	\
    -m legacy               	\
    -R /mnt                     \
    -f                      	\
  tank                      	\
    mirror                  	\
      /dev/{{ disk a part 2}}   \
      /dev/{{ disk b part 2}}

Опции:

3. Установка системы

zfs create -o mountpoint=/ tank/root
zpool set bootfs=tank/root tank
zfs create -o mountpoint=legacy tank/tmp
zfs create -o mountpoint=legacy tank/var
zfs create -o mountpoint=/home tank/home
zfs create -o mountpoint=legacy tank/home/root

Установка ядра:

debootstrap bionic /mnt

4. Настройка системы

Базовая настройка: hostname, netplan, apt sources, монтирование виртуальных ФС, chroot, локали и timezone, vim, ZFS поддержка, GRUB, root password, SSH.

Установка GRUB:

apt install --yes grub-pc
update-initramfs -u -k all
update-grub
grub-install /dev/sda
grub-install /dev/sdb

Файл /etc/fstab:

tank/var        /var   zfs  noatime,nodev 0 0
tank/tmp        /tmp   zfs  noatime,nodev 0 0
tank/home/root  /root  zfs  noatime,nodev 0 0

6. Первая перезагрузка

zfs snapshot tank/root@setup
exit
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
zpool export tank
reboot

7. SWAP

zfs create \
    -V 32G \
    -b $(getconf PAGESIZE) \
    -o compression=zle \
    -o logbias=throughput \
    -o sync=always \
    -o primarycache=metadata \
    -o secondarycache=none \
  tank/swap

mkswap -f /dev/zvol/tank/swap
echo /dev/zvol/tank/swap none swap defaults 0 0 >> /etc/fstab
echo RESUME=none > /etc/initramfs-tools/conf.d/resume
swapon -av

R. Аварийная загрузка

После выполнения подготовки установочного окружения (раздел 1):

zpool export -a
zpool import -N -R /mnt tank
zfs mount -a
mount -t zfs tank/var /mnt/var/
mount -t zfs tank/tmp /mnt/tmp/
mount -t zfs tank/home/root /mnt/root/

Резюме

Готовы посчитать собственный стек? Расскажем, какие модули и какая нагрузка нужны под вашу задачу.

to@prototypes.ventures