Commandes NFS.

Un rapide résumé des commandes NFS qui me sont utiles.

Création basique d’un pool ZFS

ici "disk0" "disk1" "diskn" doivent être remplacés par les dev correspondants.
/!\ il est fortement déconseillé d'utiliser /dev/sd<n> car ces numéros de dev ont tendance à changer.
j'utilise /dev/disk/by-id mais on peut utiliser /dev/disk/by-uid ou autre chose.

single disk stripe pool (Raid 0)

zpool create tank disk0

stripe (par défault, similaire au RAID0, pas de redondance ni de parité)

zpool create tank disk0 disk1 (Raid 0)

Miroir (similaire au RAID1, ≥ 2 disques, 1:1 redondance)

zpool create tank mirror disk0 disk1

raidz (similaire au RAID5, ≥ 3 disques, 1 disque de parité)

zpool create tank raidz disk0 disk1 disk2

raidz2 (similaire au RAID6, ≥ 4 disques, 2 disques de parité)

zpool create tank raidz2 disk0 disk1 disk2 disk3

raidz3 (sans équivalence ≥ 5 disques, 3 disques de parité)

zpool create tank raidz3 disk0 disk1 disk2 disk3 disk4


Création avancée d’un pool ZFS

1 groupe de 2 raidz (avec 2 disques de parité au total)

zpool create tank \
raidz disk0 disk1 disk2 \
raidz disk3 disk4 disk5

Création d'un pool hybride

zpool create mypool raidz disk1 disk2 disk3 log ssd1 cache ssd2 spare disk4 disk5

crée un raid hybride composé de 4 vdevs

Afficher le détail d'un pool

zpool status <pool> (-v)

Chaque périphérique peut se trouver dans l'un des états suivants :

ONLINE

    Le périphérique ou le périphérique virtuel fonctionne normalement. Même si certaines erreurs transitoires peuvent encore survenir, le périphérique fonctionne correctement.


DEGRADED

    Le périphérique virtuel a connu un panne. Toutefois, il continue de fonctionner. Cet état est le plus commun lorsqu'un miroir ou un périphérique RAID-Z a perdu un ou plusieurs périphériques le constituant. La tolérance de pannes du pool peut être compromise dans la mesure où une défaillance ultérieure d'un autre périphérique peut être impossible à résoudre.


FAULTED

    Le périphérique ou le périphérique virtuel est totalement inaccessible. Cet état indique en règle générale une défaillance totale du périphérique, de telle façon que ZFS est incapable d'y envoyer des données ou d'en recevoir de lui. Si un périphérique virtuel de niveau supérieur se trouve dans cet état, le pool est totalement inaccessible.


OFFLINE

    Le périphérique a été mis hors ligne explicitement par l'administrateur.


UNAVAIL

    L'ouverture du périphérique ou du périphérique virtuel est impossible. Dans certains cas, les pools avec des périphériques en état UNAVAIL s'affichent en mode DEGRADED. Si un périphérique de niveau supérieur est en état UNAVAIL, aucun élément du pool n'est accessible.


REMOVED

    Le périphérique a été retiré alors que le système était en cours d'exécution. La détection du retrait d'un périphérique dépend du matériel et n'est pas pris en charge sur toutes les plate-formes.


statistiques d'E/S d'un pool

zpool iostat <pool> n

n : répète toute les n secondes


Options avancées pool et volume ZFS

Désactiver la déduplication :

zfs set dedup=off tank

Activer la compression :

zfs set compression=lz4 tank

Désactiver l’access-time et la synchronisation immédiate (meilleures performances) :

zfs set atime=off tank
zfs set sync=disabled tank

Stocker les attributs étendus dans les inodes afin d’obtenir plus d’IO :

zfs set dnodesize=auto tank
zfs set xattr=sa tank

Ajouter un cache (L2ARC)

ZFS peut utiliser des SSD comme cache de second niveau (L2ARC) après la RAM (ARC) afin d’améliorer les performances globales. Les disques de cache étant lus et écrits très fréquemment, il faut privilégier des dispositifs SSD plus durables (SLC/MLC plutôt que TLC/QLC), voir NVMe. Voir Les systèmes de cache.

zpool add tank cache nvme-0-scsi6

Ajout de log (SLOG/ZIL)

ZFS peut utiliser la NVRAM/Optane/SSD comme périphérique SLOG, c’est un cache en écriture, mais attention : Les disques SLOG utilisés pour accélérer ces écritures doivent être configuré en mode miroir. Voir Les systèmes de cache.

Voir aussi https://www.servethehome.com/what-is-the-zfs-zil-slog-and-what-makes-a-good-one/

zpool add tank log mirror nvme-0-scsi7 nvme-0-scsi8

Ajout d’un disque de spare

zpool add tank spare scsi-0-scsi9

 

Datasets

Création d’un dataset

zfs create pool_name/dataset_name

Suppression d’un dataset

On utilise "zfs destroy".

Maintenance

Scrubs

Un scrub permet de lire l’entièreté des données contenues dans le pool afin de vérifier si celles-ci sont toujours consistantes et de réparer les erreurs si il y en a. La commande zpool scrub doit donc être lancée périodiquement via un cron. Une fréquence d’une fois par semaine pendant les heures creuses est suffisante.

Lancer un scrub (vérification complète)

zpool scrub tank

Arrêter un scrub

zpool scrub -s tank

remplacer un périphérique défectueux

Vous pouvez aisément remplacer un périphérique défectueux par un disque de remplacement (spare) grâce à la commande:
zpool replace old_dev new_dev

Les périphériques peuvent être mis « offline » (pour pouvoir travailler dessus sans que ZFS ne se mêle de ce que vous faites) ou « online » grâce aux commandes:
zpool online vdev1
zpool offline vdev1

Étendre un pool

Un pool peut être étendu grâce à la commande
zpool add pool_name vdev

Propriétés

Les propriétés peuvent être affichées en exécutant la commande:
zpool get all pool_name

et modifiées avec
zpool set autoreplace=on dataset_name

Parmi les propriétés d’un pool, les plus importantes sont failmode, autoreplace et listsnapshots.
Le failmode décrit la façon dont ZFS va réagir si quelque chose se passe mal: WAIT pour attendre que le problème se répare, CONTINUE pour continuer malgré le problème, PANIC pour stopper le système.

Récupération de zpools détruits

Si on a supprimé par erreur un zpool avec "zpool destroy", tout espoir n'est pas perdu. Il faut utiliser 

zpool import [-D]

# zpool list
no pools available
# zpool status zp_raid5
cannot open 'zp_raid5': no such pool
# zpool import
no pools available to import
# zpool import -D
 pool: zp_raid5
 id: 8634237456648565539
 state: ONLINE (DESTROYED)
action: The pool can be imported using its name or numeric identifier.
config:

        zp_raid5      ONLINE
          raidz1-0    ONLINE
            c0t2d0s0  ONLINE
            c0t2d0s1  ONLINE
            c0t2d0s2  ONLINE
            c0t2d0s3  ONLINE
        spares
            c0t2d0s4
# zpool import -D zp_raid5
# zpool list
NAME       SIZE  ALLOC   FREE    CAP  HEALTH  ALTROOT
zp_raid5  19.9G   198K  19.9G     0%  ONLINE  -

Chiffrement

zfs create -o encryption=aes-256-gcm - o keyformat=passphrase -o compression=lz4 -o dedup=off <pool>/<dataset>

- encryption peut être aes 128 | 192 | 256 et déclinaisons comme 'ccm'
- compression, dedup pour exemple
- keyformat peut avoir le format :

passphrase : interactif ou passé via un fichier texte
fichier , dans ce cas utiliser -o keylocation = file:///<clé>

Pour monter les pools/datasets chiffrés il faut au préalable fournir les clés, sauf dans le cas d'une passphrase, la tentative de montage déclenchera une interaction.
Sinon sudo zfs load-key -L file:///<clé>
puis sudo zfs mount -a ou sudo zfs mount <pool/sataset>

démontage via zfs unmount, puis décharger les clés par sudo zfs unload-key <pool/dataset>

Citations et liens :

https://www.lambot.info/zfs-en-details/
https://ubuntu.com/tutorials/using-zfs-snapshots-clones#2-using-snapshots
https://linuxhint.com/share-zfs-volumes-via-iscsi/
http://www.unixmaniax.fr/wiki/index.php?title=ZFS
https://resinfo-gt.pages.in2p3.fr/zfs/doc/usage/index.html
https://arstechnica.com/gadgets/2021/06/a-quick-start-guide-to-openzfs-native-encryption/
https://docs.oracle.com/cd/E19253-01/820-2315/gaynp/index.html