Le système de fichiers Linux

État : {publie}

Retour au document principal

Pré-requis

Objectifs

La structure du système de fichiers

Un système de fichiers est similaire à une arborescence. La racine de l'arborescence est au sommet et les feuilles en dessous.

Comme nous l'avons déjà vu, vous devez donner un point de montage aux partitions que vous créez. En général, on le fait au moment de l'installation. Pour mieux comprendre où se trouvent les choses, jetons un œil à l'arborescence typique d'un système de fichiers Linux.

Au sommet de l'arborescence, on trouve la racine (root) : /. C'est un peu comme le C:\ sous DOS, sauf que C:\ est également le premier périphérique, alors que la racine peut correspondre à n'importe quel périphérique de votre système.

Répertoires de base

                         /  <--- racine
                         |
 bin  dev  etc  lib      |     mnt  proc  sbin
  |    |    |    |       |      |     |     |
  -----------------------------------------------
   |      |     |    |    |        |       |    |
  boot  home  root  tmp  usr  /usr/local  opt  var

Répertoires dont le point de montage peut être un périphérique autre que celui de la racine :

  boot  home  root  tmp  usr  /usr/local  opt  var

Les répertoires de base sont les premiers sous-répertoires sous la racine. Sur un système de type RedHat, ils sont installés par un paquet rpm du nom de filesystem :

$ rpm -ql filesystem

Au démarrage du système, le noyau monte la partition racine (/). Pour pouvoir monter et vérifier les autres partitions et systèmes de fichiers, un certain nombre de programmes comme fsck, insmod ou mount doivent être accessibles.

Remarque : les répertoires /dev, /bin, /sbin, /etc et /lib doivent être sur la partition racine. De plus, la racine doit contenir un répertoire /proc vide. Il est utilisé par le noyau pour informer sur le statut du système d'exploitation (processus, statistiques d'utilisation de la mémoire, etc.).

Rôle des répertoires de base

/var/www, /var/ftp ou /srv : pages web ou fichiers ftp anonymes.

Formatage et cohérence des systèmes de fichier

Il est nécessaire de créer un système de fichiers pour organiser les données sur une partition. La procédure d'installation vous demande quel type de système de fichier vous souhaitez utiliser.

Vous avez un choix important de système de fichiers. Le format ext2, aussi connu comme le format natif pour Linux, est utilisé par défaut. Pour les programmes d'installation plus récents, ext3 (NdT et même aujourd'hui ext4 !) est utilisé par défaut. Ext3 est en fait un système ext2 journalisé.

Pour la mémoire paginée (swap), vous n'avez pas le choix, vous devez utiliser le système de fichiers swap.

Ext2

Regardons ext2 d'un peu plus prêt. Ext2 est constitué de blocs de 1024 octets (par défaut). Sans aller trop loin dans les détails, il y a 3 types de blocs : * les superblocs : répétés tous les 8193 blocs, les superblocs contiennent des informations sur la taille des blocs, les inodes libres, le dernier montage, etc. * les inodes : contient des pointeurs sur les blocs de données. Les 12 premiers blocs de données sont accédés directement. Si les données vont au-delà des 12 Ko, alors les inodes indirectes font le relai. * les blocs de données : correspondant aux fichiers ou aux répertoires, ils contiennent les données.

Outils de formatage

Les systèmes de fichiers gérés par le noyau nous permettent de lire les disques déjà formatés. Pour créer des systèmes de fichiers sur un système en fonction, nous devons installer et utiliser les outils correspondants.

Pour ext2, le programme de formatage est mkfs.ext2 ou mke2fs. De la même façon, pour le système de fichiers de Silicon Graphics xfs, vous utiliserez mkfs.xfs que vous devrez sans doute installer.

Le programme mkfs agit comme une interface pour les outils spécifiques à chaque système de fichier. Sa syntaxe est :

mkfs –t <type de système> <périphérique>

Vous noterez de nouveau qu'ext3 est un système de fichiers ext2 auquel on a ajouté la journalisation (voir plus loin les exercices).

Exemple 1 : formatage en jfs

mkfs -t jfs /dev/hda12

Exemple 2 : formatage en ext2fs

mke2fs /dev/hda11    [or mkfs –t ext2 /dev/hda11]

Cohérence des systèmes de fichiers

Vous devez utiliser fsck quand le système de fichiers est endommagé ou corrompu, mais cela nécessite au minimum de démonter la partition ou de la monter en lecture seule.

Comme mkfs, fsck se comporte comme une interface qui détecte automatiquement le type de système de fichiers de la partition. Ensuite, les programmes fsck.ext2, fsck.ext2, etc. sont appelés. Comme EXT2 est le système de fichiers principal de Linux, il existe une commande e2fsck qui ne gère que ce système de fichiers.

Vous pouvez préciser le type de système de fichiers en utilisant la syntaxe suivante :

fsck –t <type de système> <périphérique>

Exemple : vérification d'un système de fichiers reiserfs sur le périphérique /dev/sdb10 :

fsck –t reiserfs /dev/sdb10
fsck.reiserfs /dev/sdb10

Commandes de déboguage des systèmes de fichiers

Les commandes debugs et dumpe2fs sont rarement utilisées mais elles peuvent être utiles pour vous donner des informations de bas niveau sur un système de fichiers ext2 ou ext3.

debugfs [ -b tailledebloc ] [ -s superbloc ] [ -f cmd_file ] [ -R request ] [ -V ] [ [ -w ] [ -c ] [ -i ] [ périphérique ] ]

Le programme debugfs est un débogueur de système de fichiers interactif. Il peut être utilisé pour examiner ou modifier l'état d'un système de fichiers ext2/3.

Une fois dans le shell de debugfs, vous pouvez utiliser les commandes internes pour parcourir l'arborescence, examiner les données d'inode, supprimer des fichiers, créer des liens, récupérer le journal d'ext3, etc. Cette commande est très puissante et doit être utilisée avec précaution, en général seulement pour essayer d'avancer alors que fsck a échoué.

dumpe2fs [ -bfhixV ] [ -ob superbloc ] [ -oB tailledebloc ] <périphérique>

dumpe2fs affiche les informations des superblocs et des groupes de blocs pour le système de fichiers sur le périphérique.

dumpe2fs /dev/hda1

dumpe2fs 1.35 (28-Feb-2004)
Filesystem volume name:   /boot1
Last mounted on:          <not available>
Filesystem UUID:          d741042c-3eaf-49ee-94c1-7dd8c5459764
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              25584
Block count:              102280
Reserved block count:     5114
Free blocks:              80564
Free inodes:              25537
First block:              1
Block size:               1024
Fragment size:            1024
Reserved GDT blocks:      256
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         1968
Inode blocks per group:   246
Filesystem created:       Sat May  7 10:40:51 2005
Last mount time:          Sun May 29 04:08:01 2005
Last write time:          Sun May 29 04:08:01 2005
Mount count:              10
Maximum mount count:      -1
Last checked:             Sat May  7 10:40:51 2005
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               128
Journal inode:            8
Default directory hash:   tea
Directory Hash Seed:      50108791-6a0a-41ff-9608-0485c993eaf9
Journal backup:           inode blocks


Group 0: (Blocks 1-8192)
  Primary superblock at 1, Group descriptors at 2-2
  Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
  Inode table at 261-506 (+260)
  0 free blocks, 1942 free inodes, 2 directories
  Free blocks:
  Free inodes: 27-1968

[....]

Contrôle de l'utilisation des disques

Avec mount et df

Ces deux outils fonctionnent au niveau des périphériques et non pas au niveau des répertoires. Les commandes mount et umount mettent à jour la liste des systèmes de fichiers montés dans /etc/mtab.

mount sans option affiche la liste des systèmes de fichiers actuellement montés, qui est équivalente au contenu de /etc/mtab. Le noyau garde également une trace des systèmes de fichiers montés dans /proc/mounts.

df' affiche également les systèmes de fichiers montés mais il affiche également l'espace disque utilisé et disponible. Par défaut, l'espace est donné en blocs de 1K.

        df -h

        Filesystem            Size  Used Avail Use% Mounted on
        /dev/hda9             289M  254M   20M  93% /
        /dev/hda2              23M  7.5M   14M  35% /boot
        none                   62M     0   61M   0% /dev/shm
        /dev/hda5             1.4G  181M  1.1G  13% /share
        /dev/hda7             787M   79M  669M  11% /tmp
        /dev/hda3             4.3G  3.4G  813M  81% /usr
        /dev/hda6             787M  121M  627M  17% /var
        //192.168.123.2/share   12G  8.8G  3.7G  71% /mnt/smb

Utilisation de du

Cette commande affiche l'utilisation du disque, mais cette fois en se basant sur les répertoires, et non plus les périphériques. Vous noterez que du ne peut pas afficher l'espace disponible sur le disque puisque cette information n'est accessible qu'au niveau du périphérique.

La commande suivante affiche la taille utilisée pour /etc en utilisant une unité compréhensible par les humains (-h) et n'affiche que le total (-s : summary).

        du -sh /etc
        62M     /etc/

Droits d'accès et attributs des fichiers

Changement des permissions et des propriétaires

Exemple :

-rw-rw-r-- 1 utilisateur groupe 13281 2007-03-09 11:00 STATS.ods
    /\           /\        /\
   chmod        chown  chown/chgrp

Comme vous pouvez le voir dans l'exemple précédent, chmod est utilisé pour modifier les permissions. Il y a trois types de propriétaire pour chaque fichier ou répertoire :

Exemple :

-rw-rw-r--    1 jade   sales         24880 Oct 25 17:28 libcgic.a

Modification des permission avec chmod :

        chmod g=r,o-r libcgic.a
        chmod g+w  libcgic.a

Modification de l'utilisateur et du groupe avec chown et chgrp :

        chown  root  libcgic.a
        chgrp  apache libcgic.a

Remarque : Les trois outils chmod, chown et chgrp ont l'option très pratique -R qui applique les modifications récursivement sur les répertoires et fichiers indiqués.

Notation symbolique et octale

Les permissions sont soit la lecture read=r, l'écriture write=w et l'exécution execute=x. Voici les valeurs octales correspondant à ces permissions :

Symbolique

Octal

Binaire

r

4

'100'

w

2

'010'

x

1

'001'

Ces permissions s'appliquent à l'utilisateur, au groupe et aux autres. Un élément a un ensemble de 3 permissions groupées pour chacune de ces catégories.

Exemple : Interprétation d'une permission 755 ou -rwxr-xr-x :

Les permissions standard

Les systèmes UNIX créent des fichiers et répertoires avec des permissions standard comme suit :

Fichiers | 666

-rw-rw-rw-

Répertoires | 777

-rwxrwxrwx

Umask

Chaque utilisateur peut définir un umask qui altère la permission standard. Pour obtenir les permissions d'un fichier, on soustrait (*) la valeur octale du umask à la valeur octale de la permission standard. Cette permission n'a pas de nom mais on pourrait l'appeler la permission effective.

(*) Même si la soustraction fonctionne dans la plupart des cas, vous devriez noter que la formule utilisée pour calculer les permissions est :

Permissions finales = Permissions standard ET(logique) NON umask

Sur les systèmes où les utilisateurs appartiennent à différents groupes, la valeur du umask peut être 002. Pour les systèmes où tous les utilisateurs sont dans le groupe users, le umask a toutes les chances d'être fixé à 022.

Le SUID

On peut assigner une permission spéciale à un programme de façon à ce qu'il soit toujours lancé en tant que le propriétaire du fichier. On appelle cette permission SUID, ce qui signifie « set user ID » (définition de l'identifiant utilisateur). La valeur symbolique pour cette permission est s et la valeur numérique 4000.

Les outils d'administration peuvent avoir le SUID défini de façon à permettre aux utilisateurs de modifier des fichiers système.

Par exemple, la commande passwd peut être lancée par n'importe quel utilisateur pour lui permettre de changer son mot de passe, qui sera écrit soit dans /etc/passwd, soit dans /etc/shadow. Pourtant, ces deux fichiers appartiennent à l'utilisateur root et leurs permissions respectives sont 644 et 600.

On résout ce problème en plaçant le bit SUID sur la commande passwd, ce qui la force à être lancée en tant que root et lui permet de modifier les fichiers /etc/passwd et /etc/shadow.

Le SUID sur passwd :

ls -l $(which passwd)
-r-s--x--x    1 root     root        18992 Jun  6  2003 /usr/bin/passwd

Remarque : dans la commande précédente, le SUID est affiché dans sa forme symbolique. Vous pouvez obtenir plus d'information sur un fichier en utilisant stat et en regardant la représentation octale des permissions :

stat /usr/bin/passwd
File: `/usr/bin/passwd'
Size: 18992    Blocks: 40   IO Block: 4096   regular file
Device: 305h/773d    Inode: 356680      Links: 1
Access: (4511/-r-s--x--x)  Uid: ( 0/ root)   Gid: ( 0/ root)

Attention : La permission SUID pose souvent des problèmes de sécurité. En voici un exemple :

  1. Un utilisateur cherche à lire les mails du root. D'abord, il change sa variable d'environnement MAIL :

export MAIL=/var/spool/mail/root
  1. Ensuite, il lance la commande mail :

 mail
 /var/spool/mail/root: Permission denied

Ça ne fonctionne pas, ça aurait été trop facile ! Mais si un administrateur s'est laissé convaincre de placer le bit SUID sur la commande mail, les commandes précédentes permettraient à n'importe quel utilisateur de lire les mails de n'importe quel autre (root compris) !

Les exemples suivants sont également dangereux, pourquoi ?

chmod 4755 /bin/cat
chmod u+s /bin/grep

Le SGID

Le SGID est une permission similaire au SUID mais pour le groupe. Sa valeur symbolique est s et sa valeur octale est 2000.

Si vous placez le SGID sur un répertoire, les fichiers qui y seront ensuite créés appartiendront au groupe propriétaire de ce répertoire. Il n'est donc pas nécessaire d'utiliser newgrp pour modifier le groupe du processus utilisé pour la création du fichier (voir l'exercice plus loin).

Exemples :

chmod 2755 /home/data
chmod g+s /bin/wc

Le sticky bit

La permission sticky bit avec la valeur 1000 a l'effet suivant :

Exemples :

chmod 1666 /data/store.txt
chmod o+t /bin/bash

Les attributs sur les fichiers

Au côté des permissions standard, il existe un autre système pour modifier la façon dont on peut accéder à un fichier. Les attributs de fichiers ne s'affichent pas avec la commande ls mais avec la commande lsattr. On utilise la commande chattr pour paramétrer ou supprimer ces attributs.

Les attributs suivants existent. Veuillez noter les cas d'utilisation : * « A » : Quand on accède à un fichier avec l'attribut A, sa valeur atime (temps d'accès) n'est pas modifiée. Ceci évite un certain nombre d'accès disques, ce qui est plutôt pratique pour des fichiers temporaires. Attention cependant, certains outils comme tmpwatch se basent sur la valeur du atime pour déterminer l'utilisation récente d'un fichier, donc si le atime n'est pas mis à jour l'état du fichier sera mal interprété.

Exemple :

# lsattr testfile
            ------------- testfile

# chattr +i testfile
# lsattr testfile
----i-------- testfile
# rm -f testfile
rm: cannot remove `testfile': Operation not permitted

# chattr -i testfile
# rm -f testfile
# ls testfile
ls: testfile: No such file or directory

Résumé et exercices

Questions de révision

Oui ou Non

  1. Le répertoire /usr doit toujours se trouver sur la partition racine puisqu'il contient des données essentielles au démarrage
  2. Il est possible que certaines opérations ne fonctionnent pas si le répertoire personnel d'un utilisateur se trouve ailleurs que dans /home
  3. La création d'un système de fichiers sur une partitin détruit toujours toutes les données de cette partition

Voir les réponses

Glossaire

Terme

Description

Répertoires de base

Sous-répertoires se trouvant directement sous la racine

Bloc de données

Bloc utilisé pour stocker les données sur le système de fichiers. Ils sont référencés par les inodes

Sous-répertoires de la racine essentiels

Répertoires devant se trouver sur le système de fichiers racine pour le démarrage du système

ext2

Second extended file system : système de fichiers par défaut sur Linux (NdT : aujourd'hui remplacé par Ext3 puis Ext4)

ext3

Third extended filesystem : évolution de ext2 avec les mêmes fonctionnalités plus un système de journalisation

Permissions sur les fichiers

Attributs stockés dans l'inode du fichier pour les droits en lecture, écriture et exécution attribués au propriétaire (u), au groupe (g) ou aux autres (o) ainsi que des permissions plus avancées comme le SUID, le SGID et le "sticky bit"

FHS

Filesystem Hierarchy Standard (« norme de la hiérarchie des systèmes de fichiers »). Ce standard consiste en un ensemble de règles et de recommandations pour le placement des fichiers et des répertoires sur les systèmes de la famille UNIX. L'objectif de ces règles est d'améliorer l'interopérabilité des applications, outils d'administration ou de développement, et des scripts, ainsi que d'uniformiser la documentation sur ces systèmes. Voir http://www.pathname.com/fhs/

Inode

Bloc utilisé pour stocker les informations sur les fichiers, répertoires et les liens symboliques. La localisation des données des fichiers, les permissions, l'horodatage et le type de fichier (répertoire, fichier ou lien symbolique) se trouvent dans l'inode.

Orlov block allocator

Algorithme qui améliore les performances des systèmes de fichiers EXT2/EXT3. Disponible uniquement sur les noyaux 2.6. Cette fonctionnalité a été portée de BSD puis améliorée par Alexander Viro, Andrew Morton, et Ted Ts'o. Son auteur originel est Grigory Orlov. Cette fonctionnalité peut être activée avec la commande chattr sous Linux

Superbloc

Le superbloc est lu au montage du système de fichiers. Il contient différentes informations comme la taille des blocs du système de fichiers (1024 par défaut), le nombre d'inodes libres, le nombre de montage et le nombre maximum de montages utilisés pour déterminer si une vérification du système de fichiers doit être lancée

Fichiers

Fichier

Description

/etc/mtab

Fichier utilisé par mount pour conserver la trace des périphériques montés

/proc/mounts

Fichier utilisé par le noyau pour conserver la trace des périphériques montés

Commandes

Commande

Description (apropos)

chattr

Modifier les attributs des fichiers d'un système de fichiers Linux

chgrp

Changer le groupe propriétaire d'un fichier

chmod

Changer les permissions d'un fichier

chown

Modifier le propriétaire et le groupe d'un fichier

df

Indiquer l'espace occupé par les systèmes de fichiers

du

Évaluer l'espace disque occupé par des fichiers

e2fsck

Vérifier un système de fichiers Linux ext2/ext3/ext4

fsck

Vérifier et réparer un système de fichiers Linux

lsattr

Afficher les attributs des fichiers sur une partition Linux de type ext2

mke2fs

Créer un système de fichiers ext2/ext3/ext4

mkfs

Créer un système de fichiers Linux

mount

Tous les fichiers accessibles sur un système de fichiers Unix sont rangés sur une arborescence unique, la hiérarchie des fichiers dont la racine est /. Ces fichiers peuvent être répartis sur différents périphériques. La commande mount est utilisée pour attacher le système de fichiers d'un périphérique sur l'arborescence. À l'inverse, la commande umount détache ce système de fichiers de l'arborescence

umask

Outil utilisé pour configurer le masque de création de mode de fichier - voir help umask

Travaux pratiques

Systèmes de fichiers

  1. Créez deux nouvelles partitions de plus de 50 Mo sur /dev/hda (ou /dev/sda) en utilisant fdisk.

    • Conseils :
      • Pour créer une nouvelle partition, tapez n. Le type de partition par défaut est 83 (Linux)

      • Pour écrire la table des partitions, tapez w.

      • Le système doit lire votre nouvelle partition : redémarrez votre ordinateur !
  2. Formatez la première partition en ext2 et la seconde en reiserfs.

    • Conseil : Le programme mkfs est une interface à mkfs.ext2 ou mkfs.reiserfs, etc. Sa syntaxe est :

      mkfs –t <type_de_système> <périphérique>
  3. Créez deux répertoires dans /mnt et montez vos deux partitions

    • mkdir /mnt/ext2
      mkdir /mnt/reiserfs
  4. Vérifiez l'état de votre système :
    • Utilisez mount pour lister les périphériques montés. Les permissions configurés dans fstab sont également visibles.

    • Utilisez df pour voir le nombre total de blocs utilisés. L'option -k converti le nombre de blocs en kilo-octets (taille par défaut pour un bloc sur ext2)

    • Lancez fsck sur l'un des deux systèmes de fichiers créés. Le programme fsck est une interface à fsck.ext2, fsck.ext3, fsck.reiserfs, etc. Sa syntaxe est :

      fsck <périphérique>
  5. Aller plus loin : passer de ext2 à ext3

    • Passez le périphérique monté sur /mnt/ext2 en ext3 avec tune2fs, qui ajoutera un journal au système de fichiers existant. Assurez-vous d'adapter votre fichier /etc/fstab pour prendre en compte cette modification.

      tune2fs –j /dev/hdaN

      À ce stade, le système a ajouté un journal à la partition /dev/hdan, qui est devenue une partition ext3. Ce procédé est non-destructif et réversible. Si vous montez un système de fichiers ext3 en ext2, le fichier .journal est écrasé. Vous pouvez le recréer avec tune2fs.

Permissions sur les fichiers

  1. Connectez vous en utilisateur normal (pas root). Créez un fichier en utilisant touch et vérifiez que les permissions effectives sur ce fichier sont 664.

  2. Changez le umask en 027. Si vous créez un nouveau fichier, quelles seront les permissions effectives sur ce fichier ? Où configure-t-on la valeur du umask ? Suivant les systèmes, ce sera dans /etc/profile ou /etc/bashrc.

  3. Créez deux utilisateurs :
    useradd util1
    useradd util2

    Initialisez leurs mots de passe avec passwd util1 et passwd util2

  4. Créez le groupe ventes

    groupadd ventes
  5. Ajoutez les utilisateurs au groupe ventes
    gpasswd -a util1 ventes
    gpasswd -a util2 ventes
  6. Créez un répertoire /news avec comme groupe propriétaire ventes et en lecture/écriture pour ce groupe.

    mkdir -m 770 /news ; chown .ventes /news
  7. Placez le GID sur le répertoire /news
    chmod g+s /news
    Quelles sont les permissions symboliques (-rwxr-xr-x) sur /news ? (Utilisez ls -ld /news)

    Vérifiez qu'un membre du groupe ventes n'a pas besoin de taper "newgrp ventes" pour créer des fichiers avec les bonnes permissions. Les membres du groupe ventes peuvent-ils modifier n'importe quel fichier de ce répertoire ?

  8. Ajoutez le sticky-bit sur /news. Vérifiez que seuls les propriétaires peuvent modifier leurs fichiers dans ce répertoire. Comment se présentent les permissions dans /news ?

  9. En tant que root, placez le SUID root sur xeyes. Connectez-vous en utilisateur normal et vérifiez que le programme est lancé par le root.

    chmod u+s `which xeyes`

    Connectez-vous en utilisateur normal et lancez xeyes, puis :

    ps aux | grep xeyes
    Le programme devrait être lancé par root.

Réponses aux questions

  1. Non : aucun programme placé dans /usr n'est nécessaire au démarrage du système

  2. Non : on peut placer le répertoire personnel d'un utilisateur n'importe où sur le système

  3. Oui

Page consultée 574 fois