Файловая система ZFS

Материал из Rosalab Wiki
Версия от 14:52, 21 апреля 2016; Trs (обсуждение | вклад) (Запуск ОС Роса с ZFS)

Это снимок страницы. Он включает старые, но не удалённые версии шаблонов и изображений.
Перейти к: навигация, поиск

ZFS пришла в мир Linux из операционной системы Solaris. Её возможности выходят за рамки рядовых файловых систем (ФС) и подробно рассмотрены в документе [Руководство по администрированию файловых систем ZFS Solaris].

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

zpool

Если традиционно ФС создают на разделах носителей информации, то ZFS реализует концепцию хранилища (англ. pool), способного объединить в себе произвольное количество как физических накопителей, так и их логических разделов. При этом многие технические вопросы ZFS берёт на себя, позволяя создать зеркальный массив из двух накопителей одной командой:

# zpool create pool mirror sdb sdc

Когда дублирование информации пользователя не требуется, накопители можно объединить, сложив их ёмкость и увеличив скорость доступа:

# zpool create pool sdb sdc

В вышеприведённых примерах pool — произвольное имя хранилища. sdb и sdc — сокращения от имен устройств /dev/sdb и /dev/sdc. Заметим, что в таком случае на каждом устройстве будут созданы GPT разметка и разделы:

Устр-во          Start   Конец Size Тип
/dev/sdc1         2048     31487999  15G Solaris /usr & Apple ZFS
/dev/sdc9     31488000     31504383   8M Solaris reserved 1

Можно передавать команде zpool create и имена существующих разделов, а так же файлов.

Если хранилище создано на переносном накопителе, для безопасного отключения служит команда:

# zpool export pool

а для подключения:

# zpool import pool

Когда имя хранилища не известно, команда импорта выполняется без его указания и выводит список возможных.

Логика работы ZFS такова, что извлечение физического накопителя без предварительного экспортирования не должно приводить к повреждению информации на нём. В крайнем случае возможна потеря только тех данных пользователя, которые ОС не успела записать. Например, при изменении текстового документа может случиться, что на «флешке» окажется прежняя, не изменённая версия. Но ситуация, когда в результате аварийного прерывания записи существующие данные оказались потеряны (ошибочно затёрты) — исключена. Для обеспечения этого ZFS использует метаданные, в частности контрольные суммы.

Запуск задачи очистки возможных ошибок метаданных производится командой:

# zpool scrub pool 

а проверка состояния:

# zpool status

Произведённые операции сохраняются в журнале, для просмотра которого служит

# zpool history

zfs

Создав вышеизложенным способом хранилище, можно обнаружить, что в коневом разделе смонтирован каталог с соответствующим именем. На самом деле, ему соответствует одноимённая файловая система, в чём можно убедиться, дав команду:

# zfs list

В таком виде уже возможно использовать ZFS — как обычную ФС. Если желательно монтировать традиционной командой mount и /etc/fstab то следует изменить соответствующее свойство таким образом:

# zfs set mountpoint=legacy pool

Для просмотра свойств предназначен вариант get, например, их перечень можно получить так:

# zfs get all

Ряд свойств должен быть знаком тем, кто редактировал файл /etc/fstab. ZFS хранит их поближе к характеризуемым структурам, что бы «инструкция по использованию» была под рукой. Но это не мешает использовать и привычный подход.

Зачем нужна zfs, когда есть zpool?

Как правило, предпочтительно отделять данные пользователя в /home от системных. Возможны и более сложные иерархии. ZFS позволяет не тратить время на вопрос «какие лучше выбрать размеры разделам?» — всё умещается в хранилище хорошо и так, а со сжатием LZ4 логический объём может превысить физический, грубо говоря, вдвое.

В таких сценариях автоматически создаваемая ФС не используется непосредственно для хранения данных. Её рассматривают как родительскую: задают свойства, которые требуется унаследовать дочерним структурам, например:

# zfs set compression=lz4 pool
# zfs set acltype=posixacl pool
# zfs set xattr=xa pool

# zfs create pool/ROOT
# zfs create pool/ROOT/rosa-1
# zfs create -o mountpoint=/home pool/home

Как видно, свойства можно задавать непосредственно при создании ФС, а не только менять позже. Отличная от legacy точка монтирования /home приведёт к тому, что pool/home окажется доступен по соответствующему пути в случае импорта, или команды zfs mount -a. Однако, нужно учитывать тонкость: свойство overlay по умолчанию off — если что-либо по заданному пути уже смонтировано, то оверлей создан не будет.

Помимо pool/ROOT/rosa-1 можно создать pool/ROOT/rosa-2 и установить два варианта ОС, например, скопировав содержимое одной ФС во вторую, или используя специальное средство — zfs clone. С учётом таких сценариев, а так же возможности chroot, вместо mountpoint=/ удобнее выбрать legacy (и если читатель выполнил пример из предыдущего раздела, то оно таким и унаследовано от pool)

Запуск ОС Роса с ZFS

Осуществляется просто, если на диске создан отдельный раздел /boot для grub2 и ядер ОС. В таком случае в grub.cfg в качестве параметра ядра root следует указать путь к корневому разделу, возможны различные варианты:

linux	/vmlinuz-4.4.7-nrj-laptop-1rosa-x86_64 root=ZFS=pool/ROOT/rosa-1 ro 
linux	/vmlinuz-4.4.7-nrj-laptop-1rosa-x86_64 root=zfs: ro  zfs=pool/ROOT/rosa-1

С этой задачей справляется update-grub2 из официальных репозиториев, но в некоторых случаях требуется недавняя beta версия. Так же желательно установить и соответствующее свойство:

# zpool set bootfs=pool/ROOT/rosa-1