В свете выхода первой стабильной версии ZFSonLinux решил снова опробовать это чудо инженерной мысли на своём домашнем десктопе. Есть несколько существенных причин почему стоит это сделать:
Итак, решено было перевести на ZFS корень, а заодно - и терабайтное файлохранилище. Корень расположен на стареньком 80 Гб SSD Intel 320, файлохранилище - на ещё более старом Seagate Barracuda 7200.12. Корень будет находится на /dev/sda2, на /dev/sda1 будет создан Ext2-раздел размером в 1 Гб под каталог /boot. Конечно же, для этих целей необходима вторая рабочая система (live либо установленная на другой накопитель) с ядром, умеющим работать с ZFS. Наиболее удобное ядро - geek-sources из оверлея init6.
Из-за несовместимости GPLv2 и CDDL придётся создать initramfs, содержащий всё необходимое для работы с ZFS. Делается это, впрочем, чрезвычайно легко. Сначала нужно установить Grub2:
После этого можно создавать файловые системы для конкретных данных и в зависимости от типов данных задать отдельные опции:
ФС для профилей пользователей:
Просмотреть опции файловой системы или пула можно командой вида:
На файлохраналище всё в общем то же самое, за исключением некоторых нюансов:
- ZFS - чрезвычайно надёжная файловая система. Практически все использующиеся в Linux/Windows ФС исходят из того, что накопители данных безотказны и надёжны, что, конечно же, далеко не так. ZFS основана на недоверии накопителям, поэтому имеет обширный арсенал для выживаемости вверенных ей данных. Это и контрольные суммы для каждого блока, и автоматическое восстановление повреждённых файлов, а также более экзотические решения вроде максимального разнесения данных и метаданных по всему объёму накопителя.
- Принцип "файловая система = каталог". Конечно, это грубое изложение, но суть передаётся точно: на одном разделе можно создать сколько файловых систем ZFS, задавая каждой из которых собственные опции (тип контрольных сумм, квоты, тип сжатия, и т.д. и т.п.), и которые будут выглядеть как обычные каталоги.
- Снапшоты, клоны и откаты. Снапшот - это мгновенный срез, снимок состояния файловой системы. Например, перед рискованным обновлением системы можно сделать снапшот системной ФС, который впоследствии можно будет примонтировать как обычную ФС, откатиться к нему одной командой или склонировать.
- Экономия дискового пространства благодаря сжатию. На HDD малоактуально, а вот для SSD - самое то. На выбор несколько алгоритмов: lzjb, lzo, gzip[1-9] и другие.
- ZFS весьма требовательна к аппаратному обеспечению: во-первых, она очень нестабильно работает на 32-битных машинах (если вообще работает), во-вторых - ест ОЧЕНЬ много оперативной памяти под кэши (хотя возможно ограничить её аппетиты, это будет рассмотрено ниже). Лично я бы не советовал всерьёз присматриваться к этой ФС, если на машине меньше 4 Гб оперативки.
- На HDD она явно не демонстрирует чудеса скорости, т.к. её алгоритмы разбрасывают данные по всей ФС. Особенно задержки заметны при забитом кэше. Например, KSnapshot или Dolphin, обращаясь к каталогу со скриншотами (всего чуть больше 600 файлов), испытывают раздражающие задержки. На SSD, понятное дело, эта проблема сходит на нет.
- Лицензия ZFS (CDDL) несовместима с лицензией Linux (GPLv2). Поэтому чтобы использовать ZFS, необходимо патчить ядро, танцевать с initrd и т.д. Очень неприятно.
Итак, решено было перевести на ZFS корень, а заодно - и терабайтное файлохранилище. Корень расположен на стареньком 80 Гб SSD Intel 320, файлохранилище - на ещё более старом Seagate Barracuda 7200.12. Корень будет находится на /dev/sda2, на /dev/sda1 будет создан Ext2-раздел размером в 1 Гб под каталог /boot. Конечно же, для этих целей необходима вторая рабочая система (live либо установленная на другой накопитель) с ядром, умеющим работать с ZFS. Наиболее удобное ядро - geek-sources из оверлея init6.
Установка ядра с поддержкой ZFS
Подключение оверлея init6:
Далее следует добавить некоторые флаги и размаскировать флаг "kernel-builtin":layman -a init6
echo "sys-kernel/geek-sources genpatches uksm zfs" >> /etc/portage/package.use
mkdir -p /etc/portage/profile
echo "sys-fs/zfs -kernel-builtin" > /etc/portage/profile/package.use.maskи установить ядро:
emerge geek-sourcesВ настройках ядра соответствующие опции должны быть включены:
Из-за несовместимости GPLv2 и CDDL придётся создать initramfs, содержащий всё необходимое для работы с ZFS. Делается это, впрочем, чрезвычайно легко. Сначала нужно установить Grub2:
echo "sys-boot/grub libzfs" >> /etc/portage/package.use
emerge grubзатем Genkernel:
emerge genkernelи можно собирать (и устанавливать заодно) ядро:
genkernel all --no-clean --makeopts=-j8 --zfs --bootloader=grub2Genkernel соберёт всё что нужно и добавит записи в конфиг Grub2.
Работа с ZFS
Первый шаг - создание пулов (pool). Я создал по отдельному пулу на каждое устройство:
zpool create zero /dev/sda2
zpool create data /dev/sdb1Теперь стоит изменить некоторые опции:
zfs set mountpoint=legacy zero (чтобы монтирование производилось средствами Linux, а не ZFS)
zfs set compress=lzjb zero (включение быстрого алгоритма сжатия)
zfs set atime=off zero (обновление временных меток последнего доступа снижает скорость, поэтому их лучше отключить)
zfs set checksum=off zero (контрольные суммы лучше включать локально)То же самое было выставлено и для пула data. Это глобальные настройки, они будут унаследованы всеми файловыми системами этих пулов.
После этого можно создавать файловые системы для конкретных данных и в зависимости от типов данных задать отдельные опции:
zfs create zero/core (для самой системы)
zfs set mountpoint=legacy zero/core
zfs set checksum=fletcher4 zero/core (целесообразно включить контрольные суммы для системных файлов, а fletcher4 - очень быстрый алгоритм)
zfs create zero/repo (для репозиториев)
zfs set mountpoint=legacy zero/repo
zfs set compress=gzip-9 zero/repo (максимальный уровень сжатия - в этой ФС будут храниться огромное количество нечасто читаемых/записываемых текстовых файлов)Для ФС с репозиториями целесообразно не включать контрольные суммы. Дальше:
zfs create zero/depo (для депозиториев - архивов с исходниками и каталога ядра)Можно задать те же опции, что и для репозиториев.
ФС для профилей пользователей:
zfs create zero/shellДля этой ФС оптимальными будут опции системной ФС (т.е. zero/core).
Просмотреть опции файловой системы или пула можно командой вида:
zfs get <option> <fs>Например:
zfs get all zero/core
На файлохраналище всё в общем то же самое, за исключением некоторых нюансов:
- Контрольные суммы fletcher4 заданы уже на уровне пула (т.к. данные в файлохранилище ценнее данных системы)
- На ФС для графики и музыки сжатие было отключено
Для примера - опции ФС data/Pictures:
Настройка системы на работу с ZFS
Файловые системы ZFS должны быть прописаны в /etc/fstab в таком стиле:
Если после перезагрузки initramfs вываливается в консоль, будучи не в состоянии примонтировать ФС ZFS, следует в этой консоли ввести:zero/core / zfs noatime 0 0
zpool import -f
exit
Снапшоты и клоны
Создание снапшота корня перед обновлением:
Для просмотра списка созданных снапшотов используется команда zfs list с ключом -t snapshot:zfs snapshot zero/core@kde-4.10.1
zfs list -t snapshot
Можно сразу увидеть сколько места занимает тот или иной снапшот, в отличие от Btrfs, на которой узнать размер созданных снапшотов практически невозможно.
Снапшоты можно монтировать как обычные ФС:
Но снапшоты доступны лишь на чтение. Чтобы что-то записать в снапшот, следует его клонировать:
zfs clone zero/core@before_vmware zero/core/before_vmware_cloneМонтируется клон так же, как и снапшот.
Некоторые итоги
За пару месяцев использования ZFS уже можно сделать кое-какие выводы:
- ZFS малопригодна для большого файлохранилища на HDD. Из-за очень большой фрагментации считывающие головки HDD бешено метаются по всей поверхности диска, что значительно снижает скорость работы с файлами и усиливает износ механики HDD. В общем, стихия ZFS - это SSD.
- На SSD ZFS очень быстра, признаков просадки производительности не замечено.
- Количество занятой оперативной памяти может шокировать неподготовленного пользователя. Типичная картина:








Комментариев нет:
Отправить комментарий