![创建两个目录的并集,同时仅写入其自己的原始目录](https://linux22.com/image/1556778/%E5%88%9B%E5%BB%BA%E4%B8%A4%E4%B8%AA%E7%9B%AE%E5%BD%95%E7%9A%84%E5%B9%B6%E9%9B%86%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BB%85%E5%86%99%E5%85%A5%E5%85%B6%E8%87%AA%E5%B7%B1%E7%9A%84%E5%8E%9F%E5%A7%8B%E7%9B%AE%E5%BD%95.png)
我想创建两个目录的联合,并且当我在联合文件夹内移动文件时,我希望它保留在它原来的文件夹中(见下文)。
我该如何实现这个目标?我尝试过 unionfs,但它总是遵循文件夹顺序,例如,如果我在第一个位置挂载一个 RW 文件夹,所有写入都将转到该文件夹,我想要以下行为,如下所述:
我想要 2 个 RW 文件夹和一个联合文件夹
RW - driveA
RW - driveB
Unioned - mergeDrive
基本上,当我移动文件时(我只能通过触摸文件mergeDrive
,我希望每个文件都在自己的文件夹内移动。
例如,
mv /mnt/mergeDrive/subFolderA/fileA.csv /mnt/mergeDrive/subFolderB/fileA.csv
FileA的原始路径:
/mnt/driveA/subFolderA/fileA.csv
移动后的预期路径:
/mnt/driveA/subFolderB/fileA.csv
然后我希望能够做到:
mv /mnt/mergeDrive/subFolderA/fileB.csv /mnt/mergeDrive/subFolderB/fileB.csv
FileB的原始路径:
/mnt/driveB/subFolderA/fileB.csv
移动后的预期路径:
/mnt/driveB/subFolderB/fileB.csv
因此,无论文件的根文件夹来自何处,它在移动时都会保留在该根文件夹中,即使它是通过移动的/mergeDrive/
。您可以设置 unionfs(或类似的东西)来执行此操作吗?
答案1
你的怀疑是有道理的。我已经测试过了unionfs-fuse
。它在某种程度上尝试不在分支之间移动文件。
例如,如果目标目录仅存在于下部分支中,并且我移动位于下部分支中的文件,那么它们将留在该分支中。
另一方面,如果我故意在两个都分支,则较低分支的文件将在合并挂载点内移动时移动到较高分支。我明白这正是你想要的避免。
aufs
我还没有测试过overlayfs
。
但是我已经测试过了mhddfs
。 它是用户空间中的文件系统(FUSE)(看有关 FUSE 的安全问题)。mhddfs
似乎按照您希望的方式工作。请注意,我的测试有限,我还没有阅读代码来了解其算法,因此无法完全确定。我认为你应该自己测试一下。基本语法:
mhddfs /mnt/driveA/ /mnt/driveB/ /mnt/mergeDrive/
在本文有一句评论:
如果某个驱动器在写入过程中用完了可用空间(假设您尝试在其上创建一个非常大的文件),则写入过程不会失败;
mhddfs
只会将已写入的数据传输到另一个驱动器(具有更多可用空间)并在那里继续写入。
起初我以为“已写入的数据”可能指的是另一个文件,该文件将被转移以给正在写入的文件腾出空间。我想这对你来说会很糟糕。我试图触发这种行为,但失败了。现在我认为“已写入的数据”仅指正在写入的确切文件。
事实上,在我的测试中,我从未观察到mhddfs
在两个分支之间传输文件的情况。即使目标目录仅存在于其他分支中,该工具也会将目录树的必要部分复制到文件所在的分支,因此它们可以更改路径而无需传输到另一个分支。
要清楚:我说的是涉及普通的测试mv
。很明显,如果你cp
在合并的挂载点中的另一个目录中,那么生成的副本可能最终进入另一个分支,而不是原来的分支。请记住有些程序会就地修改文件,有些则会创建副本。
另请注意有一个错误在版本中0.1.39
。用户报告降级到0.1.38
帮助。或者你可以尝试这个分支:mhddfs-nosegfault。