Systèmes d'exploitation — fondations · L2 · Section 5/12
Système de fichiers sous Unix
Progression
#Système de fichiers sous Unix
Prérequis
- Chapitre Fichiers du module: descripteurs, open/read/write.
- Manipulation shell de liens (
ln,ln -s) vue dans Unix & Shell.
Objectifs d'apprentissage
- Décrire le contenu d'un inode et le relier à la sortie de
stat.- Prédire l'effet d'un lien matériel ou symbolique sur le compteur de liens.
- Expliquer le rôle du journal et distinguer
sync,fsyncetfdatasync.
Un système de fichiers ne se limite pas à un répertoire rempli de noms: c'est une structure hiérarchique qui décrit comment les données sont placées sur disque, récupérées et sécurisées. Unix a popularisé une organisation où les métadonnées sont regroupées dans des inodes et où chaque répertoire associe un nom à un numéro d'inode. Le nom vit dans le répertoire; l'identité vit dans l'inode.
#1. Inodes et blocs
Chaque inode contient la taille du fichier, les dates d'accès et de modification, les identifiants d'utilisateur et de groupe, les permissions, et une série de pointeurs vers les blocs de données. Ext4, par exemple, combine douze pointeurs directs et des pointeurs indirects (simple, double, triple) pour couvrir des fichiers allant de quelques octets à plusieurs téraoctets. Comprendre cette hiérarchie aide à expliquer pourquoi l'accès à un fichier gigantesque implique davantage de lectures de pointeurs qu'un fichier court.
Champ observable, champ compris:
1stat fichier.txt2# taille, blocs, inode, liens, uid/gid, dates atime/mtime/ctimeObservation instructive: la taille affichée par stat peut être inférieure aux blocs occupés, qu'aucune commande ne semble expliquer. L'inode référence des blocs par unités; sur ext4 avec des blocs de 4 Ko, un fichier de 10 octets occupe néanmoins 8 Ko d'espace (résultat de du). C'est la question classique des petits fichiers nombreux.
#Ce que contient exactement un inode
Le cours d'Unix énumère les informations attachées à un numéro d'inode, et cette liste mérite d'être sue par cœur.
- le bloc de disque où la donnée est stockée;
- le type de fichier;
- la taille du fichier;
- l'identifiant du propriétaire;
- les autorisations de lecture, d'écriture et d'exécution;
- la date de dernière modification, celle du dernier accès, etc.
Et une information qui n'y figure pas: le nom du fichier. Le nom est stocké dans l'inode du répertoire, sous forme d'une association entre un nom et un numéro d'inode. C'est cette séparation qui rend les liens durs possibles, et c'est elle aussi qui explique la sémantique des droits sur un répertoire: x y signifie « accéder aux inodes répertoriés », autrement dit traverser.
#Les systèmes de fichiers existants
Le cours donne la liste de référence. Sous Linux: ext2, ext3, ext4, ReiserFS v3, F2FS. Sous Windows: FAT, FAT32, NTFS. Ailleurs: ISO9660 pour les CD-ROM et DVD, HFSX sous Mac OS à partir de 10.4. Le système de fichiers est défini comme une structure de données sur disque contenant des fichiers, généralement structurée hiérarchiquement, avec un répertoire racine, une notion de chemin d'accès et une notion d'inode — chaque fichier ayant un inode unique, à ne pas confondre avec son nom.
#2. Liens, quotas et attributs avancés
Les liens matériels (hard links) ajoutent une nouvelle entrée de répertoire vers le même inode, ce qui signifie que la suppression d'un seul nom ne détruit pas le contenu tant que le compteur de liens n'est pas retombé à zéro. Les liens symboliques sont des fichiers spéciaux qui contiennent un chemin; ils peuvent pointer vers n'importe quelle cible, même absente, et facilitent la création d'alias ou de structures de déploiement. Limites à connaître: un lien matériel ne peut pas traverser un système de fichiers (l'inode est local à un volume) ni référencer un répertoire, alors qu'un lien symbolique peut faire les deux, au risque de casser.
Les administrateurs disposent en outre de quotas pour plafonner la place utilisée par un utilisateur, et d'ACL pour accorder des droits fins au-delà du triplet propriétaire/groupe/autres (getfacl, setfacl).
#Créer un fichier, c'est placer un lien dur
Le cours insiste sur une formulation qui éclaire tout: créer un fichier, c'est d'abord placer un lien dur dans le répertoire correspondant. Comme plusieurs liens durs peuvent pointer vers le même fichier, « un fichier n'est donc pas dans un répertoire ». La commande ln initial pointeur crée un lien nommé pointeur sur le fichier initial; les deux noms peuvent être absolus, relatifs ou locaux.
Deux limites définissent le lien dur. Il ne peut pas désigner un fichier inexistant. Il ne peut pas franchir un volume, puisqu'il désigne un bloc de données dans un espace physique donné. C'est précisément pour lever ces deux limites qu'existe le lien symbolique: ln -s initial pointeur crée un fichier spécial dont le contenu est un chemin, qui peut désigner un fichier situé sur un autre volume, et même un fichier qui n'existe pas.
La conséquence sur la suppression est la plus importante à retenir: la commande rm supprime non pas un fichier mais le lien dur mentionné en argument. Un fichier n'est réellement supprimé que lorsque plus aucun lien dur ne le désigne. Effacer un lien symbolique, en revanche, n'efface que le lien lui-même.
#3. Partitions, montage et partage
Le système de fichiers ne vit pas dans le vide: il occupe une partition d'un support, et doit être monté pour être accessible.
#Partitions
Une partition est une partie d'un disque dur. Partitionner permet d'installer plusieurs systèmes d'exploitation, de séparer les données dans un même système (programmes d'un côté, données utilisateurs de l'autre), et de créer une partition d'échange (swap), zone dédiée à l'échange entre mémoire vive et disque dur.
Il existe deux types de partitions: la partition primaire, capable d'accueillir un système d'exploitation, et la partition étendue, qui est une partition primaire spéciale pouvant contenir jusqu'à 64 partitions logiques. Un disque de PC peut contenir 4 partitions primaires. La table des partitions primaires se situe dans le MBR (Master Boot Record), premier secteur du disque.
Le programme présent dans le MBR est le chargeur d'amorçage (bootstrap loader): il charge le secteur de boot de la partition active, dans lequel se trouve un chargeur d'amorçage — LILO ou Grub pour Linux — qui lance effectivement le système. Le cours signale que le standard UEFI et la table GPT remplacent aujourd'hui le BIOS et le MBR.
Le plan de partitionnement recommandé prévoit une partition d'échange en début de disque — plus rapide si le disque est organisé en cylindres —, une partition pour la racine /, une partition pour les données utilisateurs /home, et éventuellement des partitions pour d'autres systèmes.
#Montage
Unix n'a pas de spécification de lecteurs différents comme C: ou D: sous Windows: on associe un système de fichiers à un répertoire appelé point de montage.
1mount -t type device dir # monter2mount # afficher tous les montages3umount repertoire # démonterL'opération de démontage est réservée à l'administrateur pour les volumes fixes, et obligatoire avant de retirer un support amovible. La plupart des volumes locaux sont montés automatiquement au démarrage sur des sous-répertoires de la racine: /var, /tmp, /usr, /home, etc. La commande df donne des informations sur l'ensemble des volumes.
Volumes distants. Le mécanisme NFS (Network File System) permet de monter un volume non local: l'ordinateur distant exporte le volume et joue le rôle de serveur, le client demande le montage sur un répertoire local, souvent à la demande (auto-montage). La transmission se fait en UDP, plus simple et rapide que TCP mais moins sûr, avec possibilité de pertes d'informations. Ce mécanisme de serveurs de fichiers permet le partage des données sur un grand nombre de postes. Samba joue le même rôle et implémente le protocole SMB/CIFS de Windows, ce qui permet le partage d'imprimantes et de fichiers entre Unix et Windows.
#4. Compresser et archiver
Le cours distingue nettement deux opérations que l'usage courant confond: compresser réduit la taille d'un fichier, archiver regroupe une hiérarchie entière en un seul fichier. Une archive compressée résulte des deux.
Trois familles d'algorithmes de compression sans perte, avec les taux indicatifs du cours sur un même fichier:
compress— algorithme le plus ancien, suffixe.Z, environ 34 %;uncompressfait le travail inverse.gzip— algorithme le plus courant, suffixe.gz, environ 27 %;gunzipfait le travail inverse.bzip2— algorithme le plus récent, suffixe indiqué.bzpar le cours (en pratiquebzip2produit l'extension.bz2), environ 22 %;bunzip2fait le travail inverse.
La méthode la plus efficace des trois est donc bzip2, et le cours précise que plus le fichier est gros, meilleur est le taux. Toutes trois acceptent l'option -c pour envoyer le résultat sur la sortie standard et -r pour travailler récursivement.
Pour l'archivage, tar couvre tous les besoins:
1tar cf archive fichiers # construire2tar xf archive # extraire3tar tf archive # lister le contenu4tar rf archive fichiers # ajouter à la fin5tar uf archive fichiers # ajouter ceux qui manquent ou ont changé6tar czf archive.tgz dossier # compresser avec gzip au passage7tar cjf archive.bz dossier # compresser avec bzip2 au passageL'option -f est obligatoire et doit toujours apparaître en dernier. Les noms, permissions et dates sont conservés tels quels; les liens symboliques aussi, sauf si l'on ajoute h pour les suivre comme des fichiers ordinaires. zip permet l'échange avec Windows et équivaut à peu près à une combinaison de tar et compress.
#5. Journalisation et cohérence
Les systèmes journalisés enregistrent les modifications dans un journal avant de les appliquer réellement aux structures principales. En cas de coupure, le noyau rejoue ou annule les transactions pour revenir à un état cohérent. Ce journal peut concerner les métadonnées seulement (ext3/ext4 en mode ordered) ou les données également (variantes de XFS, btrfs avec sa manière propre d'atteindre ce but). Les caches (page cache, dentry cache) complètent l'histoire en conservant les données et les chemins fréquemment utilisés.
Conséquence directe pour le développeur: close ne garantit rien sur disque, et sync force l'écriture de tous les tampons du système (déloyal en performance pour un seul fichier). Pour garantir la durabilité d'un fichier précis, utilisez fsync(fd), métadonnées comprises, ou fdatasync(fd), données seules, quand la taille n'a pas changé. Toute base de données construit sa fiabilité sur cette distinction, et le chapitre WAL du module Systèmes d'exploitation la revisite.
#Atelier: inodes et liens, en pratique
1cd "$(mktemp -d)"2echo donnees > a.txt3ln a.txt b.txt # lien matériel4stat -c '%n inode=%i liens=%h' a.txt b.txtObservation attendue: même inode, compteur à 2 pour les deux noms. Supprimez a.txt, puis vérifiez cat b.txt (le contenu est intact) et le compteur retombé à 1.
Extension (si les outils sont disponibles): créez un fichier image ext4 en loopback dans un répertoire temporaire, montez-le, créez-y fichiers et liens, observez les compteurs, puis démontez proprement avec umount. L'expérience d'une coupure brutale (démontage forcé sur l'image loopback, sans risque pour votre système) suivie d'une analyse fsck -n montre les incohérences que le journal vient corriger: c'est la démonstration la plus parlante de l'intérêt de la journalisation.
#Exercices
1. Que contient exactement un inode? Quelle information n'y figure pas, et où se trouve-t-elle?
2. Citer un système de fichiers utilisé sous Linux et un utilisé sous Windows. Que signifie « le nombre d'inodes est défini au formatage »?
3. Pourquoi un lien dur ne peut-il pas franchir deux volumes? Comment contourner cette limitation?
4. Qu'est-ce qu'une partition? Quels sont les deux types de partitions et combien de partitions primaires un disque de PC peut-il contenir?
5. Où se situe la table des partitions primaires, et quel programme y réside? Comment appelle-t-on la partition d'échange, et où la place-t-on traditionnellement?
6. Comment accède-t-on à un système de fichiers sous Unix? Pourquoi n'y a-t-il pas de lecteurs C: ou D:?
7. Quelle est la méthode de compression la plus efficace entre compress, gzip et bzip2? Comment tar combine-t-il archivage et compression?
8. Quelles commandes donnent l'occupation d'un répertoire et l'espace libre d'une partition?
Corrections détaillées
1. Un inode contient le bloc de disque où la donnée est stockée, le type de fichier, sa taille, l'identifiant de son propriétaire, les autorisations de lecture, d'écriture et d'exécution, et les dates de dernière modification et de dernier accès. Le nom du fichier n'y figure pas: il est stocké dans l'inode du répertoire, sous forme d'une association entre un nom et un numéro d'inode. C'est cette séparation qui rend les liens durs possibles.
2. Sous Linux: ext3 ou ext4 (ou ext2, ReiserFS v3, F2FS). Sous Windows: NTFS (ou FAT, FAT32). « Le nombre d'inodes est défini au formatage » signifie que la table des inodes est dimensionnée une fois pour toutes à la création du système de fichiers: on ne peut pas en ajouter sans reformater, même s'il reste de l'espace disque.
3. Un lien dur désigne un bloc de données dans un espace physique donné: il n'a donc pas de sens hors de ce volume. Le lien symbolique lève la limitation, car son contenu est un chemin et non un pointeur vers un inode. Il a d'ailleurs deux avantages de plus: il peut désigner un fichier inexistant, et il est clairement distinct d'un lien dur à la lecture de ls -l, où il apparaît avec le type l.
4. Une partition est une partie d'un disque dur. Les deux types sont la partition primaire, capable d'accueillir un système d'exploitation, et la partition étendue, qui est une primaire spéciale pouvant contenir jusqu'à 64 partitions logiques. Un disque de PC peut contenir 4 partitions primaires.
5. La table des partitions primaires se situe dans le MBR (Master Boot Record), premier secteur du disque. Le programme qui y réside est le chargeur d'amorçage (bootstrap loader), qui charge le secteur de boot de la partition active, où se trouve le chargeur d'amorçage proprement dit — LILO ou Grub sous Linux. La partition d'échange s'appelle la partition swap, et le cours recommande de la placer en début de disque, plus rapide lorsque le disque est organisé en cylindres.
6. Par le montage: on associe un système de fichiers à un répertoire appelé point de montage, avec mount -t type device dir, et on le démonte avec umount repertoire. Unix n'a pas de lecteurs C: ou D: parce que son arborescence est unique: les périphériques sont cachés, et le montage permet d'accéder à tous les systèmes de fichiers de la même manière, locaux ou distants — c'est exactement ce que fait NFS.
7. Les taux indicatifs du cours donnent compress à environ 34 %, gzip à environ 27 % et bzip2 à environ 22 %: la plus efficace des trois est donc bzip2, et le taux s'améliore avec la taille du fichier. tar combine les deux opérations par ses options de compression: z pour gzip, j pour bzip2, ce qui donne par exemple tar czf archive.tgz dossier pour archiver et compresser en une seule passe. L'option -f est obligatoire et doit apparaître en dernier.
8. du évalue l'encombrement: du -s résume au total, du -a détaille chaque fichier, du -k compte en kilo-octets. df donne pour chaque partition le périphérique de montage, la taille totale, la taille occupée, la taille disponible et le répertoire de montage. Les deux répondent à deux questions distinctes: le poids d'un contenu, et la place restante.