AUFS:如何创建仅目录树的一部分的读/写分支?

AUFS:如何创建仅目录树的一部分的读/写分支?

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 执行此操作的正确方法是什么?

我能想到以下几点:

  1. 以某种方式修改第一个挂载命令
  2. 在第二次挂载之前使用 aufs add/del 添加更多挂载命令
  3. /dir2只需删除启动时不应保留的树即可
  4. 部分树 ( 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/etcRAM 中的 ,因此在重启后将无法继续。/home例如, 中的其他文件将被写入/dir2/home,这是一个可读写的文件系统,因此在重启后将无法继续。

另一种解决方案:我还使用客户端系统,该系统使用覆盖文件系统并保留用户数据。以下是我解决问题的方法:只需一个只读文件系统和一个挂载在其上的 tmpfs。稍后当用户登录时,我会从 samba 服务器以可读写方式挂载他的主目录。因此,他的所有用户数据都存储并保存在 中/home,其余数据在重启后将不复存在。对于您来说,您可以将其放入/home另一个可读写的物理分区,然后将其挂载到/aufs/home

相关内容