Файловая система ZFS — различия между версиями

Материал из Rosalab Wiki
Перейти к: навигация, поиск
(zfs)
Строка 37: Строка 37:
 
== zfs ==
 
== zfs ==
  
Создав вышеизложенным способом хранилище, можно обнаружить, что в коневом разделе смонтирован каталог с соответствующим именем. На самом деле, ему соответствует одноимённая файловая система, в чём можно убедиться, дав команду:
+
Создав вышеизложенным способом pool, можно обнаружить, что в коневом разделе смонтирован каталог с соответствующим именем. На самом деле, ему соответствует одноимённая файловая система, в чём можно убедиться, дав команду:
 
  # zfs list
 
  # zfs list
 
В таком виде уже возможно использовать ZFS — как обычную ФС. Если желательно монтировать традиционной командой {{cmd|mount}} и {{File|/etc/fstab}} то следует изменить соответствующее ''свойство'' таким образом:
 
В таком виде уже возможно использовать ZFS — как обычную ФС. Если желательно монтировать традиционной командой {{cmd|mount}} и {{File|/etc/fstab}} то следует изменить соответствующее ''свойство'' таким образом:
Строка 48: Строка 48:
 
=== Зачем нужна zfs, когда есть zpool? ===
 
=== Зачем нужна zfs, когда есть zpool? ===
  
Как правило, предпочтительно отделять данные пользователя в {{File|/home}} от системных. Возможны и более сложные иерархии.
+
Как правило, предпочтительно отделять данные пользователя в {{File|/home}} от системных. В ряде случаев требования к гибкости файловой иерархии повышены, а заранее предугадать количество разделов не представляется возможным.
ZFS позволяет не тратить время на вопрос «какие лучше выбрать размеры разделам?» — всё умещается в хранилище хорошо и так, а со сжатием LZ4 логический объём может превысить физический, грубо говоря, вдвое.
+
ZFS избавляет пользователя от вопросов «какие лучше выбрать размеры разделам?» и позволяет организовать в едином поле произвольное множество файловых систем, распределяя общий объём памяти по мере надобности, а при необходимости даёт возможность добавить новые физические носители.
  
В таких сценариях автоматически создаваемая ФС не используется непосредственно для хранения данных. Её рассматривают как родительскую: задают свойства, которые требуется унаследовать дочерним структурам, например:
+
В таких сценариях автоматически созданную ФС не используют непосредственно для хранения данных. Её рассматривают как родительскую: задают свойства, которые требуется унаследовать дочерним структурам, например:
 
  # zfs set compression=lz4 pool
 
  # zfs set compression=lz4 pool
 
  # zfs set acltype=posixacl pool
 
  # zfs set acltype=posixacl pool
 
  # zfs set xattr=xa pool
 
  # zfs set xattr=xa pool
'''
+
Заметим, что при указании некорректного значения свойства, в качестве подсказки будет выдан список возможных.
 
  # zfs create pool/ROOT
 
  # zfs create pool/ROOT
 
  # zfs create pool/ROOT/rosa-1
 
  # zfs create pool/ROOT/rosa-1
Строка 62: Строка 62:
 
Как видно, свойства можно задавать непосредственно при создании ФС, а не только менять позже. Отличная от {{File|legacy}} точка монтирования {{File|/home}} приведёт к тому, что {{File|pool/home}} окажется доступен по соответствующему пути в случае импорта, или команды {{Cmd|zfs mount -a}}. Однако, нужно учитывать тонкость: свойство {{File|overlay}} по умолчанию {{File|off}} — если что-либо по заданному пути уже смонтировано, то оверлей создан не будет.
 
Как видно, свойства можно задавать непосредственно при создании ФС, а не только менять позже. Отличная от {{File|legacy}} точка монтирования {{File|/home}} приведёт к тому, что {{File|pool/home}} окажется доступен по соответствующему пути в случае импорта, или команды {{Cmd|zfs mount -a}}. Однако, нужно учитывать тонкость: свойство {{File|overlay}} по умолчанию {{File|off}} — если что-либо по заданному пути уже смонтировано, то оверлей создан не будет.
  
Помимо {{File|pool/ROOT/rosa-1}} можно создать {{File|pool/ROOT/rosa-2}} и установить два варианта ОС, например, скопировав содержимое одной ФС во вторую, или используя специальное средство — {{Cmd|zfs clone}}. С учётом таких сценариев, а так же возможности {{Cmd|chroot}}, вместо mountpoint=/ удобнее выбрать {{File|legacy}} (и если читатель выполнил пример из предыдущего раздела, то оно таким и унаследовано от {{File|pool}})
+
Помимо {{File|pool/ROOT/rosa-1}} можно создать {{File|pool/ROOT/rosa-2}} и установить два варианта ОС. Копию можно создавать не только привычным методом, но и используя механизм мгновенных ''снимков состояния'' {{Cmd|zfs snapshot}} и клонирования {{Cmd|zfs clone}}.
 +
С учётом таких сценариев, а так же возможности {{Cmd|chroot}}, вместо '''mountpoint=/''' удобнее выбрать {{File|legacy}} (и если читатель выполнил пример из предыдущего раздела, то оно таким и унаследовано от {{File|pool}})
  
 
== Запуск ОС Роса с ZFS ==
 
== Запуск ОС Роса с ZFS ==

Версия 06:57, 23 апреля 2016

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

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

# zfs list

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

# zfs set mountpoint=legacy pool

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

# zfs get all

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

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

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

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

# 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 snapshot и клонирования 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