Es ist möglich, eine Union-Dateisystemschicht wie aufs zu verwenden.
Demo:
Erstellen Sie ein Dateisystem-Image
# dd if=/dev/zero of=/tmp/image bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.0028428 s, 369 MB/s
# mke2fs /tmp/image
...
Mounten, füllen
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
Nur lesen aktivieren
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
Ein kleines RAM-Dateisystem
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
Kombiniere beides
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Diese Einhängeoption zum Erstellen eines neuen "Zweigs" (br
) durch Stapeln von /tmp/rammnt
(Lesen-Schreiben) auf /tmp/imgmnt
(schreibgeschützt). Dieser "Zweig" wird als (schreib-)Dateisystem auf /tmp/combined
sichtbar gemacht .
(Alle Details finden Sie auf der Manpage zu aufs(5).)
Jetzt ist alles fertig, hier ist, was Sie haben:
# ls /tmp/combined
hello.txt lost+found
# cat /tmp/combined/hello.txt
hello
# echo bye > /tmp/combined/hello.txt
# cat /tmp/combined/hello.txt
bye
# cat imgmnt/hello.txt
hello
# cat rammnt/hello.txt
bye
Also schreibt er "stop" in die tmpfs
Dateisystem, versuchen sie nicht, sich zurück zu der in der Schleife gemounteten Image-Datei auszubreiten.
Sie hätten ein einfaches Verzeichnis (auf einem Dateisystem mit Lese-/Schreibzugriff) oder möglicherweise ein Verzeichnis unter /dev/shm
verwenden können wenn das für Sie funktioniert, anstatt einen bestimmten tmpfs
zu erstellen dafür.
Diese Technik (oder Variationen davon) wird von einigen LiveCD-Distributionen verwendet. Der Wikipedia-Eintrag aufs listet einige auf.
Aktualisierung:
Es scheint, dass es zwei andere einfachere Möglichkeiten gibt, dies unter Ubuntu zu tun (zumindest in den späteren Versionen):
-
sudo apt-get install overlayroot
gefolgt von der Einstellungoverlayroot="tmpfs:swap=1,recurse=0"
in/etc/overlayroot.local.conf
. -
sudo apt-get install fsprotect
gefolgt von der Übergabe vonfsprotect
als Kernelparameter
Endlich habe ich herausgefunden, wie man das mit dem Root-Dateisystem macht (in Ubuntu 11.04)!
Die Schritte, um ein System bootfähig zu machen, sind einfach. Ich habe diese Anleitung in Kombination mit dieser Anleitung und einer Reihe von Websuchen verwendet, um herauszufinden, wie man es richtig und ohne Fehler zum Laufen bringt.
Zusammenfassung:
-
Ausführen:
sudo apt-get install fsprotect apparmor-utils
-
Speichern Sie dies unter
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Ich glaube nicht, dass der Name wirklich wichtig ist, aber der Anfang__
könnte für Bestellzwecke verwendet werden, wenn Sie also den Namen ändern, möchten Sie vielleicht die Unterstriche beibehalten. (Dies ist eine Kopie dieser Datei.)#!/bin/sh -e case $1 in prereqs) exit 0 ;; esac for x in $(cat /proc/cmdline); do case $x in root=*) ROOTNAME=${x#root=} ;; aufs=*) UNION=${x#aufs=} case $UNION in LABEL=*) UNION="/dev/disk/by-label/${UNION#LABEL=}" ;; UUID=*) UNION="/dev/disk/by-uuid/${UNION#UUID=}" ;; esac ;; esac done if [ -z "$UNION" ]; then exit 0 fi # make the mount points on the init root file system mkdir /aufs /ro /rw # mount read-write file system if [ "$UNION" = "tmpfs" ]; then mount -t tmpfs rw /rw -o noatime,mode=0755 else mount $UNION /rw -o noatime fi # move real root out of the way mount --move ${rootmnt} /ro mount -t aufs aufs /aufs -o noatime,dirs=/rw:/ro=ro # test for mount points on union file system [ -d /aufs/ro ] || mkdir /aufs/ro [ -d /aufs/rw ] || mkdir /aufs/rw mount --move /ro /aufs/ro mount --move /rw /aufs/rw # strip fstab off of root partition grep -v $ROOTNAME /aufs/ro/etc/fstab > /aufs/etc/fstab mount --move /aufs /root exit 0
-
In
/etc/default/grub
, suchen Sie die Zeile, die mitGRUB_CMDLINE_LINUX_DEFAULT
beginnt , und fügen Sie innerhalb der folgenden Anführungszeichen den Parameteraufs=tmpfs
hinzu .Bonus: Wenn Sie gelegentlich ausschalten müssen Um die Umleitung vorübergehend zu deaktivieren, entfernen Sie dieses Argument einfach aus der Kernel-Parameterliste. Sie können dies wahrscheinlich tun, indem Sie beim Booten des Systems die Umschalttaste gedrückt halten, um das GRUB-Menü anzuzeigen. drücken Sie dann e um die Parameter zu bearbeiten, und löschen Sie einfach den
aufs=...
Parameter aus der Liste. -
Hängen Sie diese Zeilen an
/etc/sysctl.conf
an . (Warnung :Potentielles Sicherheitsrisiko.)kernel.yama.protected_nonaccess_hardlinks = 0 kernel.yama.protected_sticky_symlinks = 0
-
Führen Sie diese Zeilen aus:
sudo aa-complain dhclient3 sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs sudo update-initramfs -k all -u sudo update-grub
Wenn alles gut gelaufen ist, werden Sie dies beim Neustart in ein temporäres Dateisystem tun. Der RAM-Teil befindet sich bei /rw
, und das Disk-Image befindet sich unter /ro
, aber natürlich ist es schreibgeschützt.
Wenn Sie jedoch in ein temporäres System gebootet haben, aber eine dauerhafte Änderung vornehmen müssen, können Sie /ro
erneut einhängen Dateisystem, indem Sie sagen
sudo mount -o remount,rw /ro
um es beschreibbar zu machen, und dann können Sie alle erforderlichen Änderungen an diesem Verzeichnis vornehmen.
Ja, von unionfs, siehe unionfs.filesystems.org. Sie müssen das erste schreibgeschützte Dateisystem und das zweite schreibgeschützte RAM-Dateisystem über unionfs einhängen.
In Ubuntu finden Sie das Paket unionfs-fuse, das eine weitere Implementierung derselben Dinge ist, aber im Benutzerbereich, nicht als Kernelmodul.