Рассказы о ZFS. Её команды: создание файловых систем

Пулы хранения представляют собой вместилища для наборов данных, для манипуляции которыми предназначена вторая из главнейших команд — zfs. Самsми важными наборами данных являются файловые системы, к рассмотрению которых мы и переходим.

Для создания файловых систем предназначена субкоманда create команды zfs, которая требует единственного аргумента — имени создаваемой ФС и обычно не нуждается ни в каких опциях:

# zfs create pool_name/fs_name

Внутри пула можно создавать сколь угодно сложную иерархию файловых систем. Единственное условие — родительская файловая система для системы более глубокого уровня вложенности должна быть создана заблаговременно. Ниже я покажу это на конкретном примере создания файловых систем внутри каталога /home — наиболее оправданное место для размещения наборов данных ZFS.

В общих чертах я уже описывал эту процедуру в одном из набросков, так что опущу вещи, не относящиеся прямо к файловым системам ZFS (вроде предварительной подготовки дисков), но относящиеся рассмотрю более подробно.

Однако начну я немножечко издалека. При стандартной установке openSUSE не обойтись без создания аккаунта обычного пользователя, и, следовательно, в каталоге /home будет присутствовать по крайней мере один подкаталог — /home/username. Смонтировать же файловую систему ZFS в непустой каталог невозможно, и, значит, мы не можем сразу прибегнуть к опции -m для определения «постоянной прописки» создаваемого пула, как это было описано на предыдущей странице.

Поэтому для начала делаю для пула «прописку» во временной точке — пусть это будет традиционный /tank:

# zpool create -o  ashift=12 tank ata-SanDisk_SDSSDX120GG25_120823400863-part3 ata-SanDisk_SDSSDX120GG25_120823402786-part3

Теперь я создаю корневую файловую систему для домашнего каталога:

# zfs create tank/home

а внутри неё — необходимые дочерние ветви, как то:

# zfs create tank/home/alv

которая потом заменит мой домашний каталог — в нём я не держу ничего, кроме конфигурационных файлов;

# zfs create tank/home/proj

это файловая система для моих текущих проектов;

# zfs create tank/home/other

место помещения некоторых других рабочих материалов;

# zfs create tank/home/test

файловая система для всякого рода экспериментов и тестов;

# zfs create tank/home/media

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

# zfs create tank/home/media/audio

то есть любимых песен, и

# zfs create tank/home/media/video

для любимых фильмов — для их пересчёта мне хватает пальцев рук.

Как и было обещано разработчиками ZFS, процедура ничуть не сложнее, чем создание обычных каталогов. Благодаря этому файловые системы можно легко создавать по мере надобности, для решения какой-либо частной задачи. И столь же легко уничтожать их, когда задача эта выполнена. Что делается таким образом:

# zfs destroy pool_name/fs_name

Использовать субкоманду destroy следует аккуратно: никакого запроса на подтверждение при этом не будет. Правда, и уничтожить файловую систему, занятую в каком-либо текущем процессе, можно только с указанием опции -f, но это может повлечь непредсказуемые последствия. А файловую систему, содержащую системы дочерние, не получится убить и таким образом.

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

$ mount | grep tank
tank/home on /tank/home type zfs (rw,atime,xattr)
tank/home/alv on /tank/home/alv type zfs (rw,atime,xattr)
tank/home/media on /tank/home/media type zfs (rw,atime,xattr)
tank/home/other on /tank/home/other type zfs (rw,atime,xattr)
tank/home/proj on /tank/home/proj type zfs (rw,atime,xattr)
tank/home/test on /tank/home/test type zfs (rw,atime,xattr)
tank on /tank type zfs (rw,atime,xattr)

Для обеспечения монтирования файловых систем ZFS при рестарте машины не требуется также никаких записей в файле /etc/fstab: это (при соблюдении некоторых условий, о которых я уже упоминал и к которым ещё вернусь) также происходит само собой, совершенно нечувствительно для пользователя. Правда, если для файловой системы ZFS определить свойство mountpoint=legacy, то с ней можно управляться и традиционным способом, однако ни малейшей необходимости в этом я не ощутил.

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

# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank              136K   199G   136K  /tank
tank/home         136K   199G   136K  /tank/home
tank/home/alv     136K   199G   136K  /tank/home/alv
tank/home/media   136K   199G   136K  /tank/home/media
tank/home/other   136K   199G   136K  /tank/home/other
tank/home/proj    136K   199G   136K  /tank/home/proj
tank/home/test    136K   199G   136K  /tank/home/test

Доступное пространство уменьшается равномерно по мере разрастания файловых систем. Так, на данный момент в моей системе это выглядит так:

# zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
tank             20,8G   175G   136K  /tank
tank/home        20,8G   175G   176K  /home
tank/home/alv     362M   175G   362M  /home/alv
tank/home/media  3,08G   175G  3,08G  /home/media
tank/home/other  2,12G   175G  2,12G  /home/other
tank/home/proj   4,25G   175G  4,25G  /home/proj
tank/home/test   11,0G   175G  11,0G  /home/test

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

Казалось бы, зачем городить турусы на колёсах с файловой системой, если для тех же целей можно ограничиться обычными каталогами? Дело в том, что в наборах данных ZFS мы имеем дело с полноценными файловыми системами, для которых могут быть установлены индивидуальные свойства, аналогичные опция монтирования файловых систем традиционных. Чем мы и займёмся на следующей странице.


Назад | Рассказы о ZFS | Вперёд