Installation et utilisation du système de fichiers ext3

Qing LIU (qliu@club-internet.fr)

Version 1.0, 16 janvier 2002.

Version précédente


Ce document a pour but d'aider les utilisateurs peu ou moyennement expérimentés à mettre en place un système de fichiers ext3. En dehors de quelques expériences pratiques, j'ai surtout puisé mes sources dans le document d'Andrew Morton, ainsi que dans la lecture de la mailing-list ext3-user, en espérant ne pas avoir introduit trop d'erreurs. La version la plus récente de ce document se trouve sur http://qliu.free.fr/Linux/ext3.html. Merci de m'envoyer vos critiques par email.

Sommaire

1. Introduction
2. Support noyau et programmes requis
3. Création d'un système de fichiers ext3
4. Passage entre ext2 et ext3
5. Utilisation avancée
6. Documentation
7. Remerciements

1. Introduction

Les systèmes de fichiers journalisés sont en passe de se banaliser sous Linux de nos jours. Les plus connus actuellement sont: reiserfs qui est intégré au noyau depuis 2.4.1; jfs développé par IBM; xfs, système de fichiers originaire de SGI, porté sous Linux par leurs soins; et enfin, ext3 dont nous allons décrire rapidement l'utilisation ici.

L'avantage d'un système de fichiers journalisé est de maintenir en permanence la cohérence des métadonnées [1]. Au reboot après un crash du système (problème matériel, bug du noyau etc), au lieu d'un long et pénible fsck avec ext2, le système va relire le journal, examiner les transactions non terminées, et remettre un système de fichiers sain en quelques secondes. En revanche, la journalisation offre peu de garantie quant au contenu des fichiers eux-même. Si vous étiez en train de modifier un fichier au moment du crash, vous ne pouvez pas toujours récupérer le fichier dans son état avant la modification (et encore moins la version modifiée), tout au moins avec les systèmes de fichiers comme reiserfs, jfs et xfs. Par contre, ext3 est plus sûr de ce côté (en mode par défaut, data=ordered, voir section 5). Pour une description technique des systèmes de fichiers journalisés, nous renvoyons le lecteur aux documents cités dans la section 6.

Ext3 est écrit au départ par Stephen Tweedie. La première version 0.0.1 date de septembre 1999. Depuis, il en est à la version 0.0.7a pour le noyau 2.2.19. Il n'y a pas de développement futur prévu pour les noyaux 2.2 à part les corrections de bugs. En effet, grâce à une nouvelle équipe de hackers, ext3 a été porté sous noyaux 2.4, et a suivi un développement rapide et intensif. Les efforts sont concentrés sur cette branche à l'heure actuelle. Ext3 est considéré comme stable, et est intégré au noyau officiel 2.4.15.

Comparé aux autres systèmes de fichiers journalisés, un des principaux intérêts d'ext3 est sa compatibilité avec le bon vieux ext2 car grosso modo, ext3 = ext2 + journal. Cela veut dire en particulier que:

  • Vous pouvez convertir vos partitions ext2 actuelles directement en ext3 sans perte de données. Cela est appréciable si vous ne voulez (ou ne pouvez) pas jongler avec la création de nouvelles partitions.

  • Si vous utilisez occasionnellement un noyau qui ne reconnaît pas ext3, il montera les partitions ext3 en ext2, et les données sur la partition seront exactement les mêmes du point de vue de l'utilisateur. À cela un bémol quand même. Il faut que la partition ext3 soit démontée proprement et que /etc/fstab soit correctement renseigné. En cas de plantage, une partition ext3 ne peut être montée qu'avec un noyau supportant ext3.

  • Robustesse, disponibilité et performance d'outils associés (les programmes conçus pour ext2 fonctionnent tels quels pour ext3, ou après quelques modifications);
  • Vous pouvez consulter l'article de Michael K. Johnson et celui de Daniel Robbins qui décrivent plus précisément les avantages d'ext3. Nous reviendrons sur le réglage des paramètres d'ext3 à la section 5.

    Comparaison de performance avec d'autres systèmes de fichiers

    Il faut savoir que la journalisation a un certain coût qui se répercute sur la performance du système de fichiers. En clair, ext3 est généralement un peu moins rapide qu'ext2 sur les opérations intensives de création/suppresion de fichiers, même si dans une situation normale, il est équivalent, voire théoriquement supérieur à ext2. Il faut donc peser le pour et le contre en fonction des ses besoins. Comparé aux autres systèmes de fichiers disponibles sous linux comme reiserfs, xfs, jfs, on peut dire ext3 s'en sort très bien, sauf dans le cas extrême de la manipulation simultanée de centaines de milliers de tout petits fichers. Voir les benchmarks réalisés par la société namesys (détentrice de reiserfs). J'ai moi-même réalisé quelques tests. J'insiste sur le fait qu'il faut prendre les benchmarks pour ce qu'ils sont, c'est-à-dire qu'ils ne représentent pas ce qui se passe dans la vie réelle.

    [Sommaire]


    2. Support noyau et programmes requis

    Les distributions récentes (Mandrake 8.1, RedHat 7.2, Suse 7.3) supportent ext3 "out of the box". Si ce n'est pas le cas de votre distribution, il faut s'assurer que le noyau supporte ext3, et que e2fsprogs et mount soient à jour.

  • Le noyau. Ext3 est officiellement inclus dans le noyau depuis 2.4.15. Auparavant, il existait dans la série -ac d'Alan Cox depuis un certain temps, et aussi sous la forme de patchs pour les noyaux officiels. Vous pouvez d'abord vérifier la présence du support d'ext3 avec les commandes
    grep ext3 /proc/filesystems
    find /lib/modules/`uname -r` -name 'ext3.o*'
    (attention au sens des quotes `). Si vous voyez "ext3" ou "ext3.o", alors votre noyau supporte ext3. Sinon, il va falloir le patcher et recompiler. Vous pouvez obtenir les patchs pour les noyaux 2.4 récents ici, et pour les 2.2 là. La procédure de recompilation est standard à partir des sources officielles:
    cd /usr/src/linux/
    gzip -dc /chemin/de/ext3-2.4-*-*.patch.gz | patch -p1
    Pour les noyaux 2.2, il faut d'abord décompresser ext3-0.0.*.tar.gz, ensuite patcher successivement linux-2.2.x.kdb.diff et linux-2.2.x.ext3.diff avec
    patch -p1 < /chemin/de/linux-2.2.x.yyy.diff
    Ensuite, make menuconfig ou make xconfig. Dans la section "File systems", activer le support d'ext3 ("Ext3 journalling file system support" pour 2.4 et "Enable Second extended fs development code" pour 2.2). Il est plus simple de le compiler en dur (au lieu d'être en module), surtout si vous prévoyez de mettre la partition / en ext3. Ensuite,
    make dep clean bzImage
    make modules
    su -c 'make modules_install'
    copier le nouveau noyau
    cp arch/ARCH/boot/bzImage /boot/vmlinuz-ext3
    ARCH est i386, alpha, ... suivant la famille du processeur, ajouter une entrée dans /etc/lilo.conf pour le nouveau noyau,
    image = /boot/vmlinuz-ext3
    label = ext3fs
    root = /dev/hda1
    (mettez votre partition / ici)
    read-only
    et relancer /sbin/lilo. Si ext3 est en module, ne pas oublier mkinitrd. Pour plus de détail sur la compilation du noyau et la configuration de lilo.conf, consulter Kernel-Howto, Lilo-Howto, et taper man lilo.conf. Rebooter et c'est prêt.
  • e2fsprogs. C'est le package qui contient mke2fs, fsck, tune2fs etc. Tous ces outils sont destinés aux systèmes de fichiers ext2 et ext3 sans distinction. Il est recommandé d'installer la version 1.25 ou supérieure (entre autres pour que fsck reconnaisse le flag auto dans /etc/fstab). Vérifiez votre version en tapant fsck
    [liu]:~/$ fsck
    fsck 1.25 (20-Sep-2001)
    No devices specified to be checked!
    Pour installer la version requise, visitez le site de votre distribution, ou récupérez les sources et compilez-les vous-même. Dans le répertoire des sources (détarées et décompressés), vous tapez
    mkdir build && cd build
    ../configure

    make
    make check
    su -c 'make install'
    Par défaut, les programmes sont installés dans /sbin. Il faut qu'ils soient dans le même répertoire que vos binaires d'origine. Attention, installer soi-même des programmes dans /sbin, /bin risque de mettre en péril la gestion des packages de votre système. Il est préférable de mettre à jour avec les packages fournis par votre distribution. Si vous ne pouvez pas le faire, une sauvegarde des programmes d'origine est vivement recommandée.

  • mount. Il est recommandé d'installer la version 2.11f ou supérieure. Ceci afin que mount reconnaisse automatiquement les partitions ext3. Vérifiez votre version avec mount -V
    [liu]:~/$ mount -V
    mount: mount-2.11h
    Le programme mount se trouve dans le package util-linux. Ce package contient des programmes vitaux du système, et la configuration de ses options n'est pas d'un abord facile pour un débutant. Mais en ce qui nous concerne ici, on peut se contenter dans le répertoire des sources d'un
    make lib mount
    cd mount/
    su -c 'make install'
    Ainsi on n'installe que mount et quelques autres programmes du répertoire mount/. Il est important de taper cd mount/ sous peine de casser votre système en installant d'autres programmes. Si vous avez des doutes, ne touchez à rien. Après tout, ce n'est pas bien gênant de devoir taper mount -t ext3 /dev/toto /titi au lieu de mount /dev/toto /titi. Mais alors vous ne pouvez pas utiliser "auto" comme type de système de fichiers dans /etc/fstab. Voir plus bas.

  • [Sommaire]

    3. Création d'un système de fichiers ext3

    La création d'un système de fichiers ext3 est très simple. Dans tout ce qui suit, nous prenons l'exemple d'une partition /dev/hda5 montée en /usr/local, et nous signalerons autant que possible les particularités concernant la partition /.

  • Sur une partition neuve. Vous avez une partition flambant neuve, disons /dev/hda5, et vous souhaitez la formater en ext3. Rien de plus simple. Vous tapez (en tant que root):
    mke2fs -j /dev/hda5
  • Sur une partition ext2 existante. Vous avez une partition, disons /dev/hda5, avec déjà le système de fichiers ext2 dessus. Vous pouvez la convertir en ext3 avec la commande tune2fs -j:
    [root]:~/# tune2fs -j /dev/hda5
    tune2fs 1.25 (20-Sep-2001)
    Creating journal inode: done
    This filesystem will be automatically checked every 35 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.
    
    Cette opération préserve vos données existantes. De plus, elle ne nécessite pas de démonter la partition. Taper man mke2fs et man tune2fs pour plus de détails sur les options liées au journal.
  • Vous pouvez contrôler le résultat en tapant
    [root]:~/# dumpe2fs -h /dev/hda5
    dumpe2fs 1.25 (20-Sep-2001)
    Filesystem volume name: < none >
    ...
    Filesystem features: has_journal filetype ...
    Le flag "has_journal" montre que vous avez ext3 sur la partition. Pour s'en servir sans plus tarder, il suffit maintenant de démonter la partition (si elle est déjà montée en ext2 et si ce n'est pas /) et de la remonter en ext3. Par exemple:
    umount /dev/hda5
    mount -t ext3 /dev/hda5 /usr/local
    (l'option -t ext3 n'est pas utile si mount est à jour). Pour la partition /, il faut rebooter. On vérifie que la partition est effectivement montée en ext3 par
    cat /proc/mounts
    Le résultat de la commande mount (sans argument) n'est pas totalement fiable, surtout lorsqu'il s'agit de la partition /. Cette vérification est utile si un arrêt brutal du système entraîne un fsck long.

  • Éditer fstab. Il reste à remplir correctement /etc/fstab pour que la partition soit automatiquement montée en ext3 lors des prochains montages. Le flag pour le type de partition est "auto" ou "ext3". Par exemple:
    /dev/hda5 /usr/local auto defaults 1 2
    (mettre 1 à la dernière colonne s'il s'agit de la partition /). L'option "auto" permet de monter une partition ext3 si mount est de version supérieure à 2.11f. De plus, cette option a l'avantage de permettre à un noyau ne reconnaissant pas ext3 de monter la partition en ext2. Par contre, pour /, il vaut mieux mettre ext3 directement. Elle sera toujours montée en ext2 par un noyau sans le support d'ext3, et cela évite à df d'oublier d'afficher /, et surtout, il semble que l'option auto pour / pose quelque problème si ext3 est en module chargé par initrd. Pour les options de montage (à la place de defaults), voir man mount ou la section 5.

  • Quelques bugs connus. Avec le noyau 2.4.10, la création d'ext3 sur la partition / échoue sans que l'on en soit averti. Il faut donc éviter d'utiliser ce noyau avec ext3. Il a de toute façon des défauts rédhibitoires de jeunesse, à cause du changement de la gestion de la VM (mémoire virtuelle), vous pouvez vous en passer sans regret :-). Si vous avez une Suse 7.3, il faut mettre à jour leur script mk_initrd. Enfin, bug plus sérieux, à l'heure où ce document est écrit, il semble qu'ext3 ne cohabite pas encore parfaitement avec disk quota.

  • [Sommaire]

    4. Passage entre ext2 et ext3

  • Monter une partition ext3 en ext2. Si, pour une raison ou autre, vous voulez monter une partition ext3 en ext2, vous avez juste à démonter la partition et la remonter en ext2. Avec l'exemple plus haut :
    umount /usr/local
    mount -t ext2 /dev/hda5 /usr/local
    Bien sûr cette opération est impossible avec la partition /. Pour monter / en ext2, il faut rebooter et rentrer l'option
    LILO: linux rootfstype=ext2
    au prompt de lilo (ce n'est valable qu'avec un noyau 2.4). Noter que le changement de "ext3" ou "auto" en "ext2" au niveau de /etc/fstab ne servirait à rien, car ce fichier n'est pas lu au moment où le noyau monte la partition /.

  • Le comportement avec un noyau sans le support d'ext3. À condition que les partitions ext3 soient démontées proprement, le démarrage avec un noyau sans le support d'ext3 ne pose pas de problème particulier. La partition / est automatiquement montée en ext2. Les autres le sont aussi à condition que le type correspondant dans /etc/fstab soit auto et non ext3, et qu'il n'y ait pas d'options de montage non reconnues par ext2 (par exemple data=writeback). Dans le cas contraire, un montage manuel est toujours possible, par exemple
    mount -t ext2 /dev/hda5 /usr/local
    Si une partition ext3 n'est pas proprement démontée, comme nous l'avons déjà signalé, elle ne pourra pas être montée par un noyau sans le support d'ext3. Il faudra appliquer au préablable un fsck en régle.

  • Pour revenir en ext3. Si une partition possédant les attributs d'ext3 a été montée en ext2, on la démonte, et on la remonte en ext3. Par exemple:
    umount /usr/local
    mount -t ext3 /dev/hda5 /usr/local
    Il n'y a rien d'autre à faire. Le journal n'est pas altéré par le montage en ext2.

  • Suppression d'ext3. Taper les commandes suivantes avec l'exemple plus haut:
    umount /dev/hda5
    tune2fs -O ^has_journal /dev/hda5
    fsck /dev/hda5
    mount -t ext2 /dev/hda5 /usr/local
    L'option de tune2fs est la lettre O, et non le chiffre 0. La commande fsck qui suit a pour rôle de supprime l'inode du journal. Enfin, le cas échéant, on peut supprimer le fichier ".journal" pour gagner un peu de place:
    chattr -i /usr/local/.journal
    rm /usr/local/.journal
    Pour terminer, ne pas oublier de modifier /etc/fstab en conséquence.

  • [Sommaire]

    5. Utilisation avancée

  • Peut-on se passer de fsck à intervalle régulier ? Avec ext3, fsck est programmé par défaut pour se lancer tous les 35 (ou un nombre approchant) montages ou tous les 180 jours. Vous pouvez régler cet intervalle avec tune2fs -c et tune2fs -i. En tout état de cause, il est préférable de laisser tourner fsck au moins une fois de temps à autres. En effet, le système de fichiers étant toujours marqué comme "clean" si son démontage se passe correctement, en cas de problème matériel sur le disque dur ou en cas de bugs du noyau, les erreurs ne sont pas toujours détectées. Il sera probablement trop tard pour agir quand vous les découvrirez.

  • Modes de journalisation. Ext3 dispose de trois modes de journalisation: "data=writeback"; "data=ordered"; et "data=journal". Ces modes sont activables au montage de la partition. Par défaut, ext3 est monté avec le mode "data=ordered" qui convient pour le cas général. Dans ce mode, les metadata - métadonnées [1] - sont d'abord écrites dans le journal, ensuite sur le disque après l'écriture effective des données sur le disque. Le mode writeback, où les métadonnées sont journalisées mais peuvent être écrites sur le disque avant les données elles-mêmes, est plus rapide dans certaines circonstances, tout en assurant la cohérence du système de fichiers (c'est une garantie supplémentaire par rapport à ext2). C'est aussi le mode de fonctionnement de reiserfs, jfs et xfs. Enfin, le mode "data=journal", où les données et les métadonnées sont journalisées, est plus lent car les données sont écrites deux fois, mais offre aussi plus de garantie quant à l'intégrité des fichiers. Ce mode est, semble-t-il, plus adapté aux bases de données. Le choix du mode dépend de vos besoins et des fonctions assignées à la partition concernée. Rien ne vaut un test en situation réelle. Pour utiliser un mode différent de celui par défaut, on met par exemple
    /dev/hda5 /usr/local auto data=writeback 1 2
    dans /etc/fstab. Pour un changement temporaire, on démonte la partition et on la remonte avec
    umount /usr/local
    mount -o data=writeback /usr/local
    Pour la partition /, on rentre l'option
    LILO: linux rootflags=data=writeback
    au boot (ou ajouter append="rootflags=data=writeback" dans lilo.conf).

  • Le choix des partitions. On peut envisager l'installation de plusieurs types de systèmes de fichiers en fonctions de la partition. Par exemple, ext3 pour les partitions dont l'intégrité est primordiale: /home, /var/spool/mail etc; ext2 avec option de montage ro (lecture seule) pour les partitions où l'écriture est occasionnelle: /usr, /usr/local; ext2 avec option noatime pour les partitions où les données sont transitoires /tmp, /var/tmp, répertoires de compilation etc.

  • Le journal. C'est l'endroit où sont stockés les logs d'activité de la journalisation. Si le journal a été créé par la commande tune2fs -j sur une partition démontée, ou par mke2fs -j sur une partition non formatée, alors il se matérialise sous la forme d'un inode invisible par le système de fichiers. Sinon, c'est un fichier caché ".journal" à la racine du système de fichiers, avec attribut "immuable" (man chattr). On peut imaginer ce fichier comme un fichier swap dédié à la journalisation. Son contenu change en permanence en fonction des activités du système de fichiers (création, modification, suppression de fichiers), mais le fichier lui-même garde la même taille et la même date de création/modification. Il est clair que pour éviter de se poser des questions métaphysiques inutiles :) ou tout simplement des fausses manipulations conduisant à la suppression malencontreuse du journal, il est préférable d'avoir le journal sous la forme d'inode invisible. À partir de la version 1.26 d'e2fsprogs, fsck sera capable, au démarrage du système, de convertir automatiquement tous les fichiers .journal existant en des inodes invisibles. À l'heure où nous écrivons, avec la version 1.26-WIP (24-Dec-2001), cela n'est pas encore possible pour la partition /.

    Si vous voulez recréer le journal sur /usr/local (par exemple si son journal est corrompu), il faut supprimer ext3 sur la partition, et recréer le journal en suivant la section 3. Une autre manière de procéder est comme suit (toujours avec l'exemple de la section 3):

    mount -o remount,ro /dev/hda5
    tune2fs -O ^has_journal /dev/hda5
    fsck /dev/hda5
    mount -o remount,rw /dev/hda5
    chattr -i /usr/local/.journal; rm /usr/local/.journal
    tune2fs -j /dev/hda5
    (démonter la partition avant tune2fs -j si on veut un inode invisible au lieu du fichier ".journal"). Cette méthode a l'avantage de pouvoir s'appliquer à la partition /, il suffit auparavant de fermer le maximum d'applications, et de passer au runlevel 1: telinit 1. Après la création du nouveau journal sur /, on revient au runlevel précédent N par un telinit N. En plus court: telinit `runlevel | cut -c 1`.

  • Exporter le journal.
  • Normalement, le journal d'une partition réside dans la partition elle-même. Pour différentes raisons (sécurité, rapidité ou étude), on peut créer le journal sur un autre périphérique block comme par exemple une partition dédiée, un ramdisk, ou une carte Nvram. Voici un exemple de création d'ext3 sur /dev/hda5 avec journal dans le ramdisk /dev/ram0:
    dd if=/dev/zero of=/dev/ram0 bs=1M count=32
    (création du ramdisk)
    mke2fs -O journal_dev /dev/ram0
    Je ne sais pas pour quelle raison, j'ai dû exécuter cette commande deux fois pour le journal soit effectivement crée. Attention, si vous faites cela sur une partition du disque dur, elle sera toute entière dévolue au journal. En particulier, cette commande détruit toutes les données existantes sur la partition journal.
    mke2fs -j -J device=/dev/ram0 /dev/hda5
    Il faut veiller à ce que les tailles de blocks de la partition et du périphérique contenant le journal soient les mêmes. On peut contrôler le résultat:
    [root]:~/# dumpe2fs -h /dev/hda5|grep Journal
    dumpe2fs 1.26-WIP (24-Dec-2001)
    Journal UUID: 22b542d4-d0ba-4f7b-a292-99f97c085720
    Journal inode: 0
    Journal device: 0x0100
    On voit que le journal est sur 0x0100, ce qui correspond bien au numéro de majeur-mineur de /dev/ram0. Pour finir, on doit expliciter le type de système de fichiers lors du montage:
    mount -t ext3 /dev/hda5 /usr/local/

    [Sommaire]


    6. Documentation

    Vous trouverez des explications détaillées sur l'installation et l'utilisation d'ext3 dans:

    Using the ext3 filesystem in 2.4 kernels d'Andrew Morton, un des développeurs d'ext3.

    Whitepaper: Red Hat's New Journaling File System: ext3, un très bon document écrit par Michael K. Johnson. Attention, ext3 n'appartient pas à RedHat !

    EXT3 File System mini-HOWTO rédigé par Rajesh Fowkar.

    Une FAQ, une peu succinte, rédigée par Juri Haberland.
    Des documents plus techniques sur ext3 et les systèmes de fichiers journalisés en général:
    EXT3, Journaling Filesystem, une conférence de Stephen Tweedie en juillet 2000.

    Softupdates et filesystems journalisés, un article de Thomas Pornin. Attention, ext3 ayant évolué depuis l'écriture de cet article, certaines réserves concernant ext3, notamment le fait que les données sont obligatoirement journalisées, ne sont plus de mise. Voir la section 5.

    Étude sur l'évolution des systèmes de fichiers d'Yves Rougy (Alcôve).

    Journalling Filesystems for Linux, (traduction en français ici) Linux Gazette numéro 68, par Matteo Dell'Omodarme

    Journal File Systems, (traduction en français ici) Linux Gazette numéro 55, par Juan I. Santos Florido.

    Introducing ext3, et Surprises in ext3, deux articles de Daniel Robbins.

    [Sommaire]



    7. Remerciements

    Pendant la rédaction de ce document, Isabelle a relu attentivement le texte, Y. Dessertine, S. Écolivet, A. Gomes-do-Vale, E. Labaume et T. Nemeth m'ont fait des suggestions pour améliorer la présentation, et V. Bernat m'a dit "Aucune [remarque], c'est très bien" (ça fait toujours plaisir :)).

    L'auteur: Je suis un mathématicien, utilisateur de Linux depuis janvier 1996. Je travaille principalement sous la distribution Slackware. Ma première installation d'ext3 remonte au noyau 2.4.6, et il m'a toujours donné satisfaction depuis (à part avec 2.4.10, mais ne jetons pas la pierre... :)).

    [Sommaire]


    [1] Les données sont les contenus des fichiers, tandis que les métadonnées sont relatives aux structures d'un système de fichiers: emplacement des fichiers, inodes, etc.