Моя дорогая Betsy. LMDE и ZFS

Алексей Федорчук

Описывать, что такое ZFS и для чего она нужна, не буду — об этом очень подробно сказано в соответствующем разделе книги про Linux Mint и его Cinnamon. Там же описано, как включается поддержка этой системы хранения данных в собственно Linux Mint.

Вводные замечания

Поскольку LMDE основана на пакетной базе Debian, подключение PPA-репозитория, в котором хранятся пакеты dkms (точнее, скрипты, обеспечивающие их сборку), обеспечивающие поддержку ZFS Ubuntu и её клонах, в том числе и в LM, оказывается невозможным. В то же время и аналогичные модули для собственно Debian’а, которые можно найти на сайте проекта ZFS on Linux, штатными средствами устанавливаться отказываются, жалуясь на то, что Betsy — не «чистый» Debian:

betsy-and-zfs_002
В принципе, как было описано в одной из предварительных заметок, это можно обойти ручной правкой файла /etc/apt/sources.list.d/zfsonlinux.list, получив работоспособную ZFS-систему. Однако после этого сообщение об ошибке будет появляться при любой операции с пакетами, и не всегда его можно игнорировать.

Поэтому, установив Betsy в качестве основной, а не тестовой системы, я пошёл по пути сборки статичных пакетов kmod. В отличие от пакетовdkms, автоматически регенерируемых при обновлении ядра, они жёстко привязаны к его версии. Однако специфика Mint такова, что больших неудобств это не доставит: ядро в обоих редакциях этого дистрибутива (и LM, и LMDE) обновляется достаточно редко и никогда не обновляется автоматически, так что вероятность случайно «потерять» пул ZFS с его наборами данных практически равна нулю. А уж если возникнет настоятельная потребность в обновлении ядра — заодно можно собрать и модули поддержки ZFS.

Сборка модулей

Для сборки модулей потребуется соответствующий инструментарий, каковой и надлежит установить первым делом:

$ apt install build-essential gawk alien fakeroot linux-headers-$(uname -r)
$ apt install install zlib1g-dev uuid-dev libblkid-dev libselinux-dev parted lsscsi wget

Возможно, некоторые пакеты из этих списков уже установлены (например, wget) — apt в Mint-реализации их просто проигнорирует, не споткнувшись.

Далее в какой-либо подходящий каталог скачиваются тарбаллы исходников SPL (Solaris Porting Layer) и собственно ZFS:

$ wget http://archive.zfsonlinux.org/downloads/zfsonlinux/spl/spl-0.6.4.1.tar.gz
$ wget http://archive.zfsonlinux.org/downloads/zfsonlinux/zfs/zfs-0.6.4.1.tar.gz

В примерах даны последние стабильные версии тарбаллов на момент сочинения этих строк (06.05.2015). Можно использовать их Git-версии, но это потребует лишних телодвижений и может привести к нестабильности, так что я от этого воздержался.

Разумеется, тарбаллы надлежит распаковать:

$ tar -xzf spl-0.6.4.1.tar.gz
$ tar -xzf zfs-0.6.4.1.tar.gz

Следующий шаг — конфигурирование и сборка модулей SPL, а также их инсталляция, ибо они необходимы для сборки собственно модулей поддержки ZFS:

$ cd spl-0.6.4.1/
$ ./configure
$ make deb-utils deb-kmod
$ apt *.deb

Теперь можно браться за собственно ZFS:

$ cd ../zfs-0.6.4.1/
$ ./configure
$ make deb-utils deb-kmod

Далее резонно собрать все модули вместе

$ mkdir ../kmod-zfs
$ mv *deb ../kmod-zfs/
$ mv ../spl-0.6.4.1/*deb ../kmod-zfs/

И установить их гуртом:

$ apt deb ../kmod-zfs/*deb

При этом модули spl будут переустановлены — так рекомендуется в официальном руководстве.

Включение поддержки

Включение поддержки выполняется просто — командой

$ sudo modprobe

А убедиться, что всё сделано правильно, можно, например, таким образом:

$ lsmod | grep zfs

Что на выходе даст такую картину:

zfs                  2064688  5
zunicode              328546  1 zfs
zcommon                39960  1 zfs
znvpair                58712  2 zfs,zcommon
spl                    69445  3 zfs,zcommon,znvpair
zavl                   13038  1 zfs

Однако после перезагрузки системы ни малейших следов модулей поддержки ZFS в ней не обнаружится. Чтобы они загружались автоматически на старте, нужно выполнить такую команду:

$ sudo update-rc.d zfs defaults

У меня после этого с загрузкой модулей всё было нормально. Однако говорят, что в некоторых случаях этого оказывается недостаточно. И тогда в конфиг SELinux’а (мы ведь видели его в списке предварительно устанавливаемых пакетов), то есть в файл /etc/selinux/semanage.conf надо добавить такую строку:

SELINUX=permissive

Она включает так называемый «разрешительный» режим, поскольку SELinux для ZFS on Linux еще не реализован. Впрочем, SELinux можно и вовсе отключить, о чём написано здесь. Правда, для меня так и осталось загадкой — а за каким зелёным он вообще устанавливался? В Ubuntu и её клонах ZFS прекрасно живёт без него.

Создание пула

Создание пулов ZFS различных видов было подробно рассмотрено в книжке о
Linux Mint и его Cinnamon, поэтому здесь я конспективно изложу порядок действий при создании простого пула на неразмеченном дисковом пространстве SSD объёмом 512 ГБ, оставшемся после разметки на нём разделов под традиционные файловые системы — корневую (/dev/sda1, 24 ГБ) и «домашнюю» /home/alv (/dev/sda2, 37 ГБ). Пространство это ранее было размечено как /dev/sda3, несло на себе файловую систему ext4, монтировалось в каталог /home/data, содержащий мои рабочие данные «первой необходимости» (текущие проекты, любимую музыку, виртуальные машины etc).

Для начала я «сбэкапил» всё содержимое раздела (кроме подкаталога lost+found, разумеется) на внешний носитель, а затем удалил его (теперь уже вместе с указанным подкаталогом). Заодно удалил и раздел — чистоты эксперимента ради, в принципе это не обязательно, достаточно, чтобы он был пуст. Удаление содержимого и раздела выполнялось с правами суперпользователя, полученными «на неопределённое время», так как они потребуются и для всех последующих действий. Дабы сохранить свой пользовательский шелл (Zsh) и его окружение, я сделал это командой

$ sudo -s

Сам пул был создан такой командой:

# zpool create -o ashift=12 -m /home/data data sda3

Здесь data — имя создаваемого (create) пула, а sda3 — имя «верхнего уровня» устройства, на котором он создаётся. В документации по ZFS on Linux использование имён «верхнего уровня» не рекомендуется, а предлагается прибегать к именованию по моделям by-id или by-path (подробнее об этом сказано здесь). Однако резоны в пользу этого для меня в данном случае рояля не играли, и я не стал заморачиваться.

Опция ashift=12 определяет размер блока в 4 КБ (212 = 4096), что равно размеру физического блока моего SSD. Она задана на всякий случай — теоретически ZFS должна бы определять размер блока автоматически, но, по словам Брайна Белендорфа, делает это не всегда корректно, что может привести к падению производительности пула.

Наконец, опция -m задаёт точку монтирования для файловой системы «верхнего уровня» пула (/home/data), которая при этом создаётся автоматически.

И последний штрих в деле создания пула — выполнение пары команды

# zpool export data
# zpool import data

Первая нужна для того, чтобы к пулу можно было получить доступ из другой системы (да и просто на всякий случай), вторая — для продолжения работы с ZFS.

Создание файловых систем

Разумеется, размещать данные можно непосредственно на файловой системе «верхнего уровня» пула, однако это лишает всякого смысла применение ZFS. Поэтому внутри неё целесообразно выделить вложенные файловые системы, или наборы данных (datasets). Опять же не буду вдаваться в детали (они были описаны в прошлой книжке), а на рецептурном уровне опишу, как можно (не обязательно нужно) действовать в случае простого пула.

Перво-наперво можно позаботиться о свойствах, которые будут общими для всех вложенных файловых систем. Они почти все рекурсивны, и поэтому имеет смысл сразу определить их для файловой системы «верхнего уровня». Хотя сначала стоит просмотреть свойства последней по умолчанию — это можно сделать такой командной конструкцией:

$ mount | grep zfs

которая выведет такую строку:

data on /home/data type zfs (rw,relatime,xattr,noacl)

Здесь я меняю два параметра:

# zfs set atime=off data
# zfs set xattr=off data

Опции noatime и noxattr будут унаследованы всеми наборами данных, сиречь файловыми системами, к созданию которых и приступаю:

# zfs create data/project
# zfs create data/media
# zfs create data/vbox

И так далее, сколько их потребуется впредь — хотя точно таким же способом их можно создавать в любой момент времени.

Для любой из вложенных файловых систем можно независимо от других устанавливать свойства, такие, как квоты, резервное пространство, компрессию, проверку контрольных сумм — за деталями опять же предлагаю обратиться к книжке про Mint (или документации).

Предварительное оглавление

Моя дорогая Betsy. LMDE и ZFS: 2 комментария

  1. > $ tar -xzf spl-0.6.4.1.tar.gz
    > $ zfs-0.6.4.1.tar.gz
    Во второй строке самой команды нет Или это возможности zsh ?
    За linux не поручусь, но во freebsd в штатной tar ключи, отвечающие за сжатие (z Z j J y), используются только в режиме «c» (создание), в остальных игнорируются.

  2. Нет, это ошибка, поправил.
    А ключи — да, всё верно, но просто привычка.

Добавить комментарий