Je to možné pomocí sjednocující vrstvy souborového systému jako aufs.
Demo:
Vytvořte obraz systému souborů
# 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
...
Připojit, naplnit
# mkdir /tmp/imgmnt
# mount -o loop /tmp/image /tmp/imgmnt
# echo hello > /tmp/imgmnt/hello.txt
# umount /tmp/imgmnt
Připojit pouze pro čtení
# mount -o loop,ro /tmp/image /tmp/imgmnt
# echo blah > /tmp/imgmnt/hello.txt
-su: /tmp/imgmnt/hello.txt: Read-only file system
Malý souborový systém RAM
# mkdir /tmp/rammnt
# mount -t tmpfs -o size=1M none /tmp/rammnt
Zkombinujte obě
# mkdir /tmp/combined
# mount -t aufs -o br:/tmp/rammnt:/tmp/imgmnt=ro none /tmp/combined
Tato možnost připojení k vytvoření nové "větve" (br
) skládáním /tmp/rammnt
(čtení i zápis) nad /tmp/imgmnt
(pouze ke čtení). Tato "větev" je viditelná jako souborový systém (čtení-zápis) na /tmp/combined
.
(Všechny podrobnosti najdete na manuálové stránce aufs(5).)
Nyní je vše hotovo, zde je to, co máte:
# 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
Takže do tmpfs
zapíše "stop". souborový systém, nepokoušejí se šířit zpět do souboru obrazu připojeného smyčkou.
Mohli jste použít prostý adresář (na souborovém systému pro čtení/zápis) nebo možná adresář pod /dev/shm
pokud vám to vyhovuje, místo vytvoření konkrétního tmpfs
za to.
Tuto techniku (nebo její varianty) používají některé distribuce LiveCD. Záznam Wikipedia aufs jich několik uvádí.
Aktualizace:
Zdá se, že existují 2 další jednodušší způsoby, jak to udělat na Ubuntu (alespoň novější verze):
-
sudo apt-get install overlayroot
následuje nastaveníoverlayroot="tmpfs:swap=1,recurse=0"
v/etc/overlayroot.local.conf
. -
sudo apt-get install fsprotect
následuje předánífsprotect
jako parametr jádra
Konečně jsem přišel na to, jak to udělat s kořenovým souborovým systémem (v Ubuntu 11.04)!
Kroky pro vytvoření bootovatelného systému jsou jednoduché. Použil jsem tuto příručku v kombinaci s touto příručkou a spoustou vyhledávání na webu, abych zjistil, jak správně fungovat bez chyb.
Shrnutí:
-
Spustit:
sudo apt-get install fsprotect apparmor-utils
-
Uložte to do
/etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Nemyslím si, že ve skutečnosti záleží na názvu, ale na začátku__
může být použit pro účely objednávání, takže pokud změníte název, možná budete chtít ponechat podtržítka. (Toto je kopie tohoto souboru.)#!/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
-
V
/etc/default/grub
, najděte řádek, který začínáGRUB_CMDLINE_LINUX_DEFAULT
a do uvozovek, které následují, přidejte parametraufs=tmpfs
.Bonus: Pokud potřebujete občas vypnout přesměrování dočasně, jednoduše odstraňte tento argument ze seznamu parametrů jádra. Pravděpodobně to můžete udělat tak, že při spouštění systému podržíte klávesu Shift, aby se zobrazila nabídka GRUB; poté stiskněte e upravte parametry a smažte
aufs=...
parametr ze seznamu. -
Připojte tyto řádky k
/etc/sysctl.conf
. (Upozornění :Potenciální bezpečnostní riziko.)kernel.yama.protected_nonaccess_hardlinks = 0 kernel.yama.protected_sticky_symlinks = 0
-
Spusťte tyto řádky:
sudo aa-complain dhclient3 sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs sudo update-initramfs -k all -u sudo update-grub
Pokud vše proběhlo v pořádku, po restartu tak učiníte do dočasného souborového systému. Část RAM bude mít hodnotu /rw
a obraz disku bude mít hodnotu /ro
, ale bude samozřejmě pouze pro čtení.
Pokud jste však zavedli dočasný systém, ale potřebujete provést trvalou změnu, můžete znovu připojit /ro
souborový systém vyslovením
sudo mount -o remount,rw /ro
aby bylo možné do něj zapisovat, a pak můžete v tomto adresáři provést jakékoli potřebné úpravy.
Ano, od unionfs, viz unionfs.filesystems.org. Nejprve jste připojili souborový systém pouze pro čtení a jako druhý souborový systém RAM pro čtení a zápis prostřednictvím unionfs.
V Ubuntu můžete najít balíček unionfs-fuse, což je další implementace stejných věcí, ale v uživatelském prostoru, ne jako modul jádra.