Odpowiedzi:
Jest to możliwe przy użyciu unijnej warstwy systemu plików, takiej jak aufs .
Próbny:
# 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
Ta opcja montowania pozwala utworzyć nową „gałąź” ( br
) przez umieszczenie na stosie /tmp/rammnt
(tylko do odczytu i zapisu) na górze /tmp/imgmnt
(tylko do odczytu). Ta „gałąź” jest widoczna jako system plików (do odczytu i zapisu) /tmp/combined
.
(Zobacz wszystkie strony man aufs (5) ).
Teraz wszystko, co zostało zrobione, oto co masz:
# 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 więc zapisuje „stop” w tmpfs
systemie plików, nie próbują propagować z powrotem do pliku obrazu zamontowanego w pętli.
Mógłbyś użyć zwykłego katalogu (w systemie plików do odczytu / zapisu) lub ewentualnie katalogu poniżej, /dev/shm
jeśli to działa dla ciebie, zamiast tworzenia specyficznego tmpfs
dla tego.
Ta technika (lub jej odmiany) jest stosowana w niektórych dystrybucjach LiveCD. Wpis w Wikipedii aufs wymienia kilka.
/
, uważam, że lepiej jest zacząć od initrd (tak sądzę w przypadku filmów na żywo). Być może możesz to zrobić ze skryptu inicjującego, choć brzmi to skomplikowanie.
Wygląda na to, że istnieją 2 inne prostsze sposoby, aby to zrobić na Ubuntu (przynajmniej w późniejszych wersjach):
Kroki umożliwiające uruchomienie systemu są proste. Użyłem tego przewodnika w połączeniu z tym przewodnikiem i kilkoma wyszukiwaniami w sieci, aby dowiedzieć się, jak zapewnić jego prawidłowe działanie, bez błędów.
Podsumowanie:
Biegać:
sudo apt-get install fsprotect apparmor-utils
Zapisz to do /etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Nie sądzę, że nazwa ma znaczenie, ale początek __
można wykorzystać do celów zamawiania, więc jeśli zmienisz nazwę, możesz zachować podkreślenia. (To jest kopia tego pliku .)
#!/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
W /etc/default/grub
znajdź wiersz, który zaczyna się od GRUB_CMDLINE_LINUX_DEFAULT
, a następnie w cudzysłowach dodaj parametr aufs=tmpfs
.
Premia: Jeśli chcesz tymczasowo wyłączyć przekierowanie, po prostu usuń ten argument z listy parametrów jądra. Prawdopodobnie możesz to zrobić, przytrzymując klawisz Shift podczas uruchamiania systemu, aby wyświetlić menu GRUB; następnie naciśnij e, aby edytować parametry i po prostu usuń aufs=...
parametr z listy.
Dołącz te linie do /etc/sysctl.conf
. ( Ostrzeżenie : potencjalne zagrożenie bezpieczeństwa.)
kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
Uruchom następujące linie:
sudo aa-complain dhclient3
sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
sudo update-initramfs -k all -u
sudo update-grub
Jeśli wszystko poszło dobrze, po ponownym uruchomieniu uruchomisz to w tymczasowym systemie plików. Część RAM będzie w /rw
, a obraz dysku będzie w /ro
, ale oczywiście będzie tylko do odczytu.
Niemniej jednak, jeśli uruchomiłeś system tymczasowy, ale chcesz wprowadzić trwałą zmianę, możesz ponownie zainstalować /ro
system plików, mówiąc:
sudo mount -o remount,rw /ro
aby był zapisywalny, a następnie możesz wprowadzić wszelkie modyfikacje potrzebne w tym katalogu.
Tak, przez unionfs , patrz unionfs.filesystems.org . Zamontowałeś pierwszy system plików tylko do odczytu, a jako drugi system plików RAM do odczytu i zapisu przez unionfs.
W Ubuntu możesz znaleźć pakiet unionfs-fuse, który jest kolejną implementacją tych samych rzeczy, ale w przestrzeni użytkownika, a nie jako moduł jądra.
Możesz to również zrobić na poziomie urządzenia, bez unii takich jak aufs. Zobacz mapowanie urządzeń snapshot-origin
.
fstab
, że punktem montowania jest/
? (tzn. system uruchamia się po odrzuceniu obrazu).