Dans un précédent article, j'ai présenté les principaux apports de ZFS. Nous allons maintenant nous intéresser aux commandes de base qui permettent de manipuler les pools et les datasets, ces derniers correspondant à peu près aux volumes que l'on retrouve dans d'autres environnements. Toute la gestion de ZFS se fait avec deux commandes :
  • zpool : l'outil de manipulation des pools
  • zfs : l'outil de manipulation des datasets

Création de pool et de datasets

Création de pool

Je dispose de deux disques, c8t4d0 et c8t1d0. Je vais commencer par créer un pool contenant un de ces deux disques :
# zpool create monpool c8t4d0 invalid vdev specification use '-f' to override the following errors: /dev/dsk/c8t4d0s2 contains a ufs filesystem. # zpool create -f monpool c8t4d0
La présence d'un vieux filesystem ufs ayant été détectée, j'ai du forcer la création du pool avec l'option -f. Notez qu'aucune opération de partitionnement n'a été nécessaire, ZFS s'approprie l'ensemble du disque, quel que soit le partitionnement d'origine! Il est également possible de ne confier que des partitions spécifiques à ZFS, et non l'intégralité du disque, mais ce n'est pas recommandé : outre la complexité accrue liée au fait de devoir gérer manuellement des partitions, certaines optimisations de performances ne sont pas supportées dans ce mode, notamment l'exploitation du cache interne du disque (s'il en dispose, bien sûr). Enfin, on peut utiliser des fichiers (d'une taille minimale de 64 Mo) pour y créer un pool. Notez enfin que certains noms sont réservés : il s'agit de mirror, raidz et spare, qui sont des mots-clés reconnus par la commande zpool.

Affichage de la liste des pools

# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT monpool 68G 88K 68.0G 0% ONLINE -
Nous voyons ici, pour chaque pool, dans l'ordre :
  • le nom du pool
  • la taille du pool
  • l'espace utilisé dans le pool
  • l'espace disponible dans le pool
  • le taux de remplissage du pool
  • l'état du pool
  • le point de montage par défaut du pool. Par défaut, l'entrée est vide et le point de montage est le nom du pool

Création de datasets

Maintenant que le pool existe, je peux y créer des datasets :
# zfs create monpool/daniel # zfs create monpool/daniel/pool1 # zfs create monpool/daniel/pool2
J'ai ici profité de la possibilité offerte par ZFS d'avoir une hiérarchie de datasets. Les datasets pool1 et pool2 sont rattachés au dataset daniel, lui-même créé dans le pool monpool.

Affichage de la liste des datasets

# zfs list NAME USED AVAIL REFER MOUNTPOINT monpool 184K 66.9G 25.5K /monpool monpool/daniel 76.5K 66.9G 27.5K /monpool/daniel monpool/daniel/pool1 24.5K 66.9G 24.5K /monpool/daniel/pool1 monpool/daniel/pool2 24.5K 66.9G 24.5K /monpool/daniel/pool2
Cette commande présente une vue arborescente de ma hiérarchie. On y retrouve :
  • le nom du dataset (y compris celui du dataset à la racine de la hiérarchie, égal à celui du pool)
  • l'espace utilisé par le dataset et tous ses descendants
  • l'espace disponible pour créer de nouveaux datasets
  • la quantité de données accessibles au dataset lui-même (sa taille propre, indépendamment de ses descendants)
  • le point de montage du dataset
Notez que les datasets indiquent tous la même quantité d'espace disponible, celle de monpool. C'est le principe même du pool.

Choix du point de montage

Il y a deux façons de définir le point de montage d'un dataset, à supposer bien sûr qu'on souhaite le changer. La première peut s'appliquer à un dataset déjà créé :
# zfs set mountpoint=/home/toto/pool1 monpool/daniel/pool1 # zfs list NAME USED AVAIL REFER MOUNTPOINT monpool 184K 66.9G 25.5K /monpool monpool/daniel 76.5K 66.9G 27.5K /monpool/daniel monpool/daniel/pool1 24.5K 66.9G 24.5K /home/toto/pool1 monpool/daniel/pool2 24.5K 66.9G 24.5K /monpool/daniel/pool2
La seconde méthode est de le faire à la création :
# zpool create -R /toto monpool2 /path/to/poolfile # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT monpool 68G 186K 68.0G 0% ONLINE - monpool2 95.5M 95K 95.4M 0% ONLINE /toto # zfs list NAME USED AVAIL REFER MOUNTPOINT monpool 184K 66.9G 25.5K /monpool monpool/daniel 76.5K 66.9G 27.5K /monpool/daniel monpool/daniel/pool1 24.5K 66.9G 24.5K /home/toto/pool1 monpool/daniel/pool2 24.5K 66.9G 24.5K /monpool/daniel/pool2 monpool2 121K 63.4M 24.5K /toto

Destruction de pool ou de dataset

Destruction de dataset

Sans surprise, la commande de destruction d'un dataset est le pendant de celle de création :
# zfs destroy monpool/daniel/pool2 # zfs list NAME USED AVAIL REFER MOUNTPOINT monpool 253K 66.9G 25.5K /monpool monpool/daniel 152K 66.9G 26.5K /monpool/daniel monpool/daniel/pool1 126K 66.9G 126K /home/toto/pool1 monpool2 92K 63.4M 24.5K /toto

Destruction de pool

De même que pour les datasets, une commande suffit pour détruire un pool (et donc tous les datasets qu'il contient!) :
# zpool destroy monpool2 # zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT monpool 68G 256K 68.0G 0% ONLINE -
Voilà, c'est tout pour aujourd'hui!