LINUX.ORG.RU

Gentoo на ZFS

 , , , ,


14

5

Не спрашивайте - зачем. Просто так, потому что можно. Ну и к тому же можно ссылаться на этот топик в ответ на вбросы бздунов насчёт «а этот ваш Линукс умеет 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)



Проверено: JB ()

Ну и да, важный момент:
1) дедупликацию лучше не юзать, будет деградация по производительности через месяц-два лютая.
2) включение дедупликации НЕ ОБРАТИМО. то есть, если ты выключил её для тома - system wide она остается включенной.
3) кроме очень частных юзкейсов её лучше не юзать.

tazhate ★★★★★ ()
Ответ на: комментарий от tazhate

включение дедупликации НЕ ОБРАТИМО. то есть, если ты выключил её для тома - system wide она остается включенной

А если я её выключил для всех томов, включая сам пул?

Kindly_Cat ()
Ответ на: комментарий от Kindly_Cat

А если я её выключил для всех томов, включая сам пул?

То она будет отключена для новых томов. А со всеми остальными ты её уже не выключишь :)
Привет реинсталл :)

tazhate ★★★★★ ()
Ответ на: комментарий от Kindly_Cat

У тебя потрясная возможность это проверить. Главное, веди лог замеров скорости раз в неделю, например.

tazhate ★★★★★ ()
Ответ на: комментарий от tazhate

Он не прав

Можно же проверить, не? Например, записать два раза один и тот же фильм и посмотреть как изменится свободное место.

Kindly_Cat ()
Ответ на: комментарий от tazhate

Скопировал два раза один и тот же фильм, свободное место сократилось два раза на размер фильма.

Kindly_Cat ()
Ответ на: комментарий от tazhate

Не, ну понятно, что уже дедуплицированные данные раздедуплицировать не получится. Только я же мир всё равно обновлять когда-нибудь буду, а свежие данные уже не будут дедуплицированы.

Kindly_Cat ()

Ну и к тому же можно ссылаться на этот топик в ответ на вбросы бздунов насчёт «а этот ваш Линукс умеет ZFS?». Умеет, как видите.

Судя по тому что ты применял genkernel это Kernels with builtin ZFS support lack a way to mount a ZFS dataset as a rootfs without an initramfs стало быть правда.

Устанавливать нужно это милое ядрышко (перед этим нужно будет включить флаг zfs, я думаю, разберётесь сами):

:) в этом милом ядрышке кстати говоря есть аналог epatch_user т.е. если нужного патча в sys-kernel/geek-sources нет ложите его в /etc/portage/patches/sys-kernel/geek-sources и он подхватится автоматом ;)

Не знаю, как получится у вас, а лично у меня initramfs не может импортировать пул и потому вываливается в busybox.

А у меня подобная беда с initramfs и systemd… а руками из базибокса работает!

Сжатие lzjb не так заметно экономит место (это просто быстрый алгоритм), а вот gzip-9 сжал дерево portage с 350 Мб до 256 Мб

> du -h *current.sqfs 
95M	sqfs.layman-current.sqfs
92K	sqfs.local-current.sqfs
71M	sqfs.portage-current.sqfs
> layman -l

 * gnome                     [Git       ] (git://git.overlays.gentoo.org/proj/gnome.git                                      )
 * init6                     [Git       ] (git://github.com/init6/init_6.git                                                 )
 * pentoo                    [Subversion] (https://pentoo.googlecode.com/svn/portage/trunk/                                  )
 * stuff                     [Git       ] (https://github.com/megabaks/stuff.git                                             )
 * v-fox                     [Git       ] (git://github.com/v-fox/gentoo_overlay.git                                         )
 * x11                       [Git       ] (git://git.overlays.gentoo.org/proj/x11                                            )

В итоге я просто выставил legacy на все ФС, внёс их в fstab и выкинул zfs-shutdown из скриптов выключения.

У тебя zfs-shutdown на выключении тоже глючил?

init_6 ★★★★★ ()
Ответ на: комментарий от Kindly_Cat

У тебя SSD? Давай померяемся iozone?

Да, но на ext4 и в mdadm. И мой mdadm пока не умеет trim.
У меня вертекс 3. Можно померяться :)

tazhate ★★★★★ ()
Ответ на: комментарий от Kindly_Cat

Да, zfs-shutdown начинает ругаться, если монтировать zfs через fstab.

У меня с zfs не на рутфс zfs-shutdown глючит при выключении. Там сперва модуль zfs выгружается а потом zfs-shutdown кричит на то что модуль zfs недоступен :)

init_6 ★★★★★ ()
Ответ на: комментарий от Kindly_Cat

Для начала можно так:

tazwork ~ # dd if=/dev/zero of=test.img bs=8k count=256k
262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 9.3338 s, 230 MB/s
tazhate ★★★★★ ()
Ответ на: комментарий от tazhate
nona / # dd if=/dev/zero of=test.img bs=8k count=256k
262144+0 записей получено
262144+0 записей отправлено
 скопировано 2147483648 байт (2,1 GB), 1,98958 c, 1,1 GB/c

Классно, да? :D

Kindly_Cat ()
Ответ на: комментарий от Kindly_Cat
tazwork ~ # dd oflag=nocache if=/dev/zero of=test.img bs=8k count=256k conv=sync
262144+0 records in
262144+0 records out
2147483648 bytes (2.1 GB) copied, 9.82737 s, 219 MB/s

И еще так можно.

tazhate ★★★★★ ()
Ответ на: комментарий от tazhate

Походу, ZFS пофиг на эти флаги.

nona / # dd oflag=nocache if=/dev/zero of=test.img bs=8k count=256k conv=sync
262144+0 записей получено
262144+0 записей отправлено
 скопировано 2147483648 байт (2,1 GB), 2,19222 c, 980 MB/c
Kindly_Cat ()
Ответ на: комментарий от tazhate

Но у меня SSD такую скорость явно выдать не в состоянии. Обычно где-то на уровне 250 Мб/сек cкорость была.

Kindly_Cat ()
Ответ на: комментарий от Kindly_Cat

Ты попробуй чонить делать с диском в это время - угадаешь :)

tazhate ★★★★★ ()

Я почитал маны, там что нельзя удалить раздел из пула? Или в каких-то случаях нельзя?

vertexua ★★★★☆ ()

Хороши твои десктопы, пили еще! Красотища.

SjZ ★★★★★ ()

даже жёсткое включение ZFS в ядро не позволяет загрузить систему с корня ZFS (нужны утилиты для работы с ZFS, которые должны находиться в initramfs)

т.е. ядро без initramfs с корнем на zfs не собрать?

templarrr ★★★★★ ()
Ответ на: комментарий от templarrr

Собрать-то можно, а вот систему загрузить не получится :)

Kindly_Cat ()
Ответ на: комментарий от Kindly_Cat

zpool iostat
Что сие значит?

Ну а мана там в комплекте не идёт? Встроенная измерялка производительности ZFS. Например, zpool iostat zero 1 будет каждую секунду для пула 'zero' выводить IOPS и скорости чтения/записи.

TuxR ★★★★ ()

насчет проблем с dracut и руководством по его использованию - если не забуду, напомню Richard Yao обновить документацию. Если сидишь в IRC - будет лучше если ты заглянешь на #zfsonlinux на FreeNode и потыкаешь его сам(его ник - ryao). И да, поддержка ZFS в genkernel из главного дерева появилась исключительно благодаря ему, за что ему от меня респект(хотя я собирал initrafms на виртуалке еще используя его оверлей, правда dracut-ом не пользовался).

Pinkbyte ★★★★★ ()

Я, попробовав раз снапшоты ещё в Btrfs, так и не смог от них отказаться.

+100500. Btrfs после опробования ZFS(даже еще не до конца портированной) кажется аутсайдером.

Pinkbyte ★★★★★ ()
Ответ на: комментарий от tazhate

Он не прав.

Хм. Когда последний раз проверял после выключения дедупликации и tar/untar всех данных на томе(не пуле, у меня только один том с дедупликацией), dedup ratio стал 1.0(то есть дедупликация таки отключилась). zfs destroy не делал

Pinkbyte ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.