Answers:
可以使用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会更好(我相信这就是对livecd的处理方式)。尽管听起来很棘手,但您也许可以从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
,并在其后的引号内添加parameter 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
如果一切顺利,那么当您重新启动时,您将这样做到一个临时文件系统中。RAM部分将位于/rw
,磁盘映像将位于/ro
,但是当然它将是只读的。
不过,如果您已启动到临时系统但需要进行永久更改,则可以通过以下方式重新挂载/ro
文件系统:
sudo mount -o remount,rw /ro
使其可写,然后您可以对该目录进行所需的任何修改。
是的,通过unionfs,请参阅unionfs.filesystems.org。您已经通过unionfs挂载了第一个只读文件系统,并作为第二个读写RAM文件系统。
在Ubuntu中,您可以找到unionfs-fuse软件包,这是相同内容的另一种实现,但是在用户空间中而不是内核模块。
您也可以在设备级别执行此操作,而无需像aufs这样的unionfs。请参阅device-mapper snapshot-origin
。
fstab
使安装点为/
?(即,系统几乎是从可丢弃的映像引导的。)