Ceci est une ancienne révision du document !


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

Version: 1.11.01

SO101 - Système de Fichiers

Le système de fichiers d'Unix est organisé autour d'une arborescence unique ayant un point de départ appelé la racine, représenté par le caractère /. En dessous de cette racine se trouvent des répertoires contenant fichiers et sous-répertoires.

L'arborescence

  • /bin : est une abréviation de ‘binary’ ou binaires. Sous Solaris /bin est un lien symbolique vers /usr/bin. Il contient des programmes tels ls.
  • /cdrom : points de montage pour les CD et DVD.
  • /dev : contient des noms logiques d’unités utilisés pour accéder à tout type de matériel. Ce sont des liens symboliques vers des fichiers spéciaux du répertoire /devices. Le répertoire /dev est organisé en sous-répertoires, par exemple :
    • /dev/dsk : partitions disque en mode bloc
    • /dev/rdsk : partitions disque en mode raw bloc
    • /dev/printers : imprimantes
    • /dev/rmt : lecteurs de bandes
  • /devices : contient des noms physiques d'unités.
  • /etc : contient des fichiers de configuration.
  • /export : contient le répertoire /home. Le répertoire /home contient les répertoires de chaque utilisateur, sauf l’utilisateur root, qui doivent être exportés par le serveur NFS.
  • /home : contient les répertoires des comptes locaux.
  • /kernel : contient le noyau Solaris (genunix) et les fichiers associés.
  • /lib : contient les bibliothèques communes utilisées par les programmes. Sous Solaris /lib est un lien symbolique vers /usr/lib.
  • /lost+found : répertoire contenant des fichiers à récupérer par la commande fsck.
  • /mnt : répertoire utilisé pour des montages occasionnels.
  • /opt : répertoire utilisé pour l'installation des logiciels optionnels.
  • /platform : contient des fichiers spécifiques à la plate-forme matérielle.
  • /proc : un pseudo-filesystem représentant les processus en activité.
  • /sbin : contient des binaires, donc programmes, pour l’administration du système local.
  • /system : Point d'attache des pseudo-filesystems suivant :
    • /system/contract : système de fichiers au format CTFS,
    • /system/object : système de fichiers au format OBJFS.
  • /tmp : stocke des fichiers temporaires créés par des programmes. Il est vidé à chaque redémarrage du système.
  • /usr : contient de nombreux répertoires tels :
    • /usr/bin : contient des commandes des utilisateurs,
    • /usr/sbin : contient des commandes administratives,
    • /usr/share/doc : contient les HOWTO,
    • /usr/share/man : contient les manuels.
  • /var : contient des fichiers de taille variable ainsi que des répertoires tels :
    • /var/adm : contient des fichiers journaux et comptabilité,
    • /var/sadm : répertoire de travail pour le gestionnaire de paquets logiciels.
  • /vol : répertoire du service VOLD (VOlume Management Daemon) utilisé pour monter et démonter automatiquement les périphériques amovibles.

Il existe trois types majeurs de fichier sous le système Solaris:

  • les fichiers normaux ( ordinary files )
  • les répertoires ( directories )
  • les fichiers spéciaux ( special files ou Devices)

Le fichiers normaux sont des fichiers textes, des tableaux ou des exécutables.

La limite de la longueur du nom de fichier est de 255 caractères.

Il y a une distinction entres les majuscules et le minuscules.

Le caractère / est interdit dans les noms des fichiers.

L'espace est déconseillé dans les noms des fichiers.

Si le nom d'un fichier commence par un ., le fichier devient caché.

La commande mount

La commande mount est utilisée pour monter un filesystem. Monter un filesystem est nécessaire afin d'avoir accès à son contenu.

Les filesystems montés automatiquement par Solaris lors du démarrage sont décrits dans le fichier /etc/vfstab :

# cat /etc/vfstab
#device             device              mount               FS      fsck    mount   mount
#to mount           to fsck             point               type    pass    at boot options
#
fd                  -                   /dev/fd             fd      -       no      -
/proc               -                   /proc               proc    -       no      -
/dev/dsk/c0t0d0s1   -                   -                   swap    -       no      -
/dev/dsk/c0t0d0s0   /dev/rdsk/c0t0d0s0  /                   ufs     1       no      -
/dev/dsk/c0t0d0s7   /dev/rdsk/c0t0d0s7  /export/home        ufs     2       yes     -
/devices            -                   /devices            devfs   -       no      -
sharefs             -                   /etc/dfs/sharetab   sharefs -       no      -
ctfs                -                   /system/contract    ctfs    -       no      -
objfs               -                   /system/object      objfs   -       no      -
swap                -                   /tmp                tmpfs   -       yes     -

Ce fichier comporte 7 colonnes :

  • device to mount
    • Nom de la partition en mode bloc pour un filesystem UFS ou une zone de swap
    • Nom de la ressource NFS
    • Nom d'un répertoire pour un filesystem virtuel
  • device to fsck
    • Nom de la partition en mode bloc pour un filesystem UFS
    • Le signe - dans les autres cas car non significatif
  • mount point
    • Nom du répertoire de montage
    • Le signe - dans les autres cas car non significatif
  • FS type
    • Type de filesystem
  • fsck pass
    • - indique que le filesystem ne sera pas vérifié par fsck
    • 0 indique qu'un filesystem UFS ne sera pas vérifié par fsck mais un autre type sera vérifié
    • 1 indique que le filesystem sera vérifié par fsck dans l'ordre de son apparition dans ce fichier
    • 2 indique que le filesystem sera vérifié par fsck en parallèle
  • mount at boot
    • désigne si oui ou non le filesystem est monté au boot par la commande mountall
    • le filesystem racine prend toujours la valeur no car il est déjà monté au moment de l'interprétation de ce fichier
  • mount options
    • la valeur - indique toutes les options par défaut
    • ce champs peut comporter une liste d'options séparés par des virgules sans espaces
    • dans le cas d'un filesystem UFS, l'option logging est activée par défaut

Afin de monter un filesystem manuellement il est nécessaire de connaître :

  • le nom da la partition exprimé sous la forme du fichier spécial en mode bloc
  • le répertoire de montage

Une commande de montage ressemble à celle-ci :

mount /dev/dsk/c0t0d1s0 /point_de_montage

point_de_montage est un répertoire vide dans lequel est monté le filesystem /dev/dsk/c0d1s0.

Le répertoire de montage doit être dédié à cet usage. Tout fichier dans le répertoire sera caché par la présence du contenu de /dev/dsk/c0d1s0.

Options de la commande

Les options de la commande mount sont :

# mount --help
mount: illegal option -- help
Usage:
mount [-v | -p]
mount [-F FSType] [-V] [current_options] [-o specific_options]
        {special | mount_point}
mount [-F FSType] [-V] [current_options] [-o specific_options]
        special mount_point
mount -a [-F FSType ] [-V] [current_options] [-o specific_options]
        [mount_point ...]

La commande umount

L'action de démontage est effectuée par l'utilsation de la commande umount. Une commande umount ressemble à :

umount /point_de_montage

ou

umount /dev/dsk/c0t0d1s0

Si le filesystem est en cours d'utilisation la commande umount échoue.

Pour connaître les processus en cours, on dispose de la commande fuser.

Par exemple, dans notre cas, le filesystem /dev/dsk/c0t0d0s7 est monté sur /export/home :

# cat /etc/vfstab | grep home
/dev/dsk/c0t0d0s7       /dev/rdsk/c0t0d0s7      /export/home    ufs     2       yes     -

Dans le cas où vous êtes connecté en tant qu'un utilisateur normal et vous agissez en tant que root grâce à la commande su, vous ne pourrez pas démonter /export/home. Par contre, si vous vous connectez directement en tant que root, aucun processus utilise ce montage.

# fuser -cu /export/home
/export/home:

Les options de cette commande sont :

  • -c
    • effectue une recherche récursive
  • -u
    • affiche les noms des propriétaires des processus trouvés

Dans ce cas, vous pouvez démonter /export/home :

# umount /export/home

Options de la commande

Les options de la commande umount sont :

# umount --help
umount: illegal option -- help
Usage:
umount [-f] [-V] [-o specific_options] {special | mount-point}
umount -a [-f] [-V] [-o specific_options] [mount_point ...]

Le fichier /etc/mntab

Les filesystems actuellement montés sont consignés dans le fichier /etc/mntab. Ce fichier peut être consulté mais pas modifié :

# cat /etc/mnttab
/dev/dsk/c0t0d0s0       /       ufs     rw,intr,largefiles,logging,xattr,onerror=panic,dev=840000       1575092681
/devices        /devices        devfs   dev=4b80000     1575092677
ctfs    /system/contract        ctfs    dev=4c00001     1575092677
proc    /proc   proc    dev=4bc0000     1575092677
mnttab  /etc/mnttab     mntfs   dev=4c40001     1575092677
swap    /etc/svc/volatile       tmpfs   xattr,dev=4c80001       1575092677
objfs   /system/object  objfs   dev=4cc0001     1575092677
sharefs /etc/dfs/sharetab       sharefs dev=4d00001     1575092677
/usr/lib/libc/libc_hwcap1.so.1  /lib/libc.so.1  lofs    dev=840000      1575092680
fd      /dev/fd fd      rw,dev=4e80001  1575092681
swap    /tmp    tmpfs   xattr,dev=4c80002       1575092682
swap    /var/run        tmpfs   xattr,dev=4c80003       1575092682
/dev/dsk/c0t0d0s7       /export/home    ufs     rw,intr,largefiles,logging,xattr,onerror=panic,dev=840007       1575092688
-hosts  /net    autofs  nosuid,indirect,ignore,nobrowse,dev=4f40001     1575092690
auto_home       /home   autofs  indirect,ignore,nobrowse,dev=4f40002    1575092690
solaris.i2tch.loc:vold(pid588)  /vol    nfs     ignore,noquota,dev=4f00001      1575092690

Pour remonter /export/home, il convient d'utiliser la commande mount :

# mount -F ufs /dev/dsk/c0t0d0s7 /export/home

Regardez maintenant de nouveau le fichier /etc/mnttab :

# cat /etc/mnttab
/dev/dsk/c0t0d0s0       /       ufs     rw,intr,largefiles,logging,xattr,onerror=panic,dev=840000       1575092681
/devices        /devices        devfs   dev=4b80000     1575092677
ctfs    /system/contract        ctfs    dev=4c00001     1575092677
proc    /proc   proc    dev=4bc0000     1575092677
mnttab  /etc/mnttab     mntfs   dev=4c40001     1575092677
swap    /etc/svc/volatile       tmpfs   xattr,dev=4c80001       1575092677
objfs   /system/object  objfs   dev=4cc0001     1575092677
sharefs /etc/dfs/sharetab       sharefs dev=4d00001     1575092677
/usr/lib/libc/libc_hwcap1.so.1  /lib/libc.so.1  lofs    dev=840000      1575092680
fd      /dev/fd fd      rw,dev=4e80001  1575092681
swap    /tmp    tmpfs   xattr,dev=4c80002       1575092682
swap    /var/run        tmpfs   xattr,dev=4c80003       1575092682
-hosts  /net    autofs  nosuid,indirect,ignore,nobrowse,dev=4f40001     1575092690
auto_home       /home   autofs  indirect,ignore,nobrowse,dev=4f40002    1575092690
solaris.i2tch.loc:vold(pid588)  /vol    nfs     ignore,noquota,dev=4f00001      1575092690
/dev/dsk/c0t0d0s7       /export/home    ufs     rw,intr,largefiles,logging,xattr,onerror=panic,dev=840007       1575094632

Options de montage pour un filesystem UFS

Le dernier champs du fichier /etc/vfstab contient les options de montage :

Option Valeur par défaut Description
rw/ro rw lecture/écriture ou lecture seule
largefiles/nolargefiles largefiles Création des fichiers de plus de 2Go
logging/nologging logging Journalisation ou non
atime/noatime atime Mise à jour ou non de la date de dernière consultation des fichiers non modifiés
exec/noexec exec Exécution ou non des programmes
devices/nodevices devices Accès ou non aux fichiers spéciaux
setuid/nosetuid setuid Prise en compte ou non des permissions SUID et SGID
suid/nosuid suid Combinaison de nodevices et nosetuid
quota - Activation des quotas
rq - Combinaison des options rw et quota

Ces options peuvent être aussi introduites sur la ligne de commande lors d'un montage manuel grâce à l'option -o de la commande mount.

Les options d'un filesystem monté peuvent être consultées grâce à la commande mount :

# mount | grep /export/home
/export/home on /dev/dsk/c0t0d0s7 read/write/setuid/devices/rstchown/intr/largefiles/logging/xattr/onerror=panic/dev=840007 on Sat Nov 30 07:17:12 2019

<note> A l'aide du manuel et de l'internet, expliquez l'utilisation de intr, xattr et onerror=panic </note>

Le Filesystem UFS

UFS (Unix FileSystem) est un filesystem de type Berkeley auquel ont été ajoutés des fonctions de journalisation appelées UFS logging. L'UFS logging crée un journal dans les blocs libres du filesystem. La taille est de 1Mo par Go de données avec un maximum de 64Mo.

Structure

Chaque système UFS contient des groupe de cylindres. Chaque group de cylindres contient un :

  • boot block
  • superbloc
  • inode
  • bloc d'indirection
  • bloc de données

boot block

Ce bloc est utilisé quand le filesystem sert au démarrage. Il n'apparait donc que dans le premier groupe de cylindres et a une taille de 8Ko.

Superbloc

Le superbloc contient :

  • la taille des blocs
  • la taille du système de fichiers
  • le nombre de montages effectués pour ce système de fichiers
  • un pointeur vers la racine du système de fichiers
  • les pointeurs vers la liste des inodes libres
  • les pointeurs vers la liste des blocs de données libres

Le Superbloc est dupliqué sur le système de fichiers.

Inodes

En tapant la commande ls -ld vous obtenez une liste d'objets présents dans le répertoire courant.

Le premier caractère de chaque ligne peut être un des suivants :

  • - - un fichier
  • d - un répertoire
  • l - un lien symbolique
  • b - un périphérique du type bloc
  • c - un périphérique du type caractère
  • p - un tube nommé pour la communication entre processus
  • s - un socket dans un contexte réseau

Par exemple :

# ls -l /dev/*dsk/c0t0d0s0
lrwxrwxrwx   1 root     root          47 Nov 29 13:41 /dev/dsk/c0t0d0s0 -> ../../devices/pci@0,0/pci8086,2829@d/disk@0,0:a
lrwxrwxrwx   1 root     root          51 Nov 29 13:41 /dev/rdsk/c0t0d0s0 -> ../../devices/pci@0,0/pci8086,2829@d/disk@0,0:a,raw

# ls -l /devices/pci@0,0/pci8086,2829@d/disk@0,0:a*
brw-r-----   1 root     sys       33,  0 Nov 30 06:44 /devices/pci@0,0/pci8086,2829@d/disk@0,0:a
crw-r-----   1 root     sys       33,  0 Nov 30 07:20 /devices/pci@0,0/pci8086,2829@d/disk@0,0:a,raw

Chaque fichier est représenté par un inode. L'inode, d'une taille de 128 octets contient :

  • le type de fichier, soit -, d, l, b, c, p, s
  • les droits d'accès, par exemple rwx rw- r–
  • le nombre de liens physiques soit le nombre de noms
  • l'UID du créateur ou l'UID affecté par la commande chown s'il y a eu une modification
  • le GID du processus créateur ou le GID affecté par la commande chgrp
  • la taille du fichier en octets
  • la date de création, soit le ctime
  • la date de dernière modification, soit le mtime
  • la date du dernier accès, soit le atime
  • les adresses qui pointent vers les blocs de données du fichier

Graphiquement, on peut schématiser cette organisation de la façon suivante :

Pour visualiser le numéro d'inode, utilisez l'option -i :

# ls -ldi /dev/*dsk/c0t0d0s0
    311303 lrwxrwxrwx   1 root     root          47 Nov 29 13:41 /dev/dsk/c0t0d0s0 -> ../../devices/pci@0,0/pci8086,2829@d/disk@0,0:a
    311348 lrwxrwxrwx   1 root     root          51 Nov 29 13:41 /dev/rdsk/c0t0d0s0 -> ../../devices/pci@0,0/pci8086,2829@d/disk@0,0:a,raw

# ls -ldi /devices/pci@0,0/pci8086,2829@d/disk@0,0:a*
  17301507 brw-r-----   1 root     sys       33,  0 Nov 30 06:44 /devices/pci@0,0/pci8086,2829@d/disk@0,0:a
  17301508 crw-r-----   1 root     sys       33,  0 Nov 30 07:20 /devices/pci@0,0/pci8086,2829@d/disk@0,0:a,raw

# ls -ldi /etc /etc/passwd
       824 drwxr-xr-x  86 root     sys         4608 Nov 30 06:44 /etc
      1301 -rw-r--r--   1 root     sys          710 Jan 11  2013 /etc/passwd

Blocs d'Indirection

L'inode contient les adresses des blocs de données du fichier. Par un système de blocs d'indirection, la taille maximale d'un fichier peut être de 1 téraoctet et la taille maximale du filesystem de 16 téraoctets.

Blocs de données

Les données sont stockées dans des blocs de données. Dans le cas d'un répertoire, le bloc de données contient une table qui référence les inodes et les noms des fichiers dans le répertoire.

Le nom d'un fichier est stocké dans le bloc de données et non pas dans l'inode. Cette particularité nous permet de donnéer deux noms différents au même fichier. Pour ajouter un nouveau nom à un fichier, il convient de créer un lien physique.

Liens Physiques

Un lien physique se crée en utilisant la commande suivante :

  • ln nom_du_fichier nom_supplémentaire

Pour illustrer ce point, tapez la ligne de commande suivante :

# cd /tmp; mkdir inode; cd inode; touch fichier1; ls -ali
total 16
4038066373 drwxr-xr-x   2 root     root         182 Nov 30 07:23 .
4031513256 drwxrwxrwt   7 root     sys          524 Nov 30 07:23 ..
4041221744 -rw-r--r--   1 root     root           0 Nov 30 07:23 fichier1

Notez bien le numéro de l'inode du fichier fichier1. Notez aussi que le numéro dans le troisième champs de la ligne de fichier1 a la valeur 1 :

4041221744 -rw-r–r– 1 root root 0 Nov 30 07:23 fichier1

Créez maintenant un lien physique et visualisez le résultat :

# ln fichier1 fichier2; ls -lai
total 16
4038066373 drwxr-xr-x   2 root     root         247 Nov 30 07:25 .
4031513256 drwxrwxrwt   7 root     sys          524 Nov 30 07:23 ..
4041221744 -rw-r--r--   2 root     root           0 Nov 30 07:23 fichier1
4041221744 -rw-r--r--   2 root     root           0 Nov 30 07:23 fichier2

Notez les deux lignes suivantes :

4041221744 -rw-r–r– 2 root root 0 Nov 30 07:23 fichier1
4041221744 -rw-r–r– 2 root root 0 Nov 30 07:23 fichier2

Les deux fichiers, fichier1 et fichier2, sont référencés par le même inode. Le nombre de liens est donc augmenté de 1.

Liens Symboliques

Un lien symbolique est un raccourci vers un autre fichier ou répertoire. Un lien symbolique se crée en utilisant la commande suivante :

  • ln -s nom_du_fichier nom_raccourci

Pour illustrer ce point, tapez les commandes suivantes :

# ln -s fichier1 fichier3; ls -lai
total 24
4038066373 drwxr-xr-x   2 root     root         312 Nov 30 07:27 .
4031513256 drwxrwxrwt   7 root     sys          524 Nov 30 07:23 ..
4041221744 -rw-r--r--   2 root     root           0 Nov 30 07:23 fichier1
4041221744 -rw-r--r--   2 root     root           0 Nov 30 07:23 fichier2
4041221688 lrwxrwxrwx   1 root     root           8 Nov 30 07:27 fichier3 -> fichier1

Notez que le lien symbolique est référencé par un autre inode. Le lien symbolique pointe vers le fichier1.

Création

La création d'un système de fichiers UFS se fait grâce à la commande newfs. Un exemple d'une telle commande est :

newfs -v -b 4096 -m 10 /dev/rdsk/c0t0d1s0

Dans cette commande on stipule :

  • -v
    • le mode verbose
  • -b 4096
    • une taille des blocs de 4096 octets
  • -m 10
    • 10% d'espace disque réservé à root

La commande newfs est une commande de confort qui invoque la commande mkfs.

Par contre pour connaître les options d'une partition, il convient d'utiliser la commande mkfs avec l'option -m :

# mkfs -m /dev/dsk/c0t0d0s7
mkfs -F ufs -o nsect=128,ntrack=48,bsize=8192,fragsize=1024,cgsize=16,free=1,rps=7,nbpi=8155,opt=t,apc=0,gap=0,nrpos=8,maxcontig=128,mtb=n /dev/dsk/c0t0d0s7 15133230

Il est aussi possible lors de la création de spécifier trois autres options :

nbpi

L'option npbi (number of bytes per inode) correspond au nombre maximum de fichiers que peut contenir le filesystem. Les valeurs par défaut sont :

Taile du filesystem Valeur de nbpi
< 1Go 2048
< 2Go 4096
< 3Go 6144
< 1To 8192
> 1To 1048576

free

Cette option stipule le pourcentage du disque réservé à root.

opt

Cette option désigne la politique de'optimisation :

  • time - optimisation des performances (option par défaut),
  • space - optimisation par espace disque.

Seules les options opt et free peuvent être modifiées après la création du filesystem.

Vérification

Un indicateur stocké dans le superblock permet de connaître l'état du filesystem. Cet indicateur peut prendre plusieurs valeurs :

Valeur Description
FSACTIVE Le filesystem est monté sans l'option logging et est actif
FSCLEAN Le filesystem a été démonté correctement
FSSTABLE Le filesystem est monté sans l'option logging mais est inactif
FSLOG Le filesystem utilise l'option logging. Il n'est pas précisé si il est monté ou démonté
FSBAD Le filesystem contient des données incohérentes

Au démarrage du système fsck n'est lancé que si l'indicateur est FSBAD

La commande fsck peut être lancé manuellement. Il est nécessaire de démonter le filesystem avant son utilisation et de vérifier celui-ci avec fsck et l'option -m. La commande fsck attend un argument qui est un nom de partition en mode raw bloc :

# umount /export/home
# fsck -m /dev/rdsk/c0t0d0s7
** /dev/rdsk/c0t0d0s7
ufs fsck: sanity check: /dev/rdsk/c0t0d0s7 okay

Saisissez maintenant la commande suivante :

# fsck /dev/rdsk/c0t0d0s7
** /dev/rdsk/c0t0d0s7
** Last Mounted on /export/home
** Phase 1 - Check Blocks and Sizes
** Phase 2 - Check Pathnames
** Phase 3a - Check Connectivity
** Phase 3b - Verify Shadows/ACLs
** Phase 4 - Check Reference Counts
** Phase 5 - Check Cylinder Groups
2 files, 9 used, 7444611 free (19 frags, 930574 blocks, 0.0% fragmentation)

La dernière ligne indique :

Mot clé Description
files Le nombre d'inodes utilisés
used Le nombre de fragments utilisés
free Le nombre de fragments inutilisés
frags Le nombre de fragments inutilisés dans des blocs utilisés
blocs Le nombre de blocs complets inutilisés

Si des erreurs sont trouvées, la commande devient interactive.

Il est possible donc de lancer la commande fsck avec une option -y ou -n pour contourner l'interactivité éventuelle.

Paramétrages

Nous avons vu que l'option free sur /dev/dsk/c0t0d0s7 a une valeur de 1 :

# mkfs -m /dev/dsk/c0t0d0s7
mkfs -F ufs -o nsect=128,ntrack=48,bsize=8192,fragsize=1024,cgsize=16,free=1,rps=7,nbpi=8155,opt=t,apc=0,gap=0,nrpos=8,maxcontig=128,mtb=n /dev/dsk/c0t0d0s7 15133230

Afin de modifier cette valeur, nous disposons de la commande tunefs. L'utilisation de cette commande est limitée aux filesystems démontés.

Saisissez la commande suivante :

# tunefs -m 5 /dev/dsk/c0t0d0s7
minimum percentage of free space changes from 1% to 5%

Vérifiez son application :

# mkfs -m /dev/dsk/c0t0d0s7
mkfs -F ufs -o nsect=128,ntrack=48,bsize=8192,fragsize=1024,cgsize=16,free=5,rps=7,nbpi=8155,opt=t,apc=0,gap=0,nrpos=8,maxcontig=128,mtb=n /dev/dsk/c0t0d0s7 15133230

Gestion du système de fichiers ZFS

Introduction

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