Umount 上的繁忙设备

51 linux unmounting

我经常遇到卸载目录的问题:

卸载/mnt/目录
umount: /mnt/dir: 设备正忙

设备繁忙的原因有很多。有时运行的进程上有打开的锁,有时还有其他目录安装在/mnt/dir.

我的问题:

检查为什么无法卸载目录的步骤是什么。

我知道有很多原因,但如果你解释一个具体的解决方案就可以了。

[编辑]

[X] 在安装的卷上运行进程。
[X] 另一个卷安装在我们要卸载的卷的顶部
[_] NFS 锁定我们要卸载的卷

der*_*ert 87

检查的方法是fuser -vm /mnt/dir,必须以root身份运行。它会告诉您哪些进程正在访问挂载点。

另一种方法是lsof /mnt/dir,它将显示挂载上的每个打开的文件。再次最好以 root 身份运行。

您可以以非 root 用户身份运行其中任何一个,但是输出将仅限于您的进程——来自其他用户的进程将不会被静默显示,即使它们会阻止卸载文件系统。

例子:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim
Run Code Online (Sandbox Code Playgroud)

“访问”字段告诉您它是如何被访问的。在这种情况下,内核将其用作挂载(废话,但仅使用此卸载就可以了)。bash将它作为当前工作目录(cd在卸载之前必须到不同的目录)并且 gvim 都有当前目录并打开了一个文件(需要关闭那个 gvim)。

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)
Run Code Online (Sandbox Code Playgroud)

在此输出中,您可以看到 bash 和 gvim(如 type DIR)的当前目录。您还可以查看 gvim 已打开哪个文件进行写入。

如何强制问题:

fuser有一个-k选项,它将向SIGKILL使用挂载的每个进程发送信号(默认:)。这是阻止挂载繁忙的一种相当有力的方法。(当然,要小心你的东西SIGKILL!)

umount可以-l选择执行延迟卸载。挂载将从文件系统命名空间中删除(因此/mnt/Zia/src在示例中您将不会再看到它)但它保持挂载状态,因此访问它的程序可以继续这样做。当最后一个访问它的程序退出时,卸载实际上会发生。

卸载失败还有一个最终可修复的原因,那就是 NFS 服务器出现故障。您可以在此处使用umount -f,但这样做可能会导致数据丢失。(客户端可能已经缓存了尚未被服务器确认的写入,这些写入将被丢弃。但是,应用程序已经被告知写入成功。)

  • 请注意,`fuser -k` ** 非常** 风险,因为您将以 root 身份执行此操作,如果您不是 ** 非常** 确定哪些进程将被杀死,您可以使用一个粗心的命令…… (4认同)
  • `fuser -vm` 显示“内核安装”。必须执行“systemctl stop opt.mount”而不是手动“umount”。 (3认同)
  • 出于某种原因 umount -f 对我不起作用,但运行 umount -l 效果很好。 (2认同)

Fel*_*ipe 29

你应该使用:

sudo umount -l <path>
Run Code Online (Sandbox Code Playgroud)

手册页

-l, --lazy

    懒惰卸载。?现在从文件层次结构中分离文件系统,并在它不再忙时清除对该文件系统的所有引用。

    如果您打算将此选项用于网络文件系统或带有子挂载的本地文件系统,则预计在不久的将来会重新启动系统。推荐的用例umount -l是防止由于无法访问的网络共享而在关机时挂起,在这种情况下,正常的卸载将由于服务器关闭或网络分区而挂起。无法重新安装共享。

  • ⁺¹,我不知道哪个愚蠢的人会反对它。`-l` 正是在 `-f` 不起作用时使用的选项。 (8认同)

mve*_*one 8

另一个卷安装在我们要卸载的卷的顶部:

mount如果在不带参数或选项的情况下调用该命令,您将知道所有已安装的卷(除了-v)。您可以通过添加一些 perl 来获得活动挂载点列表:

mount | perl -pe 's/.*on (\S+) type.*/\1/'
Run Code Online (Sandbox Code Playgroud)

然后,只需在您希望卸载的点上 grep,您就会知道是否在该点上安装了文件系统。

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'
Run Code Online (Sandbox Code Playgroud)

那么你有两个解决方案。卸载文件系统,或使用mount --move olddir newdir(kernel >2.5.1)移动它们

  • 我在笔记本电脑的某个目录上“永久”安装了一个外部 USB 存储设备,有时电缆会被错误地断开连接。在我阅读这个答案之前,在目录上重新安装设备(因为“设备繁忙”)是一件非常痛苦的事情。现在我知道使用 mount --move olddir newdir。谢谢。 (2认同)