Темы
Подготовка системы к клонированию
Настраиваем систему на целевом диске
Обновляем образ initramfs
Установка Grub2 на целевой диск
Замена Grub 2 на systemd-boot
Добавляем в bash_completion zfs
Автоматизация инсталляции Fedora на ZFS
Переход на ZFSBootMenu: практическое руководство
Отказываемся от GRUB полностью
Дополнительные материалы
Монтирование файловых систем
XFS: Файловая система
Перенос системы на другой диск (xfs_copy)
Перенос системы на другой диск (rsync)
Convert MBR to GPT
Исправляем нумерацию разделов на диске
Гибернация — режим сна
LUKS: Шифруем данные
Reliably boot Fedora with root on ZFS статья с csparks.com
ZFS на Linux Debian 9.9 Видео на youtube
- Не устраивает сборка при помощи 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
[/align]
Поскольку в дистрибутиве Fedora изначально используется systemd, то для идентификатора машины применяется /etc/machine-id который генерируется командой systemd-machine-id-setup, а файл /etc/hostid не создаётся. Для работы файловой системы ZFS он нужен, и его необходимо создать не взирая на предупреждение об устаревшем методе идентификации. Если genhostid отсутвует, то нужно пустановить пакет initscripts, в который он входит
ZFS использует свой собственный механизм для хранения идентификатора хоста, который называется hostid. hostid хранится в метаданных пула ZFS и используется для идентификации узла, на котором находится пул.
Код: Выделить всё
genhostidКод: Выделить всё
[ -f /etc/hostid ] && echo trueКод: Выделить всё
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Код: Выделить всё
modprobe zfsКод: Выделить всё
lsmod |grep zfsКод: Выделить всё
dracut -fКод: Выделить всё
reboot
lsmod |grep 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"'Код: Выделить всё
mkfs.fat -F32 /dev/sda1Создадим пул ZFS и корневую файловую систему с оптимальными параметрамиtank/
tank/boot
tank/home
Код: Выделить всё
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=12 -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Указываем параметр altroot равным /sysroot чтобы не менять значение перед перезагрузкой.
При создании пула указываются два типа параметров:
- -o — параметры пула
- -O — параметры корневого dataset
- ashift - Размер физ. сектора (9,12) степень двойки 2^9=512 или 2^12=4048=4K
Внимание: Если будете переносить эту схемуна реальное железо (современные HDD с Advanced Format или NVMe/SSD), обязательно ставьте -o ashift=12 (размер сектора 4К, 2¹²). Если оставить 9 на диске с физическими 4К-секторами, пул будет работать, но вы получите дичайшую просадку производительности на операциях записи (Write Amplification) из-за постоянной перезаписи соседних блоков. - 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-o exec=off — с файловой системы запрещаем выполнять программы.
Создаём dataset для файловой системы boot.
Код: Выделить всё
zfs create \
-o compression=on -o atime=off \
tank/bootТеперь устанавливаем на параметр bootfs значение для dataset с загрузочной файловой системой
Код: Выделить всё
zpool set bootfs=tank/boot tankВ данном случае создаём 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Код: Выделить всё
mkdir -p /sysroot/boot/efi && mount /dev/sdb1 /sysroot/boot/efiКод: Выделить всё
rsync -axHAWXS --numeric-ids --info=progress2 \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found/*","/sysroot"} \
/* /sysrootКод: Выделить всё
zpool import -R /sysroot tank