Відповіді:
Можна використовувати рівень файлової системи об'єднання, як aufs .
Демонстрація:
# 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
Цей варіант монтування створити нову "гілку" ( br
), укладаючи /tmp/rammnt
(читати-записувати) зверху /tmp/imgmnt
(лише для читання). Ця "гілка" стає видимою як файлова система (читання-запис) /tmp/combined
.
(Дивіться сторінку чоловіка aufs (5) для всіх деталей.)
Тепер все, що зроблено, ось що у вас є:
# 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
Отже, записуючи "стоп" у tmpfs
файловій системі, вони не намагаються поширюватись назад до файлу зображення, встановленого в циклі.
Ви могли використовувати звичайний каталог (у файловій системі читання / записування) або, можливо, каталог під, /dev/shm
якщо це працює для вас, замість того, щоб створити певну tmpfs
для цього.
Цей прийом (або його варіації) використовується деяким дистрибутивом LiveCD. Вікіпедія Aufs елемент містить кілька.
/
, я вважаю, що вам краще з initrd (саме так я вважаю, що це зроблено для livecds). Ви можете зробити це за допомогою сценарію init, хоча це звучить складно.
Здається, є два інші простіші способи зробити це на Ubuntu (принаймні, більш пізні версії):
Етапи для створення завантажувальної системи прості. Я використовував цей посібник у поєднанні з цим посібником та низкою веб-пошуків, щоб з’ясувати, як змусити його працювати належним чином, без помилок.
Підсумок:
Виконати:
sudo apt-get install fsprotect apparmor-utils
Збережіть це в /etc/initramfs-tools/scripts/init-bottom/__rootaufs
. Я не думаю, що ім'я насправді має значення, але початок __
може використовуватися для замовлення, тому якщо ви зміните ім’я, можливо, захочете зберегти підкреслення. (Це копія цього файлу .)
#!/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
В /etc/default/grub
, знайдіть рядок , яка починається з GRUB_CMDLINE_LINUX_DEFAULT
, і всередині лапок , які слідують, додати параметр aufs=tmpfs
.
Бонус: Якщо вам потрібно періодично вимикати переадресацію, просто видаліть цей аргумент зі списку параметрів ядра. Можливо, ви можете це зробити, утримуючи клавішу Shift під час завантаження системи, щоб відобразити меню GRUB; потім натисніть e, щоб відредагувати параметри та просто стерти aufs=...
параметр зі списку.
Додайте ці рядки до /etc/sysctl.conf
. ( Попередження : Потенційний ризик для безпеки.)
kernel.yama.protected_nonaccess_hardlinks = 0
kernel.yama.protected_sticky_symlinks = 0
Запустіть ці рядки:
sudo aa-complain dhclient3
sudo chmod 0755 /etc/initramfs-tools/scripts/init-bottom/__rootaufs
sudo update-initramfs -k all -u
sudo update-grub
Якщо все пішло добре, при перезавантаженні ви будете робити це у тимчасовій файловій системі. Частина оперативної пам’яті буде в /rw
, а зображення диска - у /ro
, але, звичайно, це буде лише для читання.
Тим не менш, якщо ви завантажилися у тимчасову систему, але вам потрібно внести постійні зміни, ви можете знову встановити /ro
файлову систему, сказавши
sudo mount -o remount,rw /ro
щоб зробити його доступним для запису, а потім ви можете вносити будь-які зміни, потрібні для цього каталогу.
Так, по Unionfs див. Unionfs.filesystems.org . Ви маєте змонтувати першу файлову систему лише для читання, а також другу файлову систему RAM для читання та запису через unionfs.
В Ubuntu ви можете знайти пакунок unionfs-fuse, який є іншою реалізацією тих же речей, але в просторі користувача, а не як модуль ядра.
Ви також можете зробити це на рівні пристрою, без unionfs, як aufs. Див. Пристрій-картограф snapshot-origin
.
fstab
такої точки монтажу/
? (тобто так система завантажується з знімного зображення, дуже багато.)