Ceci est une ancienne révision du document !


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

Version: 1.11.01

SO210 - Gestion du Système de Fichiers ZFS

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 controleur existant SATA :

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

Re-démarrez la VM Solaris 10.

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 autoré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 élement de stockage regroupant une ou plusieures 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 dommagé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

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   187M    80K   187M     0%  ONLINE  -

Utilisez maintenant la sous-commande status :

# zpool status
  pool : mypool
 état : ONLINE
 scan: aucun requis
configuration :

        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

erreurs : aucune erreur de données connue

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

# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
mypool    97K   155M    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              181K   155M    32K  /mypool
mypool/home          62K   155M    31K  /mypool/home
mypool/home/user1    31K   155M    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              366K   155M    32K  /mypool
mypool/home          63K   155M    32K  /users
mypool/home/user1    31K   155M    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 touts le charactéristiques associées à mypool, utilisez la commande zpool avec la sous-commande get :

# zpool get all mypool
NAME    PROPERTY       VALUE       SOURCE
mypool  size           187M        -
mypool  capacity       0%          -
mypool  altroot        -           default
mypool  health         ONLINE      -
mypool  guid           13590865085725716842  default
mypool  version        29          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           186M        -
mypool  allocated      724K        -
mypool  readonly       off         -

Notez que la valeur d'autoreplace est off. Afin d'utiliser un hot spare, il est necessaire 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écedement créé :

# zpool add mypool spare c0t5d0
# zpool status mypool
  pool : mypool
 état : ONLINE
 scan: aucun requis
configuration :

        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
        éléments de rechange
          c0t5d0    AVAIL

erreurs : aucune erreur de données connue

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 &
1658

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      94,6M  92,4M      0     26    176   321K
  mirror    94,6M  92,4M      0     26    176   321K
    c0t2d0      -      -      0     26    183   326K
    c0t3d0      -      -      0     26    112   326K
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       109M  77,7M      0    657      0  7,77M
  mirror     109M  77,7M      0    657      0  7,77M
    c0t2d0      -      -      0    657      0  7,78M
    c0t3d0      -      -      0    657      0  7,78M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       131M  56,5M      0    510      0  4,69M
  mirror     131M  56,5M      0    510      0  4,69M
    c0t2d0      -      -      0    506      0  4,70M
    c0t3d0      -      -      0    507      0  4,70M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       137M  50,3M      0    588      0  3,77M
  mirror     137M  50,3M      0    588      0  3,77M
    c0t2d0      -      -      0    542      0  3,78M
    c0t3d0      -      -      0    555      0  3,78M
----------  -----  -----  -----  -----  -----  -----

               capacity     operations    bandwidth
pool        alloc   free   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
mypool       138M  48,9M      0    515      0  2,63M
  mirror     138M  48,9M      0    515      0  2,63M
    c0t2d0      -      -      0    423      0  2,64M
    c0t3d0      -      -      0    419      0  2,64M
----------  -----  -----  -----  -----  -----  -----

^C#

Vérifiez que votre miroir fonctionne.

Tuez maintenant le processus randomfile :

# kill -9 PID [Entrée]

Supprimez le fichier /users/user1/randomfile:

# rm -rf /users/user1/randomfile
1658 Tué

Le Mise en Place d'un Quota pour un Utilisateur

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

# zfs set quota=50M mypool/home/user1
# zfs get quota mypool
NAME    PROPERTY  VALUE  SOURCE
mypool  quota     none   default
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
mypool              784K   154M    31K  /mypool
mypool/home          63K   154M    32K  /users
mypool/home/user1    31K  50,0M    31K  /users/user1

Notez la mise en place du quota de 50Mo sur /mypool/home/user1.

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

# cat /dev/urandom > /users/user1/testfile
cat : erreur en sortie (0 caractères sur 1040 ont été écrits)
Quota disque dépassé

Notez la phrase Quota disque dépassé.

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@Dec13

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 juin  2 18:59 Dec13

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

# ls -l /users/user1/.zfs/snapshot/Dec13/
total 2
-rw-r--r--   1 root     root          43 juin  2 18:59 snapshot1

Il est important à noter que le répertoire .zfs ne peut pas être lister 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 juin  2 18:59 .
drwxr-xr-x   3 root     root           3 juin  2 18:48 ..
-rw-r--r--   1 root     root          43 juin  2 18:59 snapshot1

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

# zfs snapshot -r mypool@Dec13-1

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

# ls /users/.zfs/snapshot
Dec13-1
# ls /users/user1/.zfs/snapshot
Dec13    Dec13-1

Listez maintenant tous les snapshots :

# zfs list -t snapshot -r mypool
NAME                        USED  AVAIL  REFER  MOUNTPOINT
mypool@Dec13-1                 0      -    31K  -
mypool/home@Dec13-1            0      -    32K  -
mypool/home/user1@Dec13        0      -  31,5K  -
mypool/home/user1@Dec13-1      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 juin  2 18:59 snapshot1
-rw-r--r--   1 root     root          44 juin  2 19:07 snapshot2

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

# zfs snapshot -r mypool@Dec13-2
# zfs list -t snapshot -r mypool
NAME                        USED  AVAIL  REFER  MOUNTPOINT
mypool@Dec13-1                 0      -    31K  -
mypool@Dec13-2                 0      -    31K  -
mypool/home@Dec13-1            0      -    32K  -
mypool/home@Dec13-2            0      -    32K  -
mypool/home/user1@Dec13        0      -  31,5K  -
mypool/home/user1@Dec13-1      0      -  31,5K  -
mypool/home/user1@Dec13-2      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@Dec13-1 mypool/home/user1@Dec13-2
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@Dec13-2 mypool/home/user1@Dec13-1
Unable to obtain diffs:
   Not an earlier snapshot from the same fs

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@Dec13-1                 0      -    31K  -
mypool@Dec13-2                 0      -    31K  -
mypool/home@Dec13-1            0      -    32K  -
mypool/home@Dec13-2            0      -    32K  -
mypool/home/user1@Dec13        0      -  31,5K  -
mypool/home/user1@Dec13-1      0      -  31,5K  -
mypool/home/user1@Dec13-2      0      -    32K  -
# zfs rollback mypool/home/user1@Dec13-1
impossible de restaurer vers 'mypool/home/user1@Dec13-1' : il existe des instantanés plus récents
utilisez '-r' pour forcer la suppression des instantanés suivants :
mypool/home/user1@Dec13-2

Supprimez donc le snapshot Dec13-2 :

# zfs destroy mypool/home/user1@Dec13-2
# zfs list -t snapshot -r mypool
NAME                        USED  AVAIL  REFER  MOUNTPOINT
mypool@Dec13-1                 0      -    31K  -
mypool@Dec13-2                 0      -    31K  -
mypool/home@Dec13-1            0      -    32K  -
mypool/home@Dec13-2            0      -    32K  -
mypool/home/user1@Dec13        0      -  31,5K  -
mypool/home/user1@Dec13-1      0      -  31,5K  -

Maintenant fair un RollBack vers le snapshot Dec13-1 :

# zfs rollback mypool/home/user1@Dec13-1
# ls -l /users/user1
total 2
-rw-r--r--   1 root     root          43 juin  2 18:59 snapshot1

Notez l'abscence 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@Dec13-1 mypool/home/user3
# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
mypool                     25,5M   129M    31K  /mypool
mypool@Dec13-1                 0      -    31K  -
mypool@Dec13-2                 0      -    31K  -
mypool/home                25,0M   129M    32K  /users
mypool/home@Dec13-1            0      -    32K  -
mypool/home@Dec13-2            0      -    32K  -
mypool/home/user1          32,5K  50,0M  31,5K  /users/user1
mypool/home/user1@Dec13        0      -  31,5K  -
mypool/home/user1@Dec13-1      0      -  31,5K  -
mypool/home/user3             1K   129M  31,5K  /users/user3

Listez le contenu de /users/user3 :

# ls -l /users/user3
total 2
-rw-r--r--   1 root     root          43 juin  2 18:59 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
 état : ONLINE
 scan: aucun requis
configuration :

        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
        éléments de rechange
          c0t5d0    AVAIL

erreurs : aucune erreur de données connue
# 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
 état : ONLINE
 scan: resilvered 766K in 0h0m with 0 errors on Sun Jun  2 21:13:08 2013
configuration :

        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
        éléments de rechange
          c0t5d0    AVAIL

erreurs : aucune erreur de données connue

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

La Déstruction d'un Pool

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

# zpool destroy mypool

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

# zfs list
aucun jeu de données disponible

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
 état : ONLINE
 scan: aucun requis
configuration :

        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
        éléments de rechange
          c0t5d0    AVAIL

erreurs : aucune erreur de données connue

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
 état : ONLINE
 scan: aucun requis
configuration :

        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
        éléments de rechange
          c0t6d0    AVAIL

erreurs : aucune erreur de données connue

Détruisez mypool :

# zpool destroy mypool

Conculter l'Historique Zpool

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

# zpool history
Historique de 'mypool':
2013-06-02.21:33:33 zpool create mypool raidz2 c0t2d0 c0t3d0 c0t4d0 c0t5d0 spare c0t6d0

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


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

Menu