Antworten:
Es ist möglich, eine Union-Dateisystemebene wie aufs zu verwenden .
Demo:
# 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
...
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Diese Mount-Option zum Erstellen einer neuen "Verzweigung" ( br
) durch Stapeln/tmp/rammnt
(Lesen / Schreiben) über /tmp/imgmnt
(Nur Lesen). Diese "Verzweigung" wird als (Lese- / Schreib-) Dateisystem weiter sichtbar gemacht /tmp/combined
.
(Siehe die Informationen finden Manpage zu aufs (5) .)
Jetzt ist alles erledigt, 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 die schreibt "halt" in die tmpfs
Dateisystem angehalten" werden, wird nicht versucht, sie in die Image-Datei mit eingebundener Schleife zu übertragen.
Sie hätten ein einfaches Verzeichnis (in einem Lese- / Schreib-Dateisystem) oder möglicherweise ein Verzeichnis unter verwenden können, /dev/shm
wenn dies für Sie funktioniert, anstatt ein bestimmtes Verzeichnis zu erstellentmpfs
dafür zu .
Diese Technik (oder Variationen davon) wird von einigen LiveCD-Distributionen verwendet. Die Wikipedia auf Eintrag listet einige auf.
/
ich, dass du mit einer initrd besser dran bist (so geht das für Live-CDs, von denen ich glaube). Möglicherweise können Sie dies von einem Init-Skript aus tun, obwohl dies schwierig klingt.
Es scheint, dass es zwei weitere einfachere Möglichkeiten gibt, dies unter Ubuntu zu tun (zumindest die späteren Versionen):
Die Schritte zum Booten eines Systems sind einfach. Ich habe diesen Leitfaden in Kombination mit verwendet diesem Leitfaden und einer Reihe von Websuchen verwendet, um herauszufinden, wie ich ihn fehlerfrei zum Laufen bringen kann.
Zusammenfassung:
Lauf:
sudo apt-get install fsprotect apparmor-utils
Speichern Sie dies in /etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Ich glaube nicht, dass der Name wirklich wichtig ist, aber der Anfang __
kann für Bestellzwecke verwendet werden. Wenn Sie den Namen ändern, möchten Sie möglicherweise 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
finden Sie die Zeile, beginnt mit GRUB_CMDLINE_LINUX_DEFAULT
und innerhalb der Anführungszeichen , die folgen, fügen Sie den Parameteraufs=tmpfs
.
Bonus: Wenn Sie gelegentlich deaktivieren die Umleitung vorübergehend, entfernen Sie einfach dieses Argument 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 den aufs=...
Parameter einfach aus der Liste.
Fügen Sie diese Zeilen an /etc/sysctl.conf
. ( Warnung : Mögliches 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 beim Neustart alles geklappt hat, werden Sie dies in einem temporären Dateisystem tun. Der RAM-Teil ist auf /rw
und das Disk-Image auf/ro
, aber es ist natürlich schreibgeschützt.
Wenn Sie jedoch ein temporäres System gebootet haben und eine permanente Änderung vornehmen müssen, können Sie das /ro
Dateisystem mit den folgenden Anweisungen erneut einbinden
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 haben das erste Nur-Lese-Dateisystem und als zweites Lese-Schreib-RAM-Dateisystem über unionfs bereitgestellt.
In Ubuntu finden Sie das unionfs-fuse-Paket, eine weitere Implementierung derselben Dinge, jedoch im Benutzerbereich, nicht als Kernelmodul.
Sie können dies auch auf der Geräteebene tun, ohne eine Unionfs wie aufs. Siehe Geräte-Mapper snapshot-origin
.
fstab
, so dass der Einhängepunkt ist/
? (Das heißt, das System startet so ziemlich von einem verwerfbaren Image.)