Wie verwende ich OverlayFS?


53

Diese Antwort und E-Mail-Nachricht zeigen an, dass etwas mit dem Namen "OverlayFS" in Ubuntu 11.10 verfügbar ist und aufs in Ubuntu 12.04 mit Nachdruck ersetzt.

Wie benutze ich es? Wo ist die Dokumentation?


1
Du und ich beide, Bruder. Ich habe über diese so weit gekommen: mount -t overlayfs -o rw,uppderdir=x,lowerdir=y overlayfs /mount/point. Darüber hinaus bin ich ahnungslos. Ich bastele daran in einem Live-System, aber ich habe es noch nicht geschafft, es zum Laufen zu bringen. Ich wünschte, ich könnte genau herausfinden, was "oberes Verzeichnis" und "unteres Verzeichnis" bedeuten. Ich habe nichts gefunden.
Chuck R

Antworten:


63

Edit: Da diese Antwort zu schreiben, einige Dinge in overlayfs geändert haben, nämlich die Zugabe eines gewünschten Parameters workdirfinden totti Antwort unten für eine detaillierte Beschreibung dieser neuen Parameter.

Ich habe es endlich geschafft, es zu finden. Ich habe in der Kernelquelle Verweise darauf gefunden, aber aus irgendeinem Grund wird es nicht im Git-Baum auf kernel.org angezeigt. Aber! Wenn Sie die Ubuntu-Kernelquelle wie folgt herunterladen: apt-get source linux-image-3.0.0-16-genericSie finden sie in linux-3.0.0/Documentation/overlayfs.txt. Es ist auch im linux-doc-Paket in verfügbar /usr/share/doc/linux-doc/filesystems/overlayfs.txt.gz.

Da es sich bei der eigentlichen Hilfedokumentation eher um eine "Funktionsweise" als um eine "Vorgehensweise zum Mounten" handelt, folgt eine kurze Zusammenfassung (in der Kerneldokumentation gibt es ein Beispiel):

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

Wo [Einhängeoptionen] sein können:

  • lowerdir = somedir: lowerdir ist das Verzeichnis, über das Sie Ihr neues Dateisystem legen. Wenn es Duplikate gibt, werden diese von der (tatsächlich zugunsten der) Version von upperdir ausgeblendeten Version überschrieben
  • upperdir = somedir: upperdir ist das Verzeichnis, mit dem lowerdir überlagert werden soll. Wenn in lowerdir und upperdir doppelte Dateinamen vorhanden sind, hat die Version von upperdir Vorrang.
  • Standardmontageoptionen. Der einzige Code, den ich gesehen habe, ist ro / rw, aber Sie können experimentieren.

Eine Sache, die mich anfangs verwirrt hat, daher sollte ich wahrscheinlich klarstellen, dass das Mounten eines Overlays kein Dateisystem mounten kann. Ich habe versucht, ein Squashfs-Dateisystem mit einem Overlayfs-Mount zu mounten, aber so funktioniert das nicht. Sie müssen zuerst das Dateisystem (in meinem Fall squashfs) in ein beliebiges Verzeichnis mounten und dann mit overlayfs den Mount-Punkt (ein Verzeichnis) und ein anderes Verzeichnis in ein tertiäres Verzeichnis (den overlayfs-Mount-Punkt) mischen (bearbeiten: dieses "tertiäre" Verzeichnis) kann eigentlich das Verzeichnis upperdir = sein). Im tertiären Verzeichnis sehen Sie die zusammengeführten Dateisysteme (oder Verzeichnisbäume - es ist flexibel).

Beispiel 1, das das Root-Dateisystem überlagert

Ich habe an einer Ubuntu-Hybrid-Bootdiskette gearbeitet, auf der das Ubuntu-Basissystem als filesystem.squashfs existiert, und ich habe Dateien mit den Namen ubuntu.overlay kubuntu.overlay xubuntu.overlay und lubuntu.overlay. Die Overlay-Dateien sind Basisinstallationen dieser Systeme, bei denen der Inhalt von filesystem.squashfs (aus Platzgründen) beschnitten ist. Dann habe ich die Init-Skripte modifiziert, um die Overlay-Datei der richtigen Distribution (von einem Boot-Parameter) mit Overlayfs und den obigen Optionen zu überlagern, und es funktioniert wie ein Zauber!

Dies sind die Zeilen, die ich in meinen Init-Skripten verwendet habe (sobald alle Variablen übersetzt wurden):

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

Bitte beachte , dass oberhalb filesystem.squashfs ist ein Verzeichnis von casper erstellt, keine Datei.

Diese drei Anweisungen erstellen ein /overlayVerzeichnis, /overlayhängen ein squashfs-Dateisystem in das Verzeichnis ein und verwenden dann OverlayFS, um den Inhalt von /overlayover im Wesentlichen zusammenzuführen /.

Beispiel 2, transparentes Zusammenführen zweier Verzeichnisse

Während ich mein Live-USB für jedes Release neu aufbaue, nutze ich OverlayFS, um eine Menge Zeit zu sparen. Ich beginne mit einem Verzeichnis namens ubuntu-base, das den Inhalt des Ubuntu-Core-Images enthält, das die einfachste Installation darstellt. Ich werde dann Verzeichnisse mit den Namen ubuntu, kubuntu, lubuntu und xubuntu erstellen.

Dann verwende ich OverlayFS, damit die Dateien aus der Ubuntu-Basis in den einzelnen Verzeichnissen angezeigt werden. Ich würde so etwas verwenden:

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

Dadurch werden die Dateien von Ubuntu-Base im Kubuntu-Ordner angezeigt. Dann kann ich chrootin den kubuntu ordner und sowas machen apt-get install kubuntu-desktop. Alle Änderungen, die in diesem OverlayFS-Mount vorgenommen werden, verbleiben im oberen Verzeichnis, in diesem Fall im Kubuntu-Ordner. Sobald ich die OverlayFS-Bereitstellung aufgehoben habe, werden die Dateien, die tatsächlich in Ubuntu-Base vorhanden sind, aber im Kubuntu-Ordner "gespiegelt" sind, ausgeblendet, sofern sie nicht geändert wurden. Dies verhindert, dass ich mehrere Kopien der Dateien in Ubuntu-Base haben muss, während ich sie weiterhin so verwenden kann, als ob sie physisch an jedem Ort existieren würden.


3
"aber aus irgendeinem Grund wird es nicht im Git-Baum auf kernel.org angezeigt" - Das liegt daran, dass Overlayfs nicht im Upstream-Kernel enthalten ist, so wie es nicht ist (und niemals sein wird). Solche Union-Dateisysteme werden vom Ubuntu Kernel Team integriert.
MestreLion

2
OverlayFS kommt offenbar in den Kernel 3.10.
David C. Bishop

8
Schließlich sollte in 3.18 lwn.net/Articles/617099
Rmano

4
@ Rmano: auf meiner Maschine funktioniert es nur mit overlaynicht mitoverlayfs
Janus Troelsen

1
Vielen Dank an @austinmarton, ich habe das auch schon vor einiger Zeit gefunden und totti hat es unten behandelt, bevor ich meine Antwort aktualisiert habe, also habe ich seine Antwort ganz oben in meiner Liste erwähnt.
Chuck R

20

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

Obere und untere

Ein Overlay-Dateisystem kombiniert zwei Dateisysteme - ein 'oberes' Dateisystem und ein 'unteres' Dateisystem. Wenn in beiden Dateisystemen ein Name vorhanden ist, ist das Objekt im 'oberen' Dateisystem sichtbar, während das Objekt im 'unteren' Dateisystem entweder ausgeblendet oder bei Verzeichnissen mit dem 'oberen' Objekt zusammengeführt ist.

Es wäre richtiger, auf einen oberen und unteren 'Verzeichnisbaum' als auf ein 'Dateisystem' zu verweisen, da sich beide Verzeichnisbäume durchaus im selben Dateisystem befinden können und es nicht erforderlich ist, das Stammverzeichnis eines Dateisystems anzugeben entweder oben oder unten.

Das untere Dateisystem kann jedes von Linux unterstützte Dateisystem sein und muss nicht beschreibbar sein. Das untere Dateisystem kann sogar ein anderes Overlay sein. Das obere Dateisystem ist normalerweise beschreibbar. Falls dies der Fall ist, muss es die Erstellung vertrauenswürdiger * erweiterter Attribute unterstützen und in readdir-Antworten einen gültigen d_type bereitstellen, sodass NFS nicht geeignet ist.

Eine schreibgeschützte Überlagerung von zwei schreibgeschützten Dateisystemen kann einen beliebigen Dateisystemtyp verwenden.

Verzeichnisse

Beim Überlagern handelt es sich hauptsächlich um Verzeichnisse. Wenn ein gegebener Name sowohl im oberen als auch im unteren Dateisystem vorkommt und auf ein Nicht-Verzeichnis verweist, wird das untere Objekt ausgeblendet - der Name bezieht sich nur auf das obere Objekt.

Wenn sowohl obere als auch untere Objekte Verzeichnisse sind, wird ein zusammengeführtes Verzeichnis gebildet.

Beim Einhängen werden die beiden als Einhängeoptionen angegebenen Verzeichnisse "lowerdir" und "upperdir" zu einem zusammengeführten Verzeichnis zusammengefasst:

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

Das "workdir" muss ein leeres Verzeichnis auf demselben Dateisystem sein wie upperdir.

Wann immer eine Suche in einem solchen zusammengeführten Verzeichnis angefordert wird, wird die Suche in jedem tatsächlichen Verzeichnis durchgeführt und das kombinierte Ergebnis wird in dem Eintrag zwischengespeichert, der zu dem Überlagerungsdateisystem gehört. Wenn beide tatsächlichen Suchvorgänge Verzeichnisse finden, werden beide gespeichert und ein zusammengeführtes Verzeichnis wird erstellt, andernfalls wird nur eines gespeichert: das obere, falls vorhanden, das untere.

Es werden nur die Namenslisten aus Verzeichnissen zusammengeführt. Andere Inhalte wie Metadaten und erweiterte Attribute werden nur für das übergeordnete Verzeichnis gemeldet. Diese Attribute des unteren Verzeichnisses sind ausgeblendet.


4
Danke für die Klarstellung auf workdir. Das war eine relativ neue Änderung und aus irgendeinem Grund konnte ich keine Dokumentation darüber finden, was 'workdir' tatsächlich getan hat. Es war auch nicht in der Kernel-Hilfe, als ich das letzte Mal nachgeschaut habe. Fügt IMO-Overlays eine Verwirrungsebene hinzu und wünscht sich, die neueren Versionen könnten ohne sie verwendet werden - das bringt meinen Workflow durcheinander.
Chuck R

7

Ich habe diese Artikel um ein Skript für Overlays erweitert, mit dem schreibgeschützte Root-Fs eingerichtet werden.

Ich hoffe es hilft.


1
Dank der Arbeit, die andere geleistet haben, haben Dustin und ich quantal ein Banary-Paket mit dem Namen 'overlayroot' hinzugefügt, das Teil des Cloud-initramfs-tools -Quellpakets ist . Informationen zur
smoser

2

Minimal lauffähiges Beispiel

# 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 Upstream .

Ausgabe des ersten lsmit dem mount:

lower:
lost+found  lower-file

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

upper/upper:
overlay-file  upper-file

upper/work:
work

Ausgabe der Sekunde lsohne Mount:

lower:
lost+found  lower-file

upper/upper:
overlay-file  upper-file

upper/work:
work

Interpretation:

  • niedriger: Wurde nach dem Schreiben zum Overlay unverändert
  • Oben: Modifikation zum Overlay erhalten
  • Overlay: Zeigt Dateien sowohl von oben als auch von unten an
  • work: enthält zufälligen Inhalt (ein work/Verzeichnis), den wir nicht interessieren sollten

Beispiel angepasst aus: Beispiel OverlayFS-Verwendung

Hier ist ein komplexeres Beispiel mit mehreren unteren Ebenen: Overlayfs werden mit mehreren Ebenen neu geladen (Migration weg von aufs)

Getestet unter Ubuntu 18.04, Linux-Kernel 4.15.0.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.