卸载:目标正忙

rob*_*ert 10 linux mount

我已经安装/dev并立即尝试卸载:

$ sudo mount -o rbind /dev m
$ sudo umount m
umount: /tmp/m: target is busy.
$ sudo lsof m
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
kdevtmpfs  55 root  cwd    DIR    0,6     4420    2 m
kdevtmpfs  55 root  rtd    DIR    0,6     4420    2 m
Run Code Online (Sandbox Code Playgroud)

我读过fuser可以杀死访问挂载点的进程,但我想了解在这个简单的情况下发生了什么。根据lsof输出,是否使用挂载点作为当前工作目录(cwd)?

我不想使用懒惰卸载。

sou*_*edi 11

您曾经rbind挂载文件系统和子挂载。为了卸载一个文件系统,你必须首先卸载它的子挂载(对于它们的子挂载也是如此,递归地)。但要小心!

mount --make-rslave m
umount -R m
Run Code Online (Sandbox Code Playgroud)

如果没有第一个命令,由于挂载传播,您可能会卸载上的所有子挂载。在这种情况下,这意味着 的所有子挂载/dev,这将对您正在运行的系统产生不良影响;-)。

基本上,安装传播是一个巨大的陷阱,等待您陷入其中:-)。如果默认情况下绑定安装禁用它似乎会更好。


kdevtmpfs是维护 devtmpfs 的内核线程。它不会阻止卸载 devtmpfs。这是因为内核线程在单独的挂载(如绑定挂载)上运行。你看不到那个原始的坐骑;它位于单独的挂载命名空间中。如果您想尝试弄清楚为什么会kdevtmpfs出现在 中lsof,我不知道,也许可以将其视为一个单独的问题。