是否可以将环回文件挂载为只读,并将所有写入重定向到 RAM?
答案1
可以使用联合文件系统层,例如奥夫斯。
演示:
创建文件系统映像
# 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
小型 RAM 文件系统
# 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
(参见奥夫斯(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 使用此技术(或其变体)。维基百科奥夫斯条目列出了一些。
答案2
更新:
似乎还有另外两种更简单的方法可以在 Ubuntu 上执行此操作(至少是更高版本):
sudo apt-get install overlayroot
然后overlayroot="tmpfs:swap=1,recurse=0"
设置/etc/overlayroot.local.conf
。
我终于弄清楚如何使用根文件系统(在 Ubuntu 11.04 中)来做到这一点!
使系统可启动的步骤很简单。我用了本指南结合本指南以及大量的网络搜索,以找出如何让它正常工作,没有错误。
概括:
跑步:
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
如果一切顺利,当您重新启动时,您将进入临时文件系统。 RAM 部分将位于/rw
,磁盘映像将位于/ro
,但当然它将是只读的。
/ro
不过,如果您已启动到临时系统但需要进行永久更改,则可以通过以下命令重新挂载文件系统
sudo mount -o remount,rw /ro
使其可写,然后您可以对该目录进行所需的任何修改。
答案3
是的,由 unionfs 提供,请参阅unionfs.filesystems.org。您已挂载第一个只读文件系统,并通过 unionfs 挂载第二个读写 RAM 文件系统。
在 Ubuntu 中,您可以找到 unionfs-fuse 包,它是相同功能的另一个实现,但在用户空间中,而不是作为内核模块。
答案4
您也可以在设备级别执行此操作,无需像 aufs 这样的 unionfs。请参阅设备映射器snapshot-origin
。