Темы
Подготовка системы к клонированию
Настраиваем систему на целевом диске
Обновляем образ initramfs
Установка Grub2 на целевой диск
Замена Grub 2 на systemd-boot
Добавляем в bash_completion zfs
Автоматизация инсталляции Fedora на ZFS
Дополнительные материалы
Монтирование файловых систем
XFS: Файловая система
Перенос системы на другой диск (xfs_copy)
Перенос системы на другой диск (rsync)
Convert MBR to GPT
Исправляем нумерацию разделов на диске
Гибернация — режим сна
LUKS: Шифруем данные
Fedora_Root_On_ZFS.md статья на github
Reliably boot Fedora with root on ZFS статья с csparks.com
ZFS на Linux Debian 9.9 Видео на youtube
Нерешенные вопросы
- Почему на завершающей стадии не могу экспортировать пул из системы (после выхода из chroot)?
- Не устраивает сборка при помощи dkms (требуется выполнение некоторых операций руками). Желательно мигрировать на akmods
Основные команды
Действия с пулом
- zpool create tank /dev/disk/by-id/… — Создание пула с именем tank на блочном устройстве (диск, раздел) /dev/disk/by-id/… Крайне желательно указывать именно ссылку на устройство из каталога /dev/disk/by-id/
- zpool import — Выводит список пулов доступных для импорта
- zpool list — Выводит список импортированных пулов
- zpool import tank — Импортирует в систему пул с именем tank
- zpool export tank — После выполнения этой команды пул tank больше не отображается в системе. Перед продолжением предпринимается попытка размонтирования всех смонтированных файловых систем в пуле. Если размонтировать какую-либо из файловых систем не удается, ее можно размонтировать принудительно с помощью параметра
- zpool add — расширяет пространство пула объёмом добавляемого блочного устройства (stripe)
- zpool attach — присоединяет блочного устройство к массиву (MIRROR и др)
- zpool detach — отсоединяет блочное устройство от массива (MIRROR и др)
- zfs create tank/ws — Создать dataset ws в пуле tank
- zfs destroy -r tank/ws — Удаляет все вложенные dataset рекурсивно
- zfs set … =on/off tank/ws — Установить/отключить параметр для указанного dataset
- zfs mount — Монтирование определённого dataset
- zfs unmount — Размонтирование отдельного dataset
Подготовка системы к клонированию
Поскольку в дистрибутиве Fedora изначально используется systemd, то для идентификатора машины применяется /etc/machine-id который генерируется командой systemd-machine-id-setup, а файл /etc/hostid не создаётся. Для работы файловой системы ZFS он нужен, и его необходимо создать не взирая на предупреждение об устаревшем методе идентификации. Если genhostid отсутвует, то нужно пустановить пакет initscripts, в который он входит
ZFS использует свой собственный механизм для хранения идентификатора хоста, который называется hostid. hostid хранится в метаданных пула ZFS и используется для идентификации узла, на котором находится пул.
- Код: выделить все
genhostid
Проверить существование файла hostid можно примерно так
- Код: выделить все
[ -f /etc/hostid ] && echo true
Устанавливаем репозиторий zfsonlinux для Fedora в систему
- Код: выделить все
dnf install -y https://zfsonlinux.org/fedora/zfs-release-2-5$(rpm --eval "%{dist}").noarch.rpm
Инсталлируем необходимое программное обеспечение
- Код: выделить все
dnf install gcc make kernel-devel kernel-headers dkms zfs-dracut zfs-dkms zfs grub2-efi-x64-modules
- dkms - Этот пакет содержит платформу для динамической сборки модулей ядра (DKMS)
- zfs-dracut - zfs-dracut позволяет dracut создавать образы initramfs с поддержкой ZFS
- zfs-dkms - Пакет содержит модули ZFS для dkms
- zfs - Пакет содержит основные утилиты командной строки ZFS.
- grub2-efi-x64-modules - Этот пакет предоставляет дополнительные модули для сборки вашего собственного grub.efi.
- Код: выделить все
dnf swap zfs-fuse zfs
Грузим zfs модули
- Код: выделить все
modprobe zfs
Проверяем загрузились ли модули ядра zfs
- Код: выделить все
lsmod |grep zfs
Пересобираем образ initramfs для загруженного ядра
- Код: выделить все
dracut -f
Теперь можно перезапустить систему и снова проверить загрузились ли модули ядра для zfs
- Код: выделить все
reboot
lsmod |grep zfs
При успешном запуске zfs можно переходить к разметке диска для новой файловой системы.
Подготовка дискового пространства на новом диске
Теперь подготовим разделы на свободном диске и создаём следующие разделы
- EFI System Partition - 512 MB
- ZFS POOL - Всё остальное пространство
- Код: выделить все
parted -a optimal -s /dev/sda 'mklabel gpt' 'mkpart primary fat32 1MiB 513MiB' \
'name 1 "EFI System Partition"' 'set 1 esp on' \
'mkpart primary 513MiB -1' 'name 2 "ZFS"'
Сделаем теперь на разделе EFI файловую систему FAT
- Код: выделить все
mkfs.fat -F32 /dev/sda1
Создаём структуру пулов и набора данных ZFS
Предлагаемая структура улов и набора данных такова:
tank/
tank/boot
tank/home
Создадим пул ZFS и корневую файловую систему с оптимальными параметрами
- Код: выделить все
zpool create -d -o feature@allocation_classes=enabled \
-o feature@async_destroy=enabled \
-o feature@bookmarks=enabled \
-o feature@embedded_data=enabled \
-o feature@empty_bpobj=enabled \
-o feature@enabled_txg=enabled \
-o feature@extensible_dataset=enabled \
-o feature@filesystem_limits=enabled \
-o feature@hole_birth=enabled \
-o feature@large_blocks=enabled \
-o feature@lz4_compress=enabled \
-o feature@project_quota=enabled \
-o feature@resilver_defer=enabled \
-o feature@spacemap_histogram=enabled \
-o feature@spacemap_v2=enabled \
-o feature@userobj_accounting=enabled \
-o feature@zpool_checkpoint=enabled \
-o ashift=9 -o altroot=/sysroot \
-O atime=off -O compression=lz4 \
-O xattr=sa -O normalization=formD \
-O mountpoint=/ -O acltype=posixacl \
tank /dev/disk/by-id/ata-VBOX_HARDDISK_VB08f83824-88e6cb2e-part2
??? -o multihost=on
Указываем параметр altroot равным /sysroot чтобы не менять значение перед перезагрузкой.
При создании пула указываются два типа параметров:
- -o — параметры пула
- -O — параметры корневого dataset
- ashift - Размер физ. сектора (9,12) степень двойки 2^9=512 или 2^12=4048=4K
- altroot - Смещение относительно какого-то каталога точки монтирования
- atime - Отключение обновления времени доступа к файлу при каждом обращении
- canmount - Отключаем монтирование корневого dataset
- compression - Метод сжатия данных для создаваемого dataset
- xattr - Место хранения расширенных атрибутов, по умолчанию хранятся в виде скрытых файлов (только для Linux), что негативно влияет на производительность
- -m none - Отключаем точку монтирования для корневого dataset
- -f - Форсированное создание пула (подавляет предупреждения)
- tank - Имя пула
- /dev/... - Раздел или диск под создаваемый пул
- multihost - осуществляется проверка, что пул уже кем-то импортирован
- normalization -
- Код: выделить все
zfs create \
-o compression=on -o exec=off -o setuid=off \
tank/home
setuid=off — запрещает выполнение программ от имени владельца файла в файловой системе для домашних каталогов пользователей.
-o exec=off — с файловой системы запрещаем выполнять программы.
Создаём dataset для файловой системы boot.
- Код: выделить все
zfs create \
-o compression=on -o atime=off \
tank/boot
Теперь устанавливаем на параметр bootfs значение для dataset с загрузочной файловой системой
- Код: выделить все
zpool set bootfs=tank/boot tank
Пример создания области подкачки swap
В данном случае создаём zfs volume, а не dataset. Том zfs является блочным устройством, а dataset - НЕТ
- Код: выделить все
zfs create -V 4G -b $(getconf PAGESIZE) \
-o logbias=throughput -o sync=always \
-o primarycache=metadata -o secondarycache=none \
-o com.sun:auto-snapshot=false -o compression=zle \
tank/swap
Монтируем EFI раздел в соответствующий каталог вновь созданной структуры ZFS
- Код: выделить все
mkdir -p /sysroot/boot/efi && mount /dev/sdb1 /sysroot/boot/efi
Переносим данные на диск с ZFS
Перед переносом данных на целевой диск нужно создать lvm snapshot либо остановить все основные сервисы и выполнить синхронизацию исходного диска с целевым
- Код: выделить все
rsync -axHAWXS --numeric-ids --info=progress2 \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found/*","/sysroot"} \
/* /sysroot
Если возникла потребность в перезапуске или в поднятии существующего пула на иной системе, то нужно указывать ALTROOT параметром '-R /sysroot/tank' и тогда вся структура датасетов будет смонтирована по своим местам относительно значения ALTROOT
- Код: выделить все
zpool import -R /sysroot tank