Cette documentation est vieille (mi-2009), c'est une étude pour avoir / choisir un système de fichier en quasi-lecture seule, elle n'a pas été retouchée/relue avant publication.

Les répertoires non persistant en tmpfs

Les modifications sur le système le système de fichier qui sollicitent le disque en écriture se trouvent dans des répertoires précis. Voici la liste :

  • /tmp
  • /var/log
  • /var/run
  • /var/lock
  • /var/cache
  • /var/tmp

Dans le cas d'un routeur, les données qui sont stockées dans ces répertoires n'ont pas besoin d'être rémanentes au reboot. Il est donc possible de monter un système de fichier tmpfs dans chacun de ces répertoires.

Remarque : les répertoires /var/log et /var/cache nécessitent un traitement particulier. Plusieurs programmes s'attendent à retrouver les répertoires et/ou fichiers qu'ils ont créés. Pour contourner cela il faut stocker et recréer à chaque démarrage la structure des répertoires et fichiers. Le contenu des fichiers peut-être vide.

Pour cela j'ai écrit le paquet debian fs2ram. Il a pour but de s'occuper de ces systèmes de fichiers (backup, démontage, montage, restauration).

Le fonctionnement de fs2ram

Il faut définir les répertoires à prendre en charge dans /etc/fs2ram.conf. La syntaxe est presque la même que /etc/fstab. Il y a deux colonnes en plus qui correspondent au script et aux options à utiliser pour sauvegarder le point de montage avant de le démonter. La restauration s'effectue en exécutant le script produit sur la sortie standard par le script de backup.

Par défaut :

  • pour /var/cache, les répertoires sont conservés (c'est le script /usr/share/fs2ram/backup-scripts/keep_folder_structure) ;
  • pour /var/log, les répertoires et fichiers (vides) sont conservés (c'est le script /usr/share/fs2ram/backup-scripts/keep_file_sctructure) ;
  • pour le reste, rien n'est conservé.

Pour suivre les écritures faites sur un système de fichier

Il existe un utilitaire qui s'appelle inotifywatch sous Debian/Lenny, il s'installe avec le paquet inotify-tools.

Cet outil permet de surveiller les accès aux systèmes de fichier. La commande suivante permet de suivre les modifications faites sur le système de fichier :

inotifywatch -e modify \
             -e attrib \
             -e close_write \
             -e move \
             -e create \
             -e delete \
             -e delete_self \
             -r /

Installation et configuration pour soupirail et passavant

  • installation : (utilisation d'un dépôt temporaire non-officiel)
  • configuration : La configuration par défaut (en décommentant le fichier /etc/fs2ram.conf) devrait être bonne.

Les autres solutions envisagées avant

Debian live

La solution du live CD ne semble pas idéale : si elle nous permet de construire notre distribution selon nos besoins, cela reste relativement lourd pour les mises à jours, et pas forcément adapté à notre problématique. Par contre, la technique des systèmes de fichiers unifiés, largement utilisés dans les distributions "Live", nous permet d'obtenir un système qui n'écrit que sur commande.

unionfs et aufs

Cette solution a été abandonnée car la synchronisation des systèmes de fichier n'est pas du tout fonctionnelle sur un système Debian Lenny, sans tuer le chien.

présentation

Le principe d'unionfs et aufs permettent d'unifier virtuellement plusieurs systèmes de fichiers appelés branches. Pour chaque branche, on Udéfinit sa priorité, et son mode : lecture seule, ou lecture ecriture. Dans debian, seul le paquet aufs est empaqueté, c'est pour ça que nous baserons nos exemples sur ce dernier.

principe général

Le principe général est le suivant :

  • dans la ram, nous créons deux systèmes de fichiers tmpfs, montés sur /union/ram_etc et /union/ram_var.

  • sur le disque, nous créons des partitions qui serviront à la synchronisation des tmpfs, et qui contiendront donc les modifications sur /var et /etc que nous aurons "commitées". Celles ci sont montées sur /union/rw_etc et /union/rw_var.

  • on monte dans /etc les unions de /union/ram_etc et lecture-écriture, /union/rw_etc et /etc en lecture seule.

  • on fait de même avec /var...

  • pour la synchronisation, il suffit de remonter /union/rw_* en lecture-écriture, et de faire un rsync avec /union/ram_*

Remarques :

  • aufs permet de mettre en à jour une branche quand celle-ci est utilisé par un point de montage aufs. Ceci permettrait donc de se passer de rw_etc et rw_var.
  • il faut s'assurer que le système est bien cohérent au démarrage (/etc/network/ifstate, /etc/mtab, etc.).

quelques lignes de commandes...

... parce que parfois c'est tellement plus clair. les partitions hda5 et hda5 sont les partitions créées au deuxième point de l'explication ci-dessus.

/bin/mount -t tmpfs tmpfs /union/ram_etc -o size=50M
/bin/mount -t tmpfs tmpfs /union/ram_var -o size=150M
/bin/mount  /dev/hda5 /union/rw_etc -o ro
/bin/mount  /dev/hda6 /union/rw_var -o ro
/bin/mount -t unionfs unionfs /etc/ -o dirs=/union/ram_etc=rw:/union/rw_etc=ro:/etc=ro
/bin/mount -t unionfs unionfs /var/ -o dirs=/union/ram_var=rw:/union/rw_var=ro:/var=ro

Ton système de fichier complet en aufs !

Avec l'arrivée des mini-pc (eeepc tout ça là), des personnes ont bossé sur l'utilisation des cartes compacts flash.

Pour résumer :

  1. Il faut ajouter un script dans l'initramfs qui se charge de :

    • créer une partition tmpfs en mémoire ;
    • monter la partition root en lecture seule ;
    • monter le système de fichier aufs ;
    • créer les scripts permettant de remonter partition réelle en lecture ou écriture.
  2. Ajouter le module aufs pour la génrétion des initramfs ;

  3. Installer aufs. Pour lenny, les paquets linux-modules-aufs-<kernel_version>-<arch> et aufs-tools ;

  4. Modifier /boot/grub/menu.lst pour lancer automatiquement la version aufs et mettre à jour grub ;

    • cela implique ajouter l'option aufs=tmpfs dans la ligne de commande.
  5. Mettre à jour les images initrd de démarrage.

Ce qu'il reste à tester : le script de commit

À priori il suffirait de lancer :

#! /bin/sh

remountrw
rsync -a --exclude=/rw --exclude=/ro --exclude=/sys --exclude=/proc \
         --exclude=/dev --delete-after / /ro
remountro

aufs semble bien se comporter aux vus des premiers tests...