Comment utiliser OverlayFS?

54

Cette réponse et cet e-mail indiquent 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?

ændrük
la source
1
Toi et moi, mon frère. Je suis venu dans ce jusqu'à présent: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Au-delà de ça, je suis désemparé. Je bricole avec cela dans un système en direct, mais je n'ai pas encore réussi à le faire fonctionner. J'aimerais pouvoir découvrir exactement ce que "upperdir" et "lowerdir" signifient. Je n'ai rien trouvé.
Chuck R

Réponses:

63

Edit: Depuis que cette réponse a été écrite, certaines choses ont changé dans les superpositions, à savoir l’ajout d’un paramètre requis workdir, voir la réponse 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 tirez la source du noyau Ubuntu comme ceci: apt-get source linux-image-3.0.0-16-genericvous pouvez la 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é, masqués en faveur de) la version de upperdir.
  • upperdir = somedir: upperdir est le répertoire que vous souhaitez superposer à lowerdir. Si les noms de fichiers en double existent 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 appelé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) à l'aide de overlayfs et des options ci-dessus, et cela fonctionne à merveille!

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 /overlayrépertoire, montent un système de fichiers squashfs sur le /overlayrépertoire, puis utilisent OverlayFS pour fusionner le contenu de /overlayover /.

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 chrootaller dans 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 "reflétés" dans le dossier kubuntu, sauf s’ils ont été modifiés. Cela m'empêche d'avoir plusieurs copies des fichiers dans ubuntu-base tout en pouvant les utiliser comme s'ils existaient physiquement à chaque emplacement.

Chuck R
la source
3
"mais pour une raison quelconque, il n'apparaît pas dans l'arborescence git de kernel.org" - C'est parce que overlayfs n'est pas dans le noyau en amont, tout comme aufs n'est pas (et ne le sera jamais). Ces systèmes de fichiers d'union sont intégrés par l'équipe de noyau Ubuntu.
MestreLion
2
OverlayFS entre apparemment dans le noyau 3.10.
David C. Bishop
8
Enfin, devrait aller dans 3.18 lwn.net/Articles/617099
Rmano
4
@Rmano: sur ma machine cela ne fonctionne qu'avec overlaypasoverlayfs
Janus Troelsen
1
Merci @austinmarton, j’ai trouvé cela aussi quelque temps en arrière et je l’ai couvert en entier avant de mettre à jour ma réponse, j’ai donc crédité sa réponse en haut de la mienne.
Chuck R
20

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 donné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 répertoire 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, ne sont rapportés que pour le répertoire supérieur. Ces attributs du répertoire inférieur sont masqués.

totti
la source
4
Merci pour la clarification sur workdir. C'était un changement assez récent et pour une raison quelconque, je n'ai jamais pu trouver de documentation sur ce que "workdir" a réellement fait. Ce n'était pas dans l'aide du noyau non plus la dernière fois que j'ai regardé. Cela ajoute une couche de confusion à overlayfs IMO, je souhaite que les versions les plus récentes puissent être utilisées sans cela - cela perturbe en quelque sorte mon flux de travail.
Chuck R
7

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.

Floyd42
la source
1
Grâce au travail que d'autres ont accompli, Dustin et moi-même avons ajouté un paquet banal nommé 'overlayroot' à quantal, qui fait partie du paquet source cloud-initramfs-tools . Voir la documentation d'utilisation dans /etc/overlayroot.conf
smoser le
2

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 la monture:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Sortie de la seconde lssans la monture:

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 work/répertoire) dont on ne devrait pas se soucier

Exemple adapté de: Example OverlayFS Usage

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

Testé sur Ubuntu 18.04, noyau Linux 4.15.0.

Ciro Santilli 改造 中心 六四 事件
la source