无法在绑定挂载的文件系统中删除要回收的文件

dbz*_*zix 10 mount trash bind-mount

我正在尝试为两个 Linux 安装设置共享主目录,因此我正在使用绑定安装。我的用户被命名dbz,他的主目录是/home/dbz. 我还有共享目录/home/shared,用于存储我的共享文件(该文件夹也归用户所有dbz)。

我使用绑定将此共享目录中的另一个目录挂载到我的主目录中:

mount -B /home/shared/work /home/dbz/work
Run Code Online (Sandbox Code Playgroud)

此解决方案解决了我的需求,我遇到但不知道如何解决的唯一问题是 - 当我尝试从挂载目录中删除文件或目录时,我无法将其删除到垃圾箱,只能永久删除。例如:

  • 删除文件/home/shared/work/test.txt:好的,因为从文件test.txt所在的目录中删除;
  • 删除文件/home/dbz/work/test.txt:不能,因为...顺便说一下,因为什么?绑定挂载对文件删除有一些限制吗?

最后一个问题提交到 bugzilla.kernel.org

Ric*_*cky 9

这是一个linux内核问题。它不是在查看源文件系统和目标文件系统的真正超级块:

17926 rename("d1/foo", "d2/foo")        = -1 EXDEV (Invalid cross-device link)
Run Code Online (Sandbox Code Playgroud)

看起来问题出在do_rename()( fs/namei.c) 中:

    error = -EXDEV;
    if (oldnd.mnt != newnd.mnt)
            goto exit2;
Run Code Online (Sandbox Code Playgroud)

*叹*


Ant*_*hon 8

为了创建垃圾目录,您需要能够.Trash_<uid>在挂载点创建(至少在 Ubuntu 上从 nautilus 删除时,您的发行版可能会使用另一个目录)。如果由于父目录不可写而无法创建该目录dbz,则您将无法备份。

不必让父目录可写,只需以.Trash_<uid>root身份创建,然后将chown其创建为dbz.

我发现使用该gvfs-trash实用程序测试有关垃圾文件创建的内容更容易一些,如果文件不能被删除,它实际上会给出一个错误。使用类似的东西:

touch /home/dbz/work/test.txt
strace gvfs-trash /home/dbz/work/test.txt  2>&1 | grep .Trash | grep mkdir
Run Code Online (Sandbox Code Playgroud)

查看它实际尝试创建的目录。