有时,我想卸载一个USB设备与umount /run/media/theDrive
,但我收到drive is busy
错误。
如何找出哪些进程或程序正在访问设备?
答案1
用于lsof | grep /media/whatever
找出正在使用安装座的对象。
另外,请考虑umount -l
(延迟卸载)以防止在清理时新进程使用该驱动器。
答案2
大多数时候,最好使用的命令是拉索夫(“我我st哦笔F艾尔斯”)。
lsof +f -- /media/usb0
其中/media/usb0
是要卸载的 USB 驱动器或其他文件系统的挂载点。+f --
告诉 lsof 将后续参数视为挂载点;它通常(但并非总是)自行管理,因此这lsof /media/usb0
也是有效的。这会找到打开的文件(甚至是未链接的文件)、内存映射文件、当前目录和一些更模糊的用途。您需要以 root 身份运行该命令来获取有关其他用户进程的信息(我认为有些 unicelsof
必须以 root 身份运行)。
有些用途 lsof 找不到;这些在可移动媒体上并不常见。他们包括:
/foo
挂载点:如果/foo/bar
是挂载点,则无法卸载。/foo
挂载设备:如果/foo/bar
是已挂载的块设备或循环挂载的常规文件,或者是 Linux 绑定挂载的源,则无法卸载。- NFS 导出:lsof 不会检测到内核 NFS 服务器导出树。
另一个可以在紧急情况下使用的命令是 fusionr,它只列出设备上打开文件的进程的 PID:
fuser -m /media/usb0
答案3
打开文件
打开文件的进程是常见的罪魁祸首。显示它们:
lsof +f -- <mountpoint or device>
/dev/<device>
使用而不是使用有一个优点 /mountpoint
:挂载点将在 后消失umount -l
,或者它可能被覆盖的挂载隐藏。
fuser
也可以使用,但我认为lsof
有一个更有用的输出。然而,fuser
当涉及到杀死导致你的戏剧性的进程时,它很有用,这样你就可以继续你的生活。
列出文件<mountpoint>
(请参阅上面的警告):
fuser -vmM <mountpoint>
仅以交互方式终止打开文件以供写入的进程:
fuser -vmMkiw <mountpoint>
以只读方式重新挂载 ( mount -o remount,ro <mountpoint>
) 后,可以安全地终止所有剩余进程:
fuser -vmMk <mountpoint>
挂载点
罪魁祸首可能是内核本身。在您尝试安装的文件系统上安装另一个文件系统umount
会造成麻烦。检查:
mount | grep <mountpoint>/
对于环回安装(谢谢斯蒂芬·基特),还检查以下输出:
losetup -la
匿名索引节点 (Linux)
匿名索引节点可以通过以下方式创建:
- 临时文件(
open
带O_TMPFILE
) - inotify手表
- [事件fd]
- [事件调查]
- [计时器]
这些是最难以捉摸的口袋妖怪类型,并在lsof
的TYPE
专栏中显示为a_inode
(在 lsof
手册页)。
它们不会出现在 中lsof +f -- /dev/<device>
,因此您需要:
lsof | grep a_inode
要终止持有匿名 inode 的进程,请参阅:列出当前 inotify 监视(路径名,PID)。
inotify
手表(Linux)
这条评论解释原因inotify
不应该防止卸载,但是这张纸条描述了它所处的情况将要:
卸载可能会挂起在
vx_softcnt_flush()
调用中。发生挂起是因为 inotify 监视程序增加i_count
变量并导致v_os_hold value
保持高位,直到 inotify 监视程序释放保持。
答案4
如果您使用 GNOME,通过 Nautilus 卸载将显示一条消息,说明哪个进程仍在使用该驱动器以及它正在使用的文件。