Переход с BTRFS на ZFS on Linux

При замене дисков BTRFS отказался добавлять в массив диски объемом меньше, чем старые диски. Решено сделать бекап и заодно перейти на ZFS.

Уничтожение массива BTRFS

Смотрим какие диски находятся в массиве:

$ btrfs filesystem show
Label: none  uuid: 68b18a28-708b-4f86-bd92-e97681f0e266
	Total devices 4 FS bytes used 63.90GiB
	devid    1 size 232.89GiB used 232.88GiB path /dev/sdb
	devid    2 size 232.89GiB used 232.88GiB path /dev/sdc
	devid    3 size 232.89GiB used 232.88GiB path /dev/sdd
	devid    4 size 232.89GiB used 232.88GiB path /dev/sde

Размонтируем раздел и удаляем массив:

$ umount /opt
$ wipefs -t btrfs /dev/sdb /dev/sdc /dev/sdd /dev/sde
/dev/sdb: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sdc: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sdd: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d
/dev/sde: 8 bytes were erased at offset 0x00010040 (btrfs): 5f 42 48 52 66 53 5f 4d

При замене дисков выполняем «echo 1 > /sys/block/sdX/device/delete» поочередено. После того, как на горячую вставите диск он автоматически определится без небходимости сканирования SATA порта.

Установка ZFS

Теперь удаляем BTRFS и устанавливаем ZFS on Linux:

$ yum remove btrfs-progs
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
$ yum install http://download.zfsonlinux.org/epel/zfs-release.el7_4.noarch.rpm
$ gpg --quiet --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-zfsonlinux
$ yum install zfs

Ну как же без траблов. Во время установки вылезла следующая ошибка хотя kernel-devel был установлен:

Loading new zfs-0.7.12 DKMS files...
Building for 3.10.0-957.21.3.el7.x86_64
Building initial module for 3.10.0-957.21.3.el7.x86_64
configure: error: 
	*** Please make sure the kmod spl devel <kernel> package for your
	*** distribution is installed then try again.  If that fails you
	*** can specify the location of the spl objects with the
	*** '--with-spl-obj=PATH' option.  Failed to find spl_config.h in
	*** any of the following:
	/usr/src/spl-0.7.12/3.10.0-957.21.3.el7.x86_64
	/usr/src/spl-0.7.12
Error! Bad return status for module build on kernel: 3.10.0-957.21.3.el7.x86_64 (x86_64)
Consult /var/lib/dkms/zfs/0.7.12/build/make.log for more information.
warning: %post(zfs-dkms-0.7.12-1.el7_4.noarch) scriptlet failed, exit status 10
Non-fatal POSTIN scriptlet failure in rpm package zfs-dkms-0.7.12-1.el7_4.noarch

После перезагрузки «lsmod|grep zfs» не обнаружил никаких модулей. Вообще очень странная ошибка. В своей практике впервые встречаю такое. Не долго думая обновляем ОС и пробуем переустановить:

$ yum upgrade
$ reboot
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
$ yum remove zfs zfs-kmod spl spl-kmod libzfs2 libnvpair1 libuutil1 libzpool2 zfs-release
$ yum install http://download.zfsonlinux.org/epel/zfs-release.el7_6.noarch.rpm
$ yum clean metadata
$ yum install zfs
$ reboot
$ lsmod|grep zfs
zfs                  3564425  3 
zunicode              331170  1 zfs
zavl                   15236  1 zfs
icp                   270148  1 zfs
zcommon                73440  1 zfs
znvpair                89131  2 zfs,zcommon
spl                   102412  4 icp,zfs,zcommon,znvpair

Вроде обновление помогло. Все установилось без ошибок и модуль загрузился.

Создаем RAID массив

При создании пула ZFS по-умолчанию монтирует раздел в root. Создадим RAID0+1 и примонтируем в /opt. Пул назовем data:

$ zpool create data mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde
$ zfs get mountpoint data
NAME  PROPERTY    VALUE       SOURCE
data  mountpoint  /data       default
$ zfs set mountpoint=/opt data
$ df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/cl_ethan-root   50G   28G   23G  56% /
devtmpfs                    16G     0   16G   0% /dev
tmpfs                       16G     0   16G   0% /dev/shm
tmpfs                       16G  9.8M   16G   1% /run
tmpfs                       16G     0   16G   0% /sys/fs/cgroup
/dev/sda1                 1014M  320M  695M  32% /boot
/dev/mapper/cl_ethan-home  165G   83G   82G  51% /home
tmpfs                      3.2G     0  3.2G   0% /run/user/1000
data                       431G  128K  431G   1% /opt
$ systemctl enable zfs.target

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

Как видите ничего сверхестественного и вполне себе выполнимо. Пусть статья и адаптирована изначально под CentOS, но рецепт подойдет и для любого другого дистрибутива Linux.

Ранее был пост о возможных осложнениях ZFS в FreeBSD, которое к счастью обошлось.