AuFS(另一个联合文件系统)允许我们将两棵树合并为一棵,即使这两棵树重叠。然后,我们可以将写入合并树的其中一个分支,并将读取指向另一个分支。
它的经典用法是使用闪存文件系统和 RAM 磁盘,例如这(参考 1)创建一个不会破坏 Linux 的只读根文件系统。所有文件写入都进入 RAM。重启后,系统将恢复到出厂时的配置。
/dir1
= 只读/dir2
= 读/写/aufs
= 合并/dir1
和/dir2
/aufs
然后重新安装,--move
使其成为/
(root)
简化一下,(参考文献 1)中的示例就是这样做的
mount -t aufs br=/dir2:/dir1 /aufs
mount --move /aufs /
但是,我希望这样使用它,使可写 ( /dir2
) 位于真实磁盘上,而不是 ramdisk 上。这样,在重新启动后它将保留其数据。
但我需要确保 dir2 中的某些文件不会被保留,并恢复为它们的 ( /dir1
) 默认值。这可确保将来的启动始终使用出厂时的文件。不会丢失用户和日志数据。
例如/etc
,,,中更改的文件在重启后不应保留。/bin
/boot
/usr
这AUFS 网页(参考文献 2) 的例子很少。
那么问题是:使用 AuFS 执行此操作的正确方法是什么?
我能想到以下几点:
- 以某种方式修改第一个挂载命令
- 在第二次挂载之前使用 aufs add/del 添加更多挂载命令
/dir2
只需删除启动时不应保留的树即可- 部分树 (
etc, bin, boot, lib, etc
) 在tmpfs
参考文献 1:https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
参考文献 2:http://aufs.sourceforge.net/aufs.html
答案1
选项1:auFS
本身不支持这样的挂载选项,因此选项 #1 无效。您必须解决这个问题。
选项 #3:当然,您可以在每次启动时删除这些目录。这可能是我在这里看到的最简单的方法。
选项 #2:您可以使用tmpfs
。因此,首先创建一个tmpfs
,假设大小为 500 MB:
mount -t tmpfs -o rw,size=500M tmpfs /tmpfs
我们现在有:
/dir1
: 只读/dir2
:读/写/tmpfs
:在 RAM 中读取/写入/aufs
/dir1
:和的叠加/dir2
在里面/tmpfs
,我们创建您想要保留的目录:
mkdir -p /tmpfs/{etc,usr,boot,bin}
注意,我们在已经合并两个目录时才这样做。也就是说,当目录树已经/aufs
存在时。但是,现在我们对每个应该保留的目录执行一次 aufs mount:
mount -t aufs -o dirs=/tmpfs/etc=rw:/dir2/etc=ro none /aufs/etc
mount -t aufs -o dirs=/tmpfs/usr=rw:/dir2/usr=ro none /aufs/usr
mount -t aufs -o dirs=/tmpfs/boot=rw:/dir2/boot=ro none /aufs/boot
mount -t aufs -o dirs=/tmpfs/bin=rw:/dir2/bin=ro none /aufs/bin
现在,您可以在 中创建一个目录树/aufs
,您可以在其中将文件写入任何地方,但是当您写入时/etc
,它将被写入/tmpfs/etc
RAM 中的 ,因此在重启后将无法继续。/home
例如, 中的其他文件将被写入/dir2/home
,这是一个可读写的文件系统,因此在重启后将无法继续。
另一种解决方案:我还使用客户端系统,该系统使用覆盖文件系统并保留用户数据。以下是我解决问题的方法:只需一个只读文件系统和一个挂载在其上的 tmpfs。稍后当用户登录时,我会从 samba 服务器以可读写方式挂载他的主目录。因此,他的所有用户数据都存储并保存在 中/home
,其余数据在重启后将不复存在。对于您来说,您可以将其放入/home
另一个可读写的物理分区,然后将其挂载到/aufs/home
。