AuFS : Unir les contenus de répertoires

AuFS, pour Another Union File System (un autre système de fichier d’union), est un système de fichier implémenté sur la base d’UnionFS (Union File System) permettant de rendre accessible au travers d’un montage la superposition, l’union, de plusieurs répertoires.

AuFS uni des répertoires

Toutes modifications des données via le montage sont répercutées sur le ou les répertoires accessibles en lecture/écriture.

AuFS doit être activé dans le noyau (exemple sur Debian) :

root@srv:~# grep AUFS_FS /boot/config-$(uname -r)
CONFIG_AUFS_FS=m

L’installation des utilitaires nécessaires est des plus classiques :

apt-get install aufs-tools

Premier exemple

La commande suivante :

mount -t aufs -o br=A:B none AB

donne accès à la superposition des répertoires A et B dans le répertoire AB :

AuFS Fusion de répertoires

Les répertoires A et B sont appelés des branches (notés « br » dans les options de montage via « mount »).

L’ordre de déclaration des branches définit la priorité d’affichage des contenus. Dans le cas d’un fichier existant dans plusieurs branches (exemple « fic3 »), le fichier présenté par le montage est celui de la branche la plus prioritaire :

root@srv:/srv/dir# cat A/fic3 
fic3 dans A
root@srv:/srv/dir# cat B/fic3 
fic3 dans B
root@srv:/srv/dir# cat AB/fic3 
fic3 dans A

Par défaut, la première branche est montée en lecture/écriture et les autres en lecture seule :

root@srv:/srv/dir# touch AB/fic5
root@srv:/srv/dir# ls AB
fic1  fic2  fic3  fic4  fic5  repA
root@srv:/srv/dir# ls A
fic1  fic3  fic5  repA
root@srv:/srv/dir# ls B 
fic2  fic3  repA

Si un fichier d’une branche en lecture seule est modifié, il est créé dans la branche accessible en lecture écriture :

root@srv:/srv/dir# echo "Modif d'un fichier de B via AB" > AB/fic2
root@srv:/srv/dir# cat B/fic2
root@srv:/srv/dir# cat A/fic2 
Modif d'un fichier de B via AB

Plus de deux branches simultanément

Il est possible de monter plus de deux branches simultanément :

root@srv:/srv/dir# ls AB/
fic1  fic2  fic3  fic5  repA
root@srv:/srv/dir# ls C/
fic4
root@srv:/srv/dir# mount -t aufs -o remount,br=A:B:C none AB
root@srv:/srv/dir# ls AB/
fic1  fic2  fic3  fic4  fic5  repA

Dans cet exemple, les contenus les plus prioritaires seront donc ceux du répertoire A, puis ceux de B et enfin ceux de C.

Note : lors de l’invocation de « mount », « none » précise qu’aucun périphérique (device) n’est associé à ce montage.

Ajouter une branche

Il est possible d’ajouter un répertoire au montage directement :

root@srv:/srv/dir# ls AB/
fic1  fic2  fic3  fic4  fic5  repA
root@srv:/srv/dir# ls D
fic4  fic6
root@srv:/srv/dir# cat C/fic4                                                                                    
fic4 dans C
root@srv:/srv/dir# cat D/fic4 
fic4 dans D
root@srv:/srv/dir# mount -t aufs -o remount,append:D none AB
root@srv:/srv/dir# ls AB/
fic1  fic2  fic3  fic4  fic5  fic6  repA
root@srv:/srv/dir# cat AB/fic4 
fic4 dans C

Note : « append », « add » et « ins » sont équivalent.

Par défaut le répertoire est ajouté avec la plus faible priorité (équivalent de « A:B:C:D » dans cet exemple) mais le répertoire peut être ajouté à une place donnée en précisant l’indice d’insertion :

root@srv:/srv/dir# ls E/
fic4
root@srv:/srv/dir# mount -t aufs -o remount,add:2:E none AB
root@srv:/srv/dir# cat AB/fic4 
fic4 dans E

Note : l’indexation commence à 0 (index de « A » dans notre exemple)

Le montage actuel est équivalent à la séquence « A:B:E:C:D ».

Note : « add:0:/répertoire » est équivalent à « prepend:/répertoire »

Retirer un répertoire

L’option « del » permet de retirer une branche de l’agrégation AuFS :

root@srv:/srv/dir# mount -t aufs -o remount,del:C none AB

En considérant que la superposition avant la commande était « A:B:E:C:D », le résultat de la commande donne une superposition « A:B:E:D ».

Plusieurs branches en écritures

Jusqu’à présent, seule la première branche (répertoire déclaré dans la première colonne) était accessible en écriture, mais il est possible de monter plusieurs branches en écritures en précisant le mode d’accès lors du montage :

root@srv:~# mount -t aufs -o br=/guest/=rw:/users/=rw,udba=reval  none /home/

Dans cet exemple, les répertoires utilisateurs stockés dans « /guest/ » et « /users/ » sont rendus accessibles en lecture écriture dans le répertoire « /home/ ».

udba : User’s Direct Branch Access

L’option de montage « udba » définit la stratégie à adopter en cas de modification des répertoires fusionnés (des branches) sans passer par le montage AuFS.

L’option peut prendre les valeurs suivantes :

  • none : cette valeur n’assure pas une synchronisation immédiate en cas de modification directe des branches. Elle est rapide mais peut retourner des données erronées.
  • reval : les branches sont relues et mise à jour. Chaque modification est donc répercutée sur le montage.
  • notify : utilise inotify (voir inotify / incron : Lancer une commande en cas d’action sur un fichier/un répertoire pour plus d’informations sur inotify) pour répercuter les modifications des branches sur le montage.

Utilisation de stratégies pour l’écriture

AuFS peut être utilisé pour optimiser les écritures en appliquant une stratégie d’accès au montage grâce à l’option « create ». Par exemple, pour appliquer la stratégie « round-robin » notée « rr » nous utiliserons l’option « create=rr » :

root@srv:/srv/dir2# mkdir A B C AB
root@srv:/srv/dir2# mount -t aufs -o br=A=rw:B=rw:C=rw,udba=reval,create=rr none AB
root@srv:/srv/dir2# touch AB/fic1
root@srv:/srv/dir2# touch AB/fic2
root@srv:/srv/dir2# touch AB/fic3
root@srv:/srv/dir2# ls A
fic1
root@srv:/srv/dir2# ls B
fic2
root@srv:/srv/dir2# ls C
fic3

Les écritures sur le montage tournent sur les branches qui le composent.

Les stratégies disponibles sont :

  • rr : round-robin stratégie illustrée ci-dessus ;
  • mfs : most-free-space, les fichiers sont écrits dans les répertoires offrant le plus d’espace disque ;
  • mfsrr : combinaison de mfs et de round-robin qui sélectionne d’abord la branche offrant le plus d’espace disque puis effectuant le round-robin ;
  • tdp : top−down−parent (politique par défaut) qui sélectionne en priorité la branche accessible en écriture où les répertoires parents existent ;
  • pmfs : identique à tdp mais si le répertoire parent existe sur plusieurs branches, l’écriture se fera sur la branche offrant le plus d’espace disponible.

Entrée AuFS dans /etc/fstab

Une union de répertoires via AuFS peut être montée au boot en l’ajoutant au fichier /etc/fstab.

Exemple de déclaration dans fstab :

...
none	/mnt/aufs	aufs	br=/local/dir1=rw:/srv/dir2=rw:/scratch=rw,udba=reval,create=rr	0 0

Note : les montages donnant accès aux points de montage AuFS (ici « /mnt/aufs ») ainsi qu’aux répertoires de données (ici « /local/dir1 », « /srv/dir2/ » et « /scratch/ ») doivent être déclarés dans fstab AVANT le montage AuFS.

Références

Page de man d’AuFS : http://aufs.sourceforge.net/aufs2/man.html

4 réflexions au sujet de « AuFS : Unir les contenus de répertoires »

  1. Hello,

    Marrant, je cherchais justement des info la dessus aujourd’hui..
    Comment va se passe au niveau des permissions du coup ? Est-ce qu’il est aussi question de « priorité », comme pour l’affichage ?

    1. Je lis dans tes pensées 😉 Pour les permissions, c’est un peu plus compliqué. C’est le même principe de priorité que pour les fichiers mais cela peut donner des situation particulières.
      Exemple :
      > Dans « A » mettons le répertoire « AA » en lecture uniquement (r-x).
      > Dans « B » mettons également « AA » contenant un fichier « fic1 » accessible en lecture écriture (rw-).
      > Montons « A:B » dans « AB ».
      > Si « fic1 » est modifié depuis le montage aufs, il est créé dans « A/AA » alors que ce répertoire n’est pas accessible en écriture.

      Ça interpelle …

  2. Salut,
    Tu as laissé passer un smiley, sauras tu le trouver ?

    Et sinon, tu as quoi comme cas d’utilisation pour aufs ? Au labo ?

    1. C’est corrigé 😀 Coté application, un article est en cours de rédaction sur la gestions de multiples site basés sur le même CMS, mais il y en a plein d’autres …

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *