Gentoo на ZFS
Не спрашивайте - зачем. Просто так, потому что можно. Ну и к тому же можно ссылаться на этот топик в ответ на вбросы бздунов насчёт «а этот ваш Линукс умеет ZFS?». Умеет, как видите.
Краткий мануал по красноглазию:
1) Создаём раздел для ZFS. После этого потребуется создать пул. Пул - это что-то вроде виртуального устройства.
zpool create zero /dev/sda2
«zero» - это моё название пула. У вас оно может быть любым другим. Просто создать пул как-то неинтересно, поэтому повключаем всякие разные плюшки ZFS. Включаем дедупликацию:
zfs set dedup=on zero
и сжатие:
zfs set compress=lzjb zero
и отключаем обновление временных меток:
zfs set atime=off zero
ну и отключаем монтирование средствами самой ZFS дабы избежать неудобств на стадии сборки системы в chroot:
zfs set mountpoint=legacy zero
2) Теперь у нас есть чистый пул, но пул - это ещё не ФС. Чтобы установить туда систему, нужно создать файловые системы на этом пуле. Прелесть ZFS в том, что на одном пуле можно создать кучу ФС, каждой из которых можно задать свои опции. Например, я создал ФС для корня (и уже при создании говорим zfs, что монтировать создаваемые ФС мы будем вручную через mount):
zfs create -o mountpoint=legacy zfs/system
Эта ФС унаследовала все опции (дедупликация, сжатие) от пула, потому что для корня такие опции, в общем-то, неплохи. Далее я создал ФС специально для дерева portage, оверлеев и каталога с исходниками ядра:
zfs create -o mountpoint=legacy zfs/src
Так как на этой ФС будет куча текстовых файлов, обращаться к которым придётся сравнительно редко, здесь имеет смысл задействовать несколько иные опции. Например, усилить сжатие (после дефиса указана степень сжатия, диапазон - от 1 до 9, по умолчанию 6):
zfs set compress=gzip-9 zero/src
и отключить дедупликацию (мне подумалось, что дедупликация на ФС с тоннами мелких файлов будет сильно отжирать ресурсы, да и сильное сжатие вполне экономит место):
zfs set dedup=off zfs/src
Отдельная ФС для /home:
zfs create -o mountpoint=legacy zero/home
Опции пусть будут унаследованы от пула. Далее я перестраховался и создал отдельную ФС для /var, потому что в какой-то там рассылке видел упоминание каких-то багов при дедупликации на /var. Посты были датированы ещё прошлым годом, с тех пор утекло много воды, но бережёного случай бережёт:
zfs create -o mountpoint=legacy zero/var
zfs set dedup=off zero/var
3) Далее у нас стандартная сборка Gentoo. Монтируем будущий корень:
mount -t zfs zero/system /mnt/system
и остальные ФС:
mount -t zfs zero/src /mnt/system/src
mount -t zfs zero/home /mnt/system/home
mount -t zfs zero/var /mnt/system/var
mount /dev/sda1 /mnt/system/boot
После чего монтируем нужные виртуальные ФС (proc, dev, sys), монтируем хранилище архивов с исходниками пакетов, в общем, всё по хэнбуку, поэтому не стану заострять на этом внимания. Внимание требуется на этапе установки и сборки ядра. Устанавливать нужно это милое ядрышко (перед этим нужно будет включить флаг zfs, я думаю, разберётесь сами):
layman -a init6
emerge geek-sources
На этапе сборки ядра нужно учесть некоторые детали. Например, в мануалах написано, что нужно включить опцию CONFIG_KALLSYMS и отключить CONFIG_PREEMPT (т.е. установить её в значение «Server») Первую-то я включил, а отключать вторую меня жаба задавила (эта опция влияет на отзывчивость ядра), тем более что на Гитхабе я читал, что в последних версиях zfsonlinux проблемы с этой опцией ядра устранены. После этого, конечно, включаем SPL и ZFS. Первая опция находится прямо в корне конфигуратора, а вторая - в секции «File systems». А вот далее важно не пойти на поводу мануалов Гитхаба, ибо это чревато феерическим ментальным трахом. В мануалах тех написано, что нужно добавить указанный там оверлей и установить оттуда особые версии dracut и genkernel для сборки initramfs с поддержкой ZFS, ибо даже жёсткое включение ZFS в ядро не позволяет загрузить систему с корня ZFS (нужны утилиты для работы с ZFS, которые должны находиться в initramfs). Собственно, я так и сделал. После чего на протяжении дня сношался с кривоглючным dracut, упорно не желавшим включать утилиты ZFS в initramfs. Я даже вытягивал какие-то древние версии dracut и устанавливал их через make install, потом уже добавлял нужные файлы в initramfs вручную - чего я только ни делал! А оказалось, что нужно было тупо забить на эти горе-мануалы и установить самый стандартный genkernel из официального дерева. И всё правильно собирается следующей командой:
genkernel all --no-clean --makeopts=-j16 --zfs --bootloader=grub2
вот и вся недолга. Если перед этим вы успели собрать и установить Grub2, то genkernel сам добавит в grub.cfg нужные опции (укажет ФС, с которой грузить систему, в моём случае это zero/system).
На стадии формирования списка загружаемых демонов нужно сделать следующее:
rc-update add zfs boot
rc-update add zfs-shutdown shutdown
4) Монтирование файловых систем ZFS. Вообще, монтировать их можно двумя способами: посредством утилиты zfs через задание точки монтирования:
zfs set mountpoint=$DIR $FS
или через fstab с предварительным отключением автомонтирования:
zfs set mountpoint=legacy $FS
Запись в fstab для, например, корня, не содержит ничего сверхъестественного:
zero/system / zfs noatime 0 0
Способ монтирования выбирать вам. Следует лишь иметь в виду, что при монтировании через fstab zfs-shutdown будет ругаться при выключении.
5) Вообще это нужно делать раньше, но, в принципе, пофиг:
hostid > /etc/hostid (это в chroot)
cp /etc/zfs/zpool.cache /mnt/system/etc/zfs
6) Если у вас меньше 2 Гб оперативки, то ZFS своим кэшем может сожрать всю раму и завесить систему. Поэтому имеет смысл ограничить её аппетиты:
echo "options zfs zfs_arc_max=512M" > /etc/modprobe.d/zfs.conf
Я выставил 1 Гб.
7) Отмонтируем все ФС, делаем
zpool export zero
и перезагружаемся в свежую систему. Не знаю, как получится у вас, а лично у меня initramfs не может импортировать пул и потому вываливается в busybox. Не проблема, входим в его шелл и импортируем пул вручную:
zpool import zero
exit
и система далее нормально загружается.
Какие профиты? Ну, она явно быстрее ранее используемой мной Btrfs. Опять же, на Btrfs нет дедупликации, и сжатие можно применить/отключить только на весь раздел. Сжатие lzjb не так заметно экономит место (это просто быстрый алгоритм), а вот gzip-9 сжал дерево portage с 350 Мб до 256 Мб, а каталог исходников ядра - так вообще в 2 раза, с 800 с лишним Мб до 400 с лишним. Причём на скорости сборки ядра это практически не отразилось (замерял через time). А ещё в ZFS есть контрольные суммы, так что о целостности системы можно вообще не беспокоиться. Но самое главное, конечно - это снапшоты. Я, попробовав раз снапшоты ещё в Btrfs, так и не смог от них отказаться.
Маленькое дополнение: почитав преисполненные страха комментарии про снижение скорости из-за дедупликации я её таки отключил на всех ФС. И ещё: возможно, я что-то не так делал, но монтирование ZFS посредством утилиты zfs я так и не осилил нормально. В итоге я просто выставил legacy на все ФС, внёс их в fstab и выкинул zfs-shutdown из скриптов выключения.
>>> Просмотр (1280x2048, 1178 Kb)