Для использования ZFS в Ubuntu для начала нужно подключить нужный PPA-репозиторий. Поскольку все последующие действия потребуют прав суперпользователя, перво-наперво обретаем их на длительное время командой
$ sudo -i
с вводом пользовательского пароля. А затем собственно подключаем репозиторий:
# add-apt-repository ppa:zfs-native/stable
Или, при желании поэкспериментировать --
# add-apt-repository ppa:zfs-native/daily
Обновляем кэш:
# apt update
Теперь строим дерево зависимостей — в Mint 17.1 Rebecca это обязательный шаг, хотя ранее я обходился без него:
# apt build-dep ubuntu-zfs
И собираем необходимые пакеты:
# apt install ubuntu-zfs
Поскольку в репозитории они существуют не в бинарном виде, а в виде исходников, приведённая команда потянет за собой сборочный инструментарий. И сама сборка пакетов займёт определённое время. Но рано или поздно она закончится, и можно будет скомандовать
# modprobe zfs
и проверить результат командой
# lsmod | grep zfs
вывод которой будет выглядеть примерно так:
zfs 1158757 4
zcommon 51283 1 zfs
znvpair 81997 2 zfs,zcommon
zavl 15011 1 zfs
zunicode 331226 1 zfs
spl 88617 5 zfs,zcommon,znvpair,zavl,zunicode
После чего остаётся создать точку монтирования для пула ZFS — в моём случае таким образом:
# mkdir /home/data
Дать ей атрибуты принадлежности обычному пользователю:
# chown -R alv:alv /home/data
Теперь можно приступать к применению ZFS в мирных практических целях.
Освоив ранее основные понятия, мы научились понимать ZFS. Для обратной же задачи — чтобы ZFS понимала нас — нужно ознакомиться с её командами. Главные из них — две: zpool для создания и управления пулами, и zfs для создания и управления наборами данных. Немного, правда? Хотя каждая из этих команд включает множество субкоманд, с которыми мы со временем разберёмся.
Очевидно, что работу с ZFS следует начинать с создания пула хранения. Начнём с этого и мы. В простейшем случае однодисковой конфигурации это делается так:
# zpool create tank dev_name
Здесь create — субкоманда очевидного назначня, tank — имя создаваемого пула (оно обычно даётся в примерах, но на самом деле может быть любым — с учётом ограничений ZFS, я использую имя data), а dev_name — имя устройства, включаемого в пул. Каковое может строиться по любой из описанных ранее моделей. И, чтобы не повторяться, напомню: все команды по манипуляции с пулами и наборами данных в них выполняются от лица администратора.
В случае, если в состав пула включается один диск, и второго не предвидится, можно использовать имя устройства верхнего уровня — например, sda для цельного устройства (обратим внимание, что путь к файлу устройства указывать не нужно). Однако реально такая ситуация маловероятна: загрузка с ZFS проблематична, так что как минимум потребуется раздел с традиционной файловой системой под /boot (и/или под корень файловой иерархии), так что команда примет вид вроде следующего:
# zpool create data sda3
Однако если можно ожидать в дальнейшем подсоединения новых накопителей и их включения в существующий пул, то лучше воспользоваться именем по модели by-id, например:
# zpool create data ata-Crucial_CT512MX100SSD1_14330CEEA98C-part3
Очевидно, что в случае однодискового пула ни о какой избыточности говорить не приходится. Однако уже при двух дисках возможны варианты. Первый — создание пула без избыточности:
# zpool create data dev_name1 dev_name2
где dev_name1 и dev_name1 — имена устройств в принятой модели именования.
В приведённом примере будет создано нечто вроде RAID’а нулевого уровня, с расщеплением (stripping) данных на оба устройства. Каковыми могут быть как дисковые разделы, так и диски целиком. Причём, в отличие от RAID0, диски (или разделы) не обязаны быть одинакового размера.
После указанной команды никаких сообщений не последует. No news — good news, говорят англичане; в данном случае это означает, что пул был благополучно создан. В чём можно немедленно убедиться двумя способами. Во-первых, в корневом каталоге появляется точка его монтирования /data. А во-вторых, этой цели послужит субкоманда status: # zpool status data
которая выведет нечто вроде этого:
pool: data
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
mypool ONLINE 0 0 0
sdd ONLINE 0 0 0
sdf ONLINE 0 0 0
errors: No known data errors
А с помощью субкоманды list можно узнать объём новообразованного пула:
# zpool list data
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
data 18,9G 93K 18,9G 0% 1.00x ONLINE -
Легко видеть, что он равен сумме объёмов обеих флэшек, если «маркетинговые» гигабайты пересчитать в «настоящие».
К слову сказать, если дать субкоманду list без указания аргумента — имени пула, то она выведет информацию о всех пулах, задействованных в системе. В моём случае это выглядит так:
Читать дальше