ZFS краткие заметки

zdb zfs_arc_max zfs encryption zfs magic number

Установка ограничения по используемой RAM

Например, необходимо установить ограничение по потребляемой ОЗУ на уровне ⅛ от общего объема памяти.

### Limit ZFS memory consumption to 1/8 total RAM
TRAM=`cat /proc/meminfo | head -n 1 | awk '{ print $2}'`
ZRAM=`expr $TRAM / 8`
echo "options zfs zfs_arc_max=$ZRAM" | sudo tee -a /etc/modprobe.d/zfs.conf

Зависимости для установки в Debian/Ubuntu

sudo apt-get install build-essential autoconf libtool gawk alien fakeroot linux-headers-$(uname -r)
sudo apt-get install zlib1g-dev uuid-dev libattr1-dev libblkid-dev libselinux-dev libudev-dev libssl-dev
sudo apt-get install parted lsscsi ksh

Шифрованная ZFS

Шифрование на собственном уровне поддерживается только, начиная с 7-ой версии zfs.
На момент написания статьи, ее не было в репозиториях даже для последней версии Debian 9.7 (проверено 27.01.19)

Соответственно, надо компилировать из исходников.

Официальное рабочее описание процедуры здесь 

cd /opt
git clone https://github.com/zfsonlinux/zfs
cd ./zfs
git checkout master
sh autogen.sh
./configure
make -s -j$(nproc)

После make надо выполнить от root:

make install
modprobe zfs

27.01.18 установил версию 0.8.0-rc3_24_gc853f382d
Если не запускается - проверить и удалить модуль spl - он не нужен.
Еще надо отметить, что начиная с версии 7.1 библиотека SPL входит в единый пакет исходников, вместе с ZFS.
Для версий <= 7.0 эти пакеты шли по отдельности.

rmmod /lib/modules/4.9.0-8-amd64/extra/spl/spl.ko

Создание шифрованной файловой системы:

zfs create -o encryption=on -o keyformat=passphrase -o keylocation=prompt -o utf8only=on -o atime=off -o compression=lz4 sigma/encrypted

Монтирование шифрованной ФС:

zfs mount -l sigma/encrypted

Алиасы дисковых устройств

Использовать уникальные длинные имена дисковых устройств из каталогов /dev/disk/by-uuid вовсе не обязательно (каждый диск знает состав пула по wwn). 
Для удобства можно определить алиасы в файле /etc/zfs/vdev_id.conf :

alias disk1      wwn-0x5000c50045957af3-part2
alias disk2      wwn-0x50004cf20b0d7fa0-part2

Если используете multipath, в том же файле добавьте следующие опции:

multipath yes
#       PCI_ID  HBA PORT  CHANNEL NAME
channel 85:00.0 1         A
channel 85:00.0 0         B
channel 86:00.0 1         A
channel 86:00.0 0         B

Добавление зеркала к существующему пулу

Смотрим текущее состояние пула:

# zpool status tank
  pool: tank
state: ONLINE
scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
errors: No known data errors

Добавляем:

# zpool add tank mirror c0t3d0 c1t3d0
# zpool status tank
  pool: tank
state: ONLINE
scrub: none requested
config:
        NAME        STATE     READ WRITE CKSUM
        tank        ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t1d0  ONLINE       0     0     0
            c1t1d0  ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c1t2d0  ONLINE       0     0     0
          mirror-2  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c1t3d0  ONLINE       0     0     0
errors: No known data errors

Проверка и лечение отказавшего пула

Для проверки состояния пула можно использовать утилиту zdb (Display zpool debugging and consistency information).

zdb gamma | grep txg

После этго можно попробовать импортировать раннюю группу в режиме чтения:

zpool -T txg -o readonly=on gamma

Посмотреть “лишние” блоки:

zdb -bb gamma

Посмотреть, остались ли какие следы файлов:

zdb -dd gamma

Если на помогает ключ -f, то для задействования дисков надо переписать magic number на них.

Например так:

dd if=/dev/zero of=/dev/sda bs=512 count=1 conv=notrunc

Репликация снепшота в другую ФС

Реплицирование набора данных на другую машину выполняется так:

zfs send datapool/docs@today | ssh server_other zfs recv backuppool/backup

А если на той же машине - в другой пул, то так:

zfs send datapool/docs@today | zfs receive backuppool/backup

Опубликовано: 27.01.2019