Ceci est une ancienne révision du document !
Table des matières
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
où 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
<html> <center> Copyright © 2019 Hugh Norris. </center> </html>