web-dev-qa-db-fra.com

Comment utiliser OverlayFS?

Ceci réponse et message électronique indique que quelque chose appelé "OverlayFS" est disponible dans Ubuntu 11.10 et remplacera forcément aufs dans Ubuntu 12.04.

Comment puis-je l'utiliser? Où est sa documentation?

53
ændrük

Edit: Depuis que cette réponse a été écrite, certaines choses ont changé dans les superpositions, à savoir l’ajout du paramètre requis workdirname__, voir réponse de totti ci-dessous pour une description détaillée de ce nouveau paramètre.

J'ai finalement réussi à le trouver. J'ai trouvé des références à cela dans les sources du noyau, mais pour une raison quelconque, cela n'apparaît pas dans l'arborescence git sur kernel.org. Mais! Si vous extrayez le code source du noyau Ubuntu comme suit: apt-get source linux-image-3.0.0-16-generic, vous pourrez le trouver dans linux-3.0.0/Documentation/overlayfs.txt. Il est également disponible dans le paquet linux-doc dans /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Comme la documentation d'aide actuelle est plus un "comment ça marche" au lieu d'un "comment monter avec elle", voici un bref aperçu (il y a un exemple dans la documentation du noyau):

mount -t overlayfs -o [mount options] overlayfs [mountpoint for merged system]

Où [options de montage] peuvent être:

  • lowerdir = somedir: lowerdir est le répertoire dans lequel vous allez poser votre nouveau système de fichiers. S'il existe des doublons, ceux-ci sont écrasés par (en réalité, cachés en faveur de) la version de upperdir.
  • upperdir = somedir: upperdir est le répertoire que vous souhaitez superposer à lowerdir. S'il existe des noms de fichiers en double dans lowerdir et upperdir, la version de upperdir est prioritaire.
  • options de montage standard. Le seul que j'ai vu à partir du code est ro/rw, mais vous pouvez expérimenter.

Une chose qui m'a dérouté au début, alors je devrais probablement préciser, est que monter un overlayfs ne monte pas un système de fichiers. J'essayais de monter un système de fichiers squashfs en utilisant un montage overlayfs, mais ce n'est pas ainsi que cela fonctionne. Vous devez d’abord monter le système de fichiers (dans mon cas squashfs) dans un répertoire quelconque, puis utiliser overlayfs pour fusionner le point de montage (un répertoire) et un autre répertoire dans un répertoire tertiaire (le point de montage overlayfs) (edit: this "tertiary") peut être réellement le répertoire upperdir =). Le répertoire tertiaire est l'endroit où vous verrez les systèmes de fichiers fusionnés (ou les arborescences de répertoires - c'est flexible).

Exemple 1, superposition du système de fichiers racine

Je travaille sur un disque d'amorçage hybride Ubuntu où le système de base Ubuntu existe sous la forme système de fichiers.squashfs et j'ai des fichiers nommés ubuntu.overlay kubuntu.overlay xubuntu.overlay et lubuntu.overlay. Les fichiers .overlay sont des installations de base desdits systèmes avec le contenu de filesystem.squashfs élagué (pour économiser de l'espace). Ensuite, j'ai modifié les scripts d'initialisation pour superposer le fichier .overlay de la distribution correcte (à partir d'un paramètre de démarrage) en utilisant overlayfs et les options ci-dessus, et cela fonctionne comme un charme!

Voici les lignes que j'ai utilisées dans mes scripts d'initialisation (une fois toutes les variables traduites):

mkdir -p /overlay
mount -t squashfs /cdrom/casper/ubuntu.overlay /overlay
mount -t overlayfs -o lowerdir=/filesystem.squashfs,upperdir=/overlay overlayfs /

Notez que filesystem.squashfs ci-dessus est un répertoire créé par casper, pas un fichier.

Ces trois instructions créent un répertoire /overlay, montent un système de fichiers squashfs sur le répertoire /overlay, puis utilisent OverlayFS pour fusionner essentiellement le contenu de /overlay avec /.

Exemple 2, fusion transparente de deux répertoires

Dans le processus de reconstruction de ma clé USB live pour chaque version, j'utilise OverlayFS pour gagner beaucoup de temps. Je commence avec un répertoire appelé ubuntu-base qui contient le contenu de l'image ubuntu-core, qui est l'installation la plus basique. Je créerai ensuite des répertoires appelés ubuntu, kubuntu, lubuntu et xubuntu.

Ensuite, j'utilise OverlayFS pour que les fichiers d'ubuntu-base apparaissent dans les répertoires individuels. Je voudrais utiliser quelque chose comme ça:

mount -t overlayfs -o lowerdir=ubuntu-base,upperdir=kubuntu overlayfs kubuntu

Cela fait apparaître les fichiers d'ubuntu-base dans le dossier kubuntu. Ensuite, je peux chrootdans le dossier kubuntu et faire quelque chose comme apt-get install kubuntu-desktop. Toutes les modifications apportées pendant ce montage OverlayFS resteront dans le répertoire supérieur, dans ce cas le dossier kubuntu. Ensuite, une fois que je démonte OverlayFS, montez les fichiers qui existent vraiment dans ubuntu-base mais sont "mis en miroir" dans le dossier kubuntu, sauf s’ils ont été modifiés. Cela me permet d’avoir plusieurs copies des fichiers dans ubuntu-base tout en pouvant les utiliser comme s’ils existaient physiquement à chaque emplacement.

62
Chuck R

De https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt :

Plus haut et plus bas

Un système de fichiers en superposition combine deux systèmes de fichiers: un système de fichiers "supérieur" et un système de fichiers "inférieur". Lorsqu'un nom existe dans les deux systèmes de fichiers, l'objet dans le système de fichiers 'supérieur' est visible, tandis que l'objet dans le système de fichiers 'inférieur' est masqué ou, dans le cas de répertoires, fusionné avec l'objet 'supérieur'.

Il serait plus correct de faire référence à une "arborescence de répertoires" supérieure et inférieure plutôt qu'à un "système de fichiers", car il est tout à fait possible que les deux arborescences de répertoires se trouvent dans le même système de fichiers et il n'est pas nécessaire de spécifier la racine d'un système de fichiers. soit supérieur ou inférieur.

Le système de fichiers inférieur peut être n’importe quel système de fichiers pris en charge par Linux et n’a pas besoin d’être inscriptible. Le système de fichiers inférieur peut même être un autre overlayfs. Le système de fichiers supérieur sera normalement accessible en écriture. S'il l'est, il doit prendre en charge la création d'attributs étendus de confiance. * Et doit fournir un type d valide dans les réponses readdir. NFS ne convient donc pas.

Une superposition en lecture seule de deux systèmes de fichiers en lecture seule peut utiliser n'importe quel type de système de fichiers.

Répertoires

La superposition concerne principalement des répertoires. Si un nom donné apparaît à la fois dans les systèmes de fichiers supérieur et inférieur et fait référence à un non-répertoire dans l'un ou l'autre, l'objet inférieur est masqué - le nom ne fait référence qu'à l'objet supérieur.

Lorsque les objets supérieur et inférieur sont des répertoires, un répertoire fusionné est formé.

Au moment du montage, les deux répertoires spécifiés comme options de montage "lowerdir" et "upperdir" sont combinés dans un répertoire fusionné:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

Le "workdir" doit être un répertoire vide sur le même système de fichiers que upperdir.

Ensuite, chaque fois qu'une recherche est demandée dans un tel répertoire fusionné, la recherche est effectuée dans chaque répertoire réel et le résultat combiné est mis en cache dans le répertoire appartenant au système de fichiers de superposition. Si les deux recherches réelles trouvent des répertoires, elles sont toutes deux stockées et un répertoire fusionné est créé. Sinon, un seul est stocké: le supérieur s'il existe, sinon le inférieur.

Seules les listes de noms de répertoires sont fusionnées. Les autres contenus, tels que les métadonnées et les attributs étendus, sont signalés uniquement pour le répertoire supérieur. Ces attributs du répertoire inférieur sont masqués.

20
totti

J'ai étendu ces artikels pour inclure un script pour overlayfs qui configure un fs racine en lecture seule.

J'espère que ça aide.

7
Floyd42

Exemple minimal exécutable

# Create the filesystems.
dd if=/dev/zero of=lower.ext4 bs=1024 count=102400
mkfs -t ext4 lower.ext4
cp lower.ext4 upper.ext4
mkdir lower upper overlay
Sudo mount lower.ext4 lower
Sudo mount upper.ext4 upper
Sudo chown "$USER:$USER" lower upper
printf lower-content > lower/lower-file
# Upper and work must be on the same filesystem.
mkdir upper/upper upper/work
printf upper-content > upper/upper/upper-file
# Work must be empty. E.g. this would be bad:
#printf work-content > upper/work/work-file
# Make the lower readonly to show that that is possible:
# writes actually end up on the upper filesystem.
Sudo mount -o remount,ro lower.ext4 lower

# Create the overlay mount.
Sudo mount \
  -t overlay \
  -o lowerdir=lower,upperdir=upper/upper,workdir=upper/work \
  none \
  overlay \
;

# Interact with the mount.
printf 'overlay-content' > overlay/overlay-file
ls lower upper/upper upper/work overlay

# Write to underlying directories while mounted
# gives undefined behaviour.
#printf lower-content-2 > lower/lower-file-2
#printf upper-content-2 > upper/upper-file-2

# Unmount the overlay and observe state.
Sudo umount overlay
ls lower upper/upper upper/work

# Cleanup.
Sudo umount upper lower

GitHub en amont .

Sortie du premier lsavec le montage:

lower:
lost+found  lower-file

overlay:
lost+found  lower-file  overlay-file  upper-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Sortie du deuxième lssans le montage:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interprétation:

  • lower: était inchangé après avoir écrit en superposition
  • upper: a reçu la modification de superposition
  • superposition: affiche les fichiers à la fois supérieur et inférieur
  • work: contient du contenu aléatoire (un répertoire work/) dont on ne devrait pas se soucier

Exemple adapté de: Exemple d'utilisation de superpositionFS

Voici un exemple plus complexe avec plusieurs couches inférieures: Overlayfs recharger avec plusieurs couches (migration en dehors de aufs)

Testé sur Ubuntu 18.04, noyau Linux 4.15.0.