Ceci est une ancienne révision du document !


Version: 2020.01

Dernière mise-à-jour : 2020/01/30 03:36

SO210 - Gestion du système de fichiers ZFS

Présentation de ZFS

Solaris 10 comprend le système de fichiers Solaris ZFS, nouveau système de fichiers 128 bits. Solaris ZFS offre une administration simple, une sémantique transactionnelle, une intégrité complète des données et une capacité d'évolution extraordinaire. Solaris ZFS ne constitue pas l'amélioration d'une technologie existante. Il s'agit d'une approche totalement nouvelle de gestion de données.

Solaris ZFS utilise un modèle de stockage en pools qui supprime purement et simplement le concept de volumes. Ainsi, ZFS supprime les problèmes liés à la gestion des partitions, à l'approvisionnement et à la croissance des systèmes de fichiers. Des centaines de systèmes de fichiers peuvent faire partie d'un seul et même pool de stockage. Chaque système n'utilise que l'espace qui lui est strictement nécessaire. La bande passante d'E/S combinée de tous les périphériques du pool est disponible à tout moment pour tous les systèmes de fichiers.

Toutes les opérations sont des transactions copie-écriture. L'état sur disque est donc toujours valide. Chaque bloc comprend une somme de contrôle. Toute corruption des données silencieuses est donc impossible. Les données peuvent, en outre, être auto-rétablies dans des configurations répliquées. Cette fonctionnalité signifie que si une copie est endommagée, Solaris ZFS la détecte et utilise une autre copie pour réparer celle endommagée.

Le vocabulaire ZFS

L'introduction de ZFS a apporté un vocabulaire nouveau :

Terme Description
pool Un élément de stockage regroupant une ou plusieurs partitions de disques contenant un ou plusieurs file systems
file system Un dataset contenant répertoires et fichiers
clone Une copie d'un file system
snapshot Une copie en lecture seule de l'état d'un file system
compression La réduction de l'occupation disque obtenue par la suppression de blocks de données identiques
checksum Un chiffre long de 256 bits utilisés pour valider des données quand elles sont lues ou écrites
quota La limite maximale d'occupation disque utilisée par un groupe ou un utilisateur
reservation Une quantité d'espace disque réservée à un utilisateur ou à un file system
mirror Une copie exacte d'un disque ou d'une partition
RAID-Z L'implémentation ZFS de RAID-5
RAID-Z2 L'implémentation ZFS de RAID-6
RAID-Z3 L'implémentation ZFS de Triple Parity RAID

ZFS Commands

Les commandes ZFS sont :

Commande Description
zpool Utilisée pour gérer des pools
zfs Utilisée pour gérer des file systems

La Commande zpool

La commande zpool utilise un jeu de sous-commandes :

Commande Description
create Crée un pool et configure son point de montage
destroy Détruit un pool
list Affiche la santé et l'utilisation d'un pool
get Affiche la liste des caractéristiques d'un pool
set Fixe une caractéristique d'un pool
status Affiche la santé d'un pool
history Affiche les commandes utilisées sur un pool depuis sa création
add Ajoute un disque à un pool existant
remove Supprime un disque d'un pool existant
replace Remplace un disque par un autre dans un pool existant
scrub Vérifie les checksums d'un pool et répare des blocs de données endommagés

La Commande zfs

La commande zfs utilise également un jeu de sous-commandes :

Command Description
create Creates a ZFS file system, sets its properties and automatically mounts it
destroy Destroys a ZFS file system or snapshot
list Displays the properties and storage usage of a ZFS file system
get Displays a list of ZFS file system properties
set Sets a property for a ZFS file system
snapshot Creates a read-only copy of the state of a ZFS file system
rollback Returns the file system to the state of the last snapshot
send Creates a file from a snapshot in order to migrate it to another pool
receive Retrieves a file created by the subcommand send
clone Creates a copy of a snapshot
promote Transforms a clone into a ZFS file system
diff Displays the file differences between two snapshots or a snapshot and its parent file system
mount Mounts a ZFS file system at a specific mount point
unmount Unmounts a ZFS file system

Préparation de la VM Solaris 10

Éteignez la VM Solaris 10. Dans la section Stockage de l'Oracle VM VirtualBox Manager, ajoutez les disques suivants au contrôleur existant SATA :

Type Taille Nom
vmdk 256 Mb Disk1
vmdk 256 Mb Disk2
vmdk 256 Mb Disk3
vmdk 256 Mb Disk4
vmdk 256 Mb Disk5
vmdk 20 Gb Mirror

Démarrez la VM Solaris 10, créez ensuite le fichier reconfigure à la racine du système et re-démarrez le :

# touch /reconfigure
# shutdown -i0 -g1 -y

Connectez-vous à la VM et vérifiez que les disques ont été détectés :

# format
Searching for disks...done


AVAILABLE DISK SELECTIONS:
       0. c0t0d0 <ATA    -VBOX HARDDISK  -1.0 cyl 2085 alt 2 hd 255 sec 63>  My Disk
          /pci@0,0/pci8086,2829@d/disk@0,0
       1. c0t2d0 <ATA    -VBOX HARDDISK  -1.0  cyl 253 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@2,0
       2. c0t3d0 <ATA    -VBOX HARDDISK  -1.0  cyl 253 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@3,0
       3. c0t4d0 <ATA    -VBOX HARDDISK  -1.0  cyl 253 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@4,0
       4. c0t5d0 <ATA    -VBOX HARDDISK  -1.0  cyl 253 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@5,0
       5. c0t6d0 <ATA    -VBOX HARDDISK  -1.0  cyl 253 alt 2 hd 64 sec 32>
          /pci@0,0/pci8086,2829@d/disk@6,0
       6. c0t7d0 <ATA    -VBOX HARDDISK  -1.0  cyl 2608 alt 2 hd 255 sec 63>
          /pci@0,0/pci8086,2829@d/disk@7,0
Specify disk (enter its number): ^C 

LAB #1 - La Gestion du Stockage ZFS

La Création d'un Pool en Miroir

Créez maintenant un pool en miroir appelé mypool en utilisant les deux premiers des cinq disques supplémentaires attachés à votre VM :

# zpool create mypool mirror c0t2d0 c0t3d0

Vérifiez que votre pool a bien été créé :

# zpool list
NAME    SIZE  ALLOC  FREE  CAP  HEALTH  ALTROOT
mypool  242M    77K  242M   0%  ONLINE  -

Utilisez maintenant la sous-commande status :

# zpool status
  pool: mypool
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0

errors: No known data errors

Utilisez maintenant les commande zfs et la sous-commande list afin de visualiser les file systems :

# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool  83.5K   210M    31K  /mypool

Notez que la commande zpool crée automatiquement un file system sur mypool puis le monte au point de montage /mypool. Si vous ne souhaitez pas que le file system soit monté automatiquement, il convient d'utiliser la commande zfs set mountpoint=legacy mypool.

L'Addition de File Systems à un Pool Existant

Créez maintenant deux file systems dans mypool appelés respectivement /home et /home/user1 puis affichez le résultat :

# zfs create mypool/home
# zfs create mypool/home/user1
# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
mypool             163K   210M    32K  /mypool
mypool/home         62K   210M    31K  /mypool/home
mypool/home/user1   31K   210M    31K  /mypool/home/user1

Notez que les deux file systems partagent le même espace disque avec le pool parent.

La Modification du Point de Montage d'un Pool

Imaginons que vous souhaitiez que le file system /home soit monté ailleurs que sous /mypool. Avec ZFS, cet objectif est atteint simplement :

# mkdir /users
# zfs set mountpoint=/users mypool/home
# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
mypool             173K   210M    32K  /mypool
mypool/home         63K   210M    32K  /users
mypool/home/user1   31K   210M    31K  /users/user1

Notez que ZFS démonte le file system /mypool/home et le re-monte à /users d'une manière automatique et transparente.

L'Ajout d'un Hot Spare

Pour visualiser tous le caractéristiques associées à mypool, utilisez la commande zpool avec la sous-commande get :

# zpool get all mypool
NAME    PROPERTY       VALUE                 SOURCE
mypool  size           242M                  -
mypool  capacity       0%                    -
mypool  altroot        -                     default
mypool  health         ONLINE                -
mypool  guid           10980242944530705327  -
mypool  version        32                    default
mypool  bootfs         -                     default
mypool  delegation     on                    default
mypool  autoreplace    off                   default
mypool  cachefile      -                     default
mypool  failmode       wait                  default
mypool  listsnapshots  on                    default
mypool  autoexpand     off                   default
mypool  free           242M                  -
mypool  allocated      257K                  -
mypool  readonly       off                   -

Notez que la valeur d'autoreplace est off. Afin d'utiliser un hot spare, il est nécessaire de changer cette valeur à on :

# zpool set autoreplace=on mypool
# zpool get autoreplace mypool
NAME    PROPERTY     VALUE    SOURCE
mypool  autoreplace  on       local

Ajoutez maintenant en tant que spare le quatrième disque que vous avez précédemment créé :

# zpool add mypool spare c0t5d0
# zpool status mypool
  pool: mypool
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
        spares
          c0t5d0    AVAIL   

errors: No known data errors

L'Observation de l'Activité du Pool

Créez un fichier de données aléatoires dans /users/user1 :

# cat /dev/urandom > /users/user1/randomfile &
909

Notez le PID. Vous en aurez besoin pour tuer le processus ultérieurement.

Affichez maintenant l'activité du pool en utilisant la sous-commande iostat de la commande zpool :

# zpool iostat -v 3
               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool      48.6M   193M      0      7    172   150K
  mirror    48.6M   193M      0      7    172   150K
    c0t2d0      -      -      0      5    230   155K
    c0t3d0      -      -      0      5     58   155K
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool      67.0M   175M      0     77      0  1.66M
  mirror    67.0M   175M      0     77      0  1.66M
    c0t2d0      -      -      0     54      0  1.66M
    c0t3d0      -      -      0     54      0  1.66M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool      78.6M   163M      0    157      0  3.65M
  mirror    78.6M   163M      0    157      0  3.65M
    c0t2d0      -      -      0     89      0  3.66M
    c0t3d0      -      -      0     90      0  3.74M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool      98.8M   143M      0    118      0  1.77M
  mirror    98.8M   143M      0    118      0  1.77M
    c0t2d0      -      -      0     64      0  1.77M
    c0t3d0      -      -      0     64      0  1.75M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       111M   131M      0    290      0  3.87M
  mirror     111M   131M      0    290      0  3.87M
    c0t2d0      -      -      0    139      0  3.88M
    c0t3d0      -      -      0    139      0  3.88M
----------  -----  -----  -----  -----  -----  -----

^C#

Vérifiez que votre miroir fonctionne.

Tuez maintenant le processus randomfile :

^C# kill -9 909
# 

Supprimez le fichier /users/user1/randomfile:

# rm -rf /users/user1/randomfile
909 Killed

Le Mise en Place d'un Quota pour un Utilisateur

Afin de mettre en place un quota pour un utilisateur, vous devez utiliser la sous-commande set de la commande zpool :

# zfs set quota=50M mypool/home/user1
# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
mypool             390K   210M    31K  /mypool
mypool/home         63K   210M    32K  /users
mypool/home/user1   31K  50.0M    31K  /users/user1

Créez maintenant un fichier de données aléatoires :

# cat /dev/urandom > /users/user1/testfile
cat: output error (0/1040 characters written)
Disc quota exceeded

Constatez que l'espace disque disponible dans /users/user1 est de 0 :

# zfs list mypool/home/user1
NAME                USED  AVAIL  REFER  MOUNTPOINT
mypool/home/user1  50.1M      0  50.1M  /users/user1

Supprimez le fichier testfile :

# rm -f /users/user1/testfile

La Mise en Place d'une Réservation pour un Utilisateur

Une réservation se met en place aussi simplement qu'un quota :

# zfs set reservation=25M mypool/home/user1
# zfs get reservation mypool/home/user1
NAME               PROPERTY     VALUE   SOURCE
mypool/home/user1  reservation  25M     local

L'Utilisation de Snapshots

Créez un fichier dans /users/user1:

# echo "This is a test file for the first snapshot" > /users/user1/snapshot1
# ls /users/user1
snapshot1

Pour créer un snapshot, il convient d'utiliser la sous-commande snapshot de la commande zfs :

# zfs snapshot mypool/home/user1@snapshot1

Le snapshot est stocké dans le répertoire caché /users/user1/.zfs/snapshot :

# ls -l /users/user1/.zfs/snapshot
total 3
drwxr-xr-x   2 root     root           3 Dec  2 17:30 snapshot1

Comme vous pouvez constaté, le snapshot contient le fichier snapshot1 :

# ls -l /users/user1/.zfs/snapshot/snapshot1/
total 2
-rw-r--r--   1 root     root          43 Dec  2 17:30 snapshot1

Il est important à noter que le répertoire .zfs ne peut pas être listé par la commande ls, même en utilisant l'option -a :

# ls -laR /users/user1
/users/user1:
total 8
drwxr-xr-x   2 root     root           3 Dec  2 17:30 .
drwxr-xr-x   3 root     root           3 Dec  2 15:26 ..
-rw-r--r--   1 root     root          43 Dec  2 17:30 snapshot1

Créez maintenant un snapshot récursif de tous les file systems dans votre pool :

# zfs snapshot -r mypool@snapshot2

Les snapshots sont stockés dans leur répertoires .zfs réspectifs :

# ls /users/.zfs/snapshot
snapshot2
# ls /users/user1/.zfs/snapshot
snapshot1  snapshot2

Listez maintenant tous les snapshots :

# zfs list -t snapshot -r mypool
NAME                         USED  AVAIL  REFER  MOUNTPOINT
mypool@snapshot2                0      -    31K  -
mypool/home@snapshot2           0      -    32K  -
mypool/home/user1@snapshot1     0      -  31.5K  -
mypool/home/user1@snapshot2     0      -  31.5K  -

Créez un autre fichier dans /users/user1 :

# echo "This is a test file for the second snapshot" > /users/user1/snapshot2
# ls -l /users/user1
total 3
-rw-r--r--   1 root     root          43 Dec  2 17:30 snapshot1
-rw-r--r--   1 root     root          44 Dec  2 17:36 snapshot2

Créez maintenant un autre snapshot récursif de mypool:

# zfs snapshot -r mypool@snapshot3
# zfs list -t snapshot -r mypool
NAME                         USED  AVAIL  REFER  MOUNTPOINT
mypool@snapshot2                0      -    31K  -
mypool@snapshot3                0      -    31K  -
mypool/home@snapshot2           0      -    32K  -
mypool/home@snapshot3           0      -    32K  -
mypool/home/user1@snapshot1     0      -  31.5K  -
mypool/home/user1@snapshot2     0      -  31.5K  -
mypool/home/user1@snapshot3     0      -    32K  -

La sous-commande diff de la commande zfs permet de voir les différences entre les deux snapshots :

# zfs diff mypool/home/user1@snapshot2 mypool/home/user1@snapshot3
M       /users/user1/
+       /users/user1/snapshot2

La sortie ci-dessus démontre que le fichier /users/user1/snapshot2 a été ajouté au deuxième snapshot sur la ligne de commande saisie.

Notez que vous pouvez retrouver d'autres caractères dans la sortie de zfs diff selon les circonstances :

Charactère Description
M Modification
R Renommer
+ Ajouté
- Supprimé

Notez que vous ne pouvez pas comparer les snapshots dans l'ordre inverse :

# zfs diff mypool/home/user1@snapshot2 mypool/home/user1@snapshot1
Unable to obtain diffs: mypool/home/user1@snapshot1 is not a descendant dataset of mypool/home/user1@snapshot2

Faire un RollBack vers un Snapshot

Notez que vous ne pouvez faire un RollBack que vers le dernier snapshot dans la sortie de la commande zfs list :

# zfs list -t snapshot -r mypool
NAME                         USED  AVAIL  REFER  MOUNTPOINT
mypool@snapshot2                0      -    31K  -
mypool@snapshot3                0      -    31K  -
mypool/home@snapshot2           0      -    32K  -
mypool/home@snapshot3           0      -    32K  -
mypool/home/user1@snapshot1     0      -  31.5K  -
mypool/home/user1@snapshot2     0      -  31.5K  -
mypool/home/user1@snapshot3     0      -    32K  -
# zfs rollback mypool/home/user1@snapshot2
cannot rollback to 'mypool/home/user1@snapshot2': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
mypool/home/user1@snapshot3

Supprimez donc le snapshot snapshot3 :

# zfs destroy mypool/home/user1@snapshot3
# zfs list -t snapshot -r mypool
NAME                         USED  AVAIL  REFER  MOUNTPOINT
mypool@snapshot2                0      -    31K  -
mypool@snapshot3                0      -    31K  -
mypool/home@snapshot2           0      -    32K  -
mypool/home@snapshot3           0      -    32K  -
mypool/home/user1@snapshot1     0      -  31.5K  -
mypool/home/user1@snapshot2     0      -  31.5K  -

Maintenant fair un RollBack vers le snapshot snapshot2 :

# zfs rollback mypool/home/user1@snapshot2
# ls -l /users/user1
total 2
-rw-r--r--   1 root     root          43 Dec  2 17:30 snapshot1

Notez l’absence du fichier snapshot2.

Cloner un Snapshot

Les snapshots sont des file system en lecture seule. Pour transformer un snapshot en un file system en lecture-écriture, utilisez la sous-commande clone de la commande zfs :

# zfs clone mypool/home/user1@snapshot2 mypool/home/user3
# zfs list
NAME                          USED  AVAIL  REFER  MOUNTPOINT
mypool                       25.7M   184M    31K  /mypool
mypool@snapshot2                 0      -    31K  -
mypool@snapshot3                 0      -    31K  -
mypool/home                  25.0M   184M    32K  /users
mypool/home@snapshot2            0      -    32K  -
mypool/home@snapshot3            0      -    32K  -
mypool/home/user1            32.5K  50.0M  31.5K  /users/user1
mypool/home/user1@snapshot1      0      -  31.5K  -
mypool/home/user1@snapshot2      0      -  31.5K  -
mypool/home/user3               1K   184M  31.5K  /users/user3

Listez le contenu de /users/user3 :

# ls -l /users/user3
total 2
-rw-r--r--   1 root     root          43 Dec  2 17:30 snapshot1

L'Utilisation de la Compression

La compression peut être activée soit lors de la création du file system, soit après. La compression ne fonctionne que pour les données sauvegardée après l'activation. Activez la compression sur /mypool/home/user1 :

# zfs set compression=on mypool/home/user1
# zfs get compression mypool/home/user1
NAME               PROPERTY     VALUE     SOURCE
mypool/home/user1  compression  on        local

Remplacement Manuel d'un Disque Défectif

Dans le cas d'un remplacement d'un disque sans spare, il convient d'utiliser la sous-commande replace de la commande zpool :

# zpool status mypool
  pool: mypool
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
        spares
          c0t5d0    AVAIL   

errors: No known data errors

# zpool replace mypool c0t2d0 c0t4d0

Utilisez de nouveau la sous-commande status de la commande zpool afn d'observer le résultat de la commande précédente :

# zpool status mypool
  pool: mypool
 state: ONLINE
 scan: resilvered 646K in 0h0m with 0 errors on Mon Dec  2 17:51:36 2019
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          mirror-0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
        spares
          c0t5d0    AVAIL   

errors: No known data errors

Notez que le Resilvering ZFS est l'équivalent de la re-synchronization sous UFS.

La Destruction d'un Pool

La destruction d'un pool est obtenue en utilisant la sous-commande destroy de la commande zpool :

# zpool destroy mypool
# zfs list
no datasets available

Notez que cette opération détruit aussi les snapshots !!

La Création d'un Pool en RAID-5

Créez un pool RAID-5 en utilisant l'algorythme RAID-Z :

# zpool create mypool raidz c0t2d0 c0t3d0 c0t4d0 spare c0t5d0
# zpool status mypool
  pool: mypool
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz1-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
        spares
          c0t5d0    AVAIL   

errors: No known data errors

Détruisez mypool :

# zpool destroy mypool

La Création d'un Pool en RAID-6

Créez un pool RAID-6 en utilisant l'algorythme RAID-Z2 :

# zpool create mypool raidz2 c0t2d0 c0t3d0 c0t4d0 c0t5d0 spare c0t6d0
# zpool status mypool
  pool: mypool
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        mypool      ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            c0t2d0  ONLINE       0     0     0
            c0t3d0  ONLINE       0     0     0
            c0t4d0  ONLINE       0     0     0
            c0t5d0  ONLINE       0     0     0
        spares
          c0t6d0    AVAIL   

errors: No known data errors

Détruisez mypool :

# zpool destroy mypool

Consulter l'Historique Zpool

La sous-commande history de la command zpool permet de consulter l'historique des actions sur un pool :

# zpool history
no pools available

Notez que l'historique des pool supprimés a été aussi supprimée !


<html> <center> Copyright © 2020 Hugh Norris. </center> </html>

Menu