AUFS:如何创build只有一部分目录树的读/写分支?

AuFS(另一个联合文件系统)允许我们将两棵树合并成一棵,即使那些树重叠。 然后,我们可以直接写入合并树中的一个分支并读取到另一个分支。

这样做的经典用法是使用闪存文件系统和内存盘(ram disk),像这样 (参考文献1)创build一个不会中断Linux的只读根文件系统。 所有的文件写入内存。 系统重新启动后,系统会自行恢复到出厂configuration。

  • /dir1 =只读
  • /dir2 =读/写
  • /aufs = /dir1/dir2合并

/aufs然后重新安装与 – --move使/ (根)

简单来说,(参考文献1)中的例子就是这样做的

 mount -t aufs br=/dir2:/dir1 /aufs mount --move /aufs / 

不过,我想用它来使可写( /dir2 )在真实磁盘上,而不是虚拟磁盘。 这样重新启动后,它将保留它的数据。

但是我需要确保dir2中的某些文件不被保留,并且被恢复到( /dir1 )的默认值。 这确保将来的引导程序始终使用发货文件。 没有丢失用户和日志数据。

例如/etc/bin/boot/usr更改的文件不应该在重新启动后存活。

AUFS网页 (参考文献2)有很less的例子。

所以对于这个问题:使用AuFS做到这一点的正确方法是什么?

我可以想到以下几点:

  1. 以某种方式修改第一个mount命令
  2. 在第二次安装之前使用aufs add / del添加更多的安装命令
  3. 只需在启动时删除不应从/dir2保存的树
  4. tmpfs部分树( etc, bin, boot, lib, etc

参考1: https : //help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
参考2: http : //aufs.sourceforge.net/aufs.html

选项#1auFS自己不支持这样的挂载选项,所以选项#1已经死了。 你必须解决这个问题。

选项3 :当然,你可以在每次启动时简单地删除这些目录。 这可能是我在这里看到的最简单的方法。

选项2 :你可以使用tmpfs 。 所以首先创build一个tmpfs ,比方说大小为500 MB:

 mount -t tmpfs -o rw,size=500M tmpfs /tmpfs 

我们现在有:

  • /dir1 :只读
  • /dir2 :读/写
  • /tmpfs :在RAM中读/写
  • /aufs/dir1/dir2的叠加

/tmpfs里面,我们创build你想要保留的dirs:

 mkdir -p /tmpfs/{etc,usr,boot,bin} 

注意,当我们已经合并了两个dir时,我们就这么做了。 所以当/aufs的目录树已经存在时。 但是,现在我们为每个应该保留的目录安装一个aufs挂载:

 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 ,这是一个可读写的文件系统,因此在重新启动后仍然存在。

另一个解决scheme :我也使用客户端系统,使用覆盖文件系统和保存的用户数据。 下面是我如何解决它:简单地只读文件系统和安装在它上面的tmpfs。 后来当用户login时,我从一个可读写的samba服务器挂载他的主目录。 因此,他所有的用户数据都被存储并保存在/home ,其余的不会在重新启动后存活。 在你的情况下,你可以把/home放入另一个可读写的物理分区,然后挂载到/aufs/home