ZFS sur Debian GNU/Linux

References

Getting started

(last update: Debian 10, aka Buster)

# apt-get update
# apt-get install zfsutils-linux zfs-zed zfs-dkms

Disk configuration

List available pools:

# zfs list
no datasets available

# zpool status
no pools available

Create a new regular pool (dynamic stripe pool, i.e. RAID-0) with all disks. Not recommended:

# zpool create -f foostore /dev/sdXX1 /dev/sdXX2 /dev/sdXX3

.. where 'foostore' will be the name of the pool and its mountpoint. By default partitions would be available at /foostore.

With 3 or more disks, we can use RAID-Z (which can recover if one disk is lost):

# zpool create -f foostore raidz /dev/sdXX1 /dev/sdXX2 /dev/sdXX3

With 2 disks we can do set mirror setup (i.e. RAID-1):

#  zpool create -f foostore mirror /dev/sdXX1

Result:

# df -h
Sys. de fichiers                           Taille Utilisé Dispo Uti% Monté sur
foostore                                     2,7T       0  2,7T   0% /foostore

Maintenant on peut créer un espace général pour le stockage:

# zfs create foostore/home

Résultat:

# df -h
Sys. de fichiers                           Taille Utilisé Dispo Uti% Monté sur
foostore                                     2,7T       0  2,7T   0% /foostore
foostore/home                                2,7T       0  2,7T   0% /foostore/home

Pour créer un volume pour une VM (ref):

# zfs create -V 20G foostore/vm-foobar

http://docs.oracle.com/cd/E23120_01/html/821-2854/usingzfswithvirtualdisks.html

Espace occupé par les snapshots:

# zfs list -o space

Lister les snapshots:

# zfs list -t snapshot

Migrer une partition d'un pool vers un autre

Sur un système j'ai 2 disques rotatifs en mirroir et 2 disques SSD mirroirs (les uns pour du stockage long terme et sauvegardes, les autres pour des serveurs virtuels).

Je voulais migrer des volumes d'un pool (foostore) vers l'autre (bar), ex:

# zfs snapshot -r foostoree/vm-abc@moving
# zfs send foostore/vm-abc@moving | pv | zfs receive bar/vm-abc

Ceci crée automatiquement un volume sur le pool "bar". La commande "pv" permet de voir l'état de la migration (données transférées, vitesse de transfert).

En créant un snapshot, on peut aussi réduire le temps d'interruption en migrant la VM pendant que le système est en fonction, puis fermer la VM, re-sychroniser et redémarrer la VM (après avoir changé la configuration du disque dans KVM).

Référence: http://serverfault.com/a/375430/262140

Toute la mémoire est utilisée par ZFS (ARC)

Ex: si toute la mémoire est utilisée par ZFS, et qu'il est impossible de créer une nouvelle machine virtuelle (allouer un gros bloc de mémoire d'un coup):

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max
# echo 3 > /proc/sys/vm/drop_caches

Et:

# echo "options zfs zfs_arc_max=1073741824" >> /etc/modprobe.d/zfs.conf

Voir les stats:

# cat /proc/spl/kstat/zfs/arcstats
# arc_summary

Réfs:

zpool n'est pas importé au démarrage

Typiquement: après le démarrage, le pool n'est pas importé automatiquement. Si on tappe ceci, ça ne retourne rien:

zpool import

Par contre, on peut importer avec le nom du pool:

zpool import foo

Dans un cas, j'ai trouvé la solution grâce à strace:

# strace /sbin/zpool import -c /etc/zfs/zpool.cache -aN
[...]
openat(AT_FDCWD, "/etc/hostid", O_RDONLY) = -1 ENOENT (No such file or directory)
[...]
brk(0x55e8f1c56000)                     = 0x55e8f1c56000
ioctl(3, _IOC(_IOC_NONE, 0x5a, 0x2, 0), 0x7fff765d8290) = -1 ENXIO (No such device or address)
write(2, "cannot import 'zpaella': one or "..., 70cannot import 'zpaella': one or more devices is currently unavailable

Pour générer un "hostid":

# zgenhostid

Puis forcer un re-import, car le hostid a changé:

# zpool import foo
cannot import 'foo': pool was previously in use from another system.
Last accessed by <unknown> (hostid=0) at Fri Jan 31 17:39:36 2020
The pool can be imported, use 'zpool import -f' to import the pool.

# zpool import zpaella -f
(ok)

Varia

Performance io:

zpool iostat -v 1

Réduire la taille d'une partition: https://lab.symbiotic.coop/coopsymbiotic/ops/issues/26

Notes