Mit Hilfe von Aufs2 auf Read-Only-Geräte schreiben

Unsichtbare Tinte

Overlay-Filesysteme lassen den Anwender auch auf Read-Only-Medien schreiben. Der Knoppix-Schöpfer verrät, wie er Aufs2 bei seiner Live-Distribution einsetzt.

Für Overlay-Filesysteme wie Union-FS [1] und Aufs2 [2] gibt es eine Reihe von praktischen Anwendungsfällen. Häufig werden sie verwendet, um temporär auf ein Dateisystem zu schreiben, das sich auf einem Read-Only-Medium befindet wie beispielsweise einer CD. Ich selbst verwende es in Knoppix, um die nur lesbaren Daten vom Knoppx-Dateisystem (üblicherweise auf einer CD oder DVD) mit einem beschreibbaren Filesystem in einer RAM-Disk oder auf einem USB-Stick zu vereinen.

Ein Overlay-Filesystem erzeugt einen Stack existierenden Verzeichnisse, die für den Benutzer transparent sind: Das System geht für jeden Zugriff auf eine Datei jedes Verzeichnis des Stacks durch, bis es erfolgreich ist oder der Ende des Stapels erericht ist.

Implementierungshürden

Die an sich ziemlich einfache Idee, ein beschreibbares Dateisystem über ein Nur-Lese-Dateisystem zu legen, wird schnell kompliziert, wenn man sich überlegt, wie man die in der Praxis auftretenden Änderungen an Dateien implementieren soll. Wenn zum Beispiel eine Datei auf dem Read-Only-FS "gelöscht" werden soll, wie kriegt man es hin, dass es tatsächlich verschwindet? Aufs erzeugt in diesem Fall im beschreibbaren Zweig ein Hidden-File (so genanntes "without") anlegt. Stößt es beim weiteren Dateizugriff darauf, zeigt es die Originaldatei einfach nicht an. Beim Schreiben eines nur lesbaren Files, legt Aufs eine veränderbare Kopie an.

Noch komplizierter wird es, wenn man gleichzeitigen Zugriff auf Dateien, unterschiedliche Rechte für die Zweige berücksichtigt. Weil es also nicht so einfach ist, wie es auf den ersten Blick scheinen mag, ist der Aufs-Quellcode auch in etwa so groß wie der eines normalen Linux-Dateisystems.

Das neue Aufs

Vor kurzem wurde die Entwicklung von Aufs1 zugunsten des Nachfolgers Aufs2 eingestellt, einer Kernel-Erweiterung, die Overlay-Fähigkeiten direkt im Kernel implementiert. Gleichzeitig wechselte der Entwickler Junjiro Okajima das Versionskontrollsystem von CVS zu Git, das auch der Rest der Kernel-Gemeinde verwendet. Okajima versprach sich von der Kernel-Integration eine bessere Code-Review durch andere Entwickler sowie weniger und einfacheren Code. Aufs1 bestand aus mehreren Patches, die stark von anderen Kernel-Optionen abhingen. Aufs2 dagegen bemnutzt das Kernel-eigene Konfigurationssystem und lässt sich viel leichter kompilieren.

Auch wer kein eigenes Live-System zusammenstellt, wird Anwendungsfälle finden, um virtuellen Schreibzugriff auf nur lesbare Dateisysteme zu ermöglichen. Dieser Artikel beschreibt, wie das mit Aufs2 geht.

Neuer Kernel

Aufs2 gibt es in zwei Varianten: als eigenständigen git-basierten Kernel mit eingebautem Aufs2 oder eigenes Patchset, das man auf die Kernelquellen anwenden muss.

Weil den kompletten Kernel auszuchecken vermutlich nicht gerade der am häufigsten begangene Weg darstellt und sich diese Variante ohnehin ohne weiteres kompilieren lässt, beschreibe ich, wie man Aufs2 in den Standard-Kernel integriert, den Sie in den Linux-Kernel-Archiven finden [3]. Das folgende Beispiel basiert auf Kernel 2.6.29, dessen Quellcode in einem Unterverzeichnis namens »linux-2.6.29« auf der lokalen Platte liegt.

Wenn Sie noch nie Git benutzt haben, fehlt es vielleicht auf Ihrem Linux-System. Auf Debian-basierten Systemen installieren Sie es mit dem folgenden Befehl:

aptitude install git-core

Dieser Git-Aufruf kopiert dann den Aufs2-Patch auf den eigenen Computer:

git clone http://git.c3sl.ufpr.br/pub/scm/↩
aufs/aufs2-standalone.git aufs2-standalone.git

Damit ist »aufs2-standalone.git« eine lokale Kopie des Standalone-Aufs2-Repository. Der Befehl

The following command:

git checkout origin/aufs2-29

checkt schließlich die Aufs2-Version für Kernel 2.6.29 aus und legt sie als aktuelle Arbeitsversion fest. Möglicherweise meldet Git, dass »origin/aufs2-29« kein lokaler Zweig ist, das können Sie aber getrost ignorieren.

Listing 1 zeigt den Inhalt des von »aufs2-standalone.git« . Das Verzeichnis »fs« enthält den Quellcode von Aufs2, das Verzeichnis »include« die nötigen Kernel-Header-Dateien. beide müssen in das Kernel-Source-Verzeichnis kopiert werden.

Listing 1

<C>ls -l aufs2-standalone.git<C>

-rw-r--r-- 1 knopper users  9222 15. Apr 00:51 aufs2-standalone.patch
-rw-r--r-- 1 knopper users 40296 15. Apr 00:51 ChangeLog
-rw-r--r-- 1 knopper users   661 15. Apr 00:47 config.mk
-rw-r--r-- 1 knopper users 17990 15. Apr 00:47 COPYING
drwxr-xr-x 4 knopper users   104 15. Apr 00:51 Documentation
-rw-r--r-- 1 knopper users  1481 15. Apr 00:51 ecryptfs.patch
drwxr-xr-x 3 knopper users    72 15. Apr 00:51 fs
drwxr-xr-x 3 knopper users    72 15. Apr 00:51 include
-rw-r--r-- 1 knopper users   617 15. Apr 00:47 Makefile

Wenn der Kernel sich eine Verzeichnisebene über dem Aufs2-Tree in »linux-2.6.29« befindet, sehen die Kopierbefehle so aus:

cd ../linux-2.6.29
cp -a ../aufs2-standalone.git/{fs,include,↩
Documentation} .
cp ../aufs2-standalone.git/config.mk fs/aufs/

Das Aufs2-Readme beschreibt die Installation etwas anders, aber ich finde die Methode, alle nötigen Dateien in den Kernel-Tree zu kopieren, bequemer, um bei Debian fertigen Kernel-Pakete zu bauen, ohne die übliche Modul-Infrastruktur mit Verzeichnissen wie »modules/aufs« anzulegen.

Patchen

Vielleicht haben sie im Aufs2-Verzeichnis schon die Datei »aufs2-standalone.patch« bemerkt. Sie enthält die Änderungen, die an verschiedenen Stellen im Kernel, an denen es um das Dateisystem geht, vorgenommen werden müssen. Andere beziehen sich auf das Kernel-Makefile und die Konfiguration, sodass Aufs2 schließlich auch im Konfigurationsmenü des Kernels auftaucht. Sie wenden den Patch an, indem Sie im Verzeichnis »linux-2.6.29« den folgenden Befehl eingeben:

patch -p1 < ../aufs2-standalone.git/↩
aufs2-standalone.patch

Läuft alles nach Plan, gibt das Tool die Meldungen aus Listing 2 aus. Treten keine Fehler auf, können Sie gleich den Kernel kompilieren.

Listing 2

Kernel patchen

patching file fs/Kconfig
patching file fs/Makefile
patching file fs/namei.c
patching file fs/namespace.c
patching file fs/open.c
patching file fs/splice.c
patching file fs/super.c
patching file include/linux/Kbuild
patching file include/linux/lockdep.h
patching file include/linux/namei.h
patching file include/linux/splice.h
patching file security/device_cgroup.c
patching file security/security.c

Sie müssen nur noch vorher die Aufs2-Funktion im Kernel einschalten. Rufen Sie dazu »make menuconfig« auf. Die entsprechenden Einstellungen finden Sie unter »File System« und dann »Miscellaneous filesystems« (Abbildung 1). Fehlt die Aufs2-Option, überprüfen Sie, ob auch die nötigen »Experimental« Features des Kernel eingeschaltet sind.

Abbildung 1: Nach dem Kernel-patch: die Aufs-Option und ihre Einstellmöglichkeiten.

Die Zeile »Maximum number of branches« in Abbildung 1 legt fest, wieviele Schichten von Verzeichnissen der Anwender zu einem virtuellen Verzeichnis übereinander legen kann. Die Option Use inotify to detect actions on a branch erlaubt es, einen Zweig direkt zu verändern und die Änderungen sofort wirksam werden zu lassen (sonst würde das zu unerwarteten Ergebnissen führen, weil Aufs2 nicht jede Datei auf Änderungen hin überwacht, bis sie direkt am Mountpoint geändert werden). Wer Aufs2 zusammen mit NFS verwenden will, sollte die Option »NFS-exportable« aktivieren. Die Zeile »Ramfs as an aufs branch« wird nur benötigt, wenn die initiale RAM-Disk auch nach dem Booten das Root-Filesystem bleibt und als schreibbarer Zweig für Aufs zum Einsatz kommt. Mehr Informationen zu jeder Option liefert die Aufs2-Datei im Verzeichnis »Documentation« .

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Rechneranalyse mit Microsoft-Sysinternals-Tools

Der Rechner verhält sich eigenartig oder Sie haben eine unbekannte Applikation im Task Manager entdeckt und möchten erfahren, worum es sich dabei genau handelt und ob sie möglicherweise gefährlich ist? In so einem Fall helfen die Sysinternals-Tools von Microsoft. Dieser Beitrag stellt die drei Werkzeuge Autoruns, Process Explorer und TCPView vor. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Google+

Ausgabe /2018