从man mount_unionfs
:
If a file exists in the upper layer then there is no way to access a file
with the same name in the lower layer. If necessary, a combination of
loopback and union mounts can be made which will still allow the lower
files to be accessed by a different pathname.
我该怎么做呢?除了安装 .ISO 和其他块映像之外,我找不到文件系统环回的参考,这显然不是正确的含义,而 nullfs 只是顺便提到了该术语(但没有具体信息)。
我对所涉及内容的猜测:
我认为它可能涉及首先安装“较低”层(可能两次,到两个不同的安装点?),然后在该安装点(或两个安装点之一)上安装一个 unionfs 到第二个安装点。这个想法是,相同的文件系统通过第一个安装点未经修改地公开,并且还通过第二个安装点作为联合的较低层公开。这是基于一个提示这个网页。
更新,澄清回应@arrowd的目标:
手册页说可以通过环回访问较低层文件(隐含:整个较低层文件集),并且这可以使较低层可以并行访问(A)作为 unionfs 的较低层,以及(B)通过不同的“环回”安装点/路径名作为文件系统本身。我理解环回层的概念,所以这是有道理的,并且页面man
说它是可行的,但我找不到可以让我做到这一点的命令。
更具体地说,我想以通常的方式覆盖文件系统作为 unionfs,但我也想要一个单独的挂载点来单独暴露较低层,以允许某些任务读取/写入/搜索整个“较低”文件系统直接地还有,没有被联合“overlay fs”遮盖/遮蔽/覆盖。所以它不仅仅是一个文件 - 我需要整个“较低”层也可以通过环回和单独的安装点访问,而不仅仅是通过 unionfs 层或逐个文件访问。这可能意味着我需要以某种方式安装它两次,首先通过环回,然后通过 unionfs,在我最初设置/安装 unionfs 层的地方,但我不知道该怎么做。
目的是一些 cron 任务(有时我也)需要更新下层内的文件(无需卸载/干扰 unionfs 覆盖层),并且不是不仅仅是像简单使用 unionfs 那样在“上”层复制和更新它们。所以我需要使用两个挂载点 - 一个暴露覆盖有 unionfs 的下层,另一个仅暴露下层没有unionfs 覆盖,并且能够在不同的任务中并行使用两者。
另请参阅我在上面添加的评论 - 我思考它可能涉及安装较低的文件系统两次(一次直接安装,一次作为联合),或者安装一次并从该安装点重新安装第二次(作为联合)。但我不确定也不清楚它有多安全。
希望这对于问题的目的更加明确。
答案1
我终于找到了解决方案!我尝试了很多技巧,mdconfig -f 在不同名称的块设备上,但没有一个起作用。但后来我发现了!
您需要做的是创建目录的 nullfs 挂载,该目录将成为您的联合挂载点前你加入联盟。事实上,这与工会问题完全无关。
例子:
# echo "Hello World!" >/mnt/hello.txt
# ls /mnt/hello.txt
hello.txt
# cat /mnt/hello.txt
Hello World!
# mount -t nullfs /mnt /mnt2
# ls /mnt2/hello.txt
hello.txt
# cat /mnt/hello.txt
Hello World!
# mount /dev/ad0s1a /mnt
# ls /mnt/hello.txt
ls: hell: No such file or directory
# ls /mnt2/hello.txt
hello.txt
# cat /mnt2/hello.txt
Hello World!
# echo "Hello Universe!" >/mnt2/hello.txt
# umount /mnt
# ls /mnt/hello.txt
hello.txt
# cat /mnt/hello.txt
Hello Universe!
了解如何仍然可以访问被挂载遮蔽的所有内容。现在,如果您将其与联合结合起来,您可以做各种各样的事情,例如 3 层联合,您将 /mnt2 的 nullfs 安装在 /mnt 上作为第三层,现在这意味着您可以编写原始/mnt。但是,这也意味着您写入目录的任何新文件现在都将放在具有 /mnt 挂载点的原始文件系统上,而不是放在您挂载在其上的设备上。
问题解决了!我太高兴了!
答案2
我觉得这一段讲的是nullfs
。
如果您有一个文件(让它成为foo
)被挂载覆盖unionfs
,您可以mount_nullfs
先将其覆盖到其他文件(例如bar
),然后执行mount_unionfs
。然后您将能够foo
通过文件名访问文件bar
。