Linux:卸载时哪个进程导致“设备忙”?
12 回答
查看lsof命令(列出打开的文件)——它可以告诉您哪些进程正在打开哪些文件。有时这很棘手,但通常sudo lsof | grep (your device name here)
可以为您做一些简单的事情。
以防万一...有时您正在从终端调用 umount ,并且您的当前目录属于已安装的文件系统。
您应该使用fuser命令。
例如。fuser /dev/cdrom
将使用 . 返回进程的 pid(s) /dev/cdrom
。
如果您尝试卸载,您可以使用-k
开关终止这些进程(请参阅参考资料man fuser
)。
使用“losetup -a”检查映射到文件系统上文件的开环设备。它们不会与 lsof 或 fuser 一起出现。
还要检查/etc/exports
。如果您通过 NFS 导出挂载点内的路径,则在尝试卸载时会出现此错误,并且不会在fuser
or中显示任何内容lsof
。
lsof +f -- /mountpoint
(列出了使用挂载在 /mountpoint 上的文件的进程。对于查找哪些进程正在使用挂载的 USB 记忆棒或 CD/DVD 非常有用。
lsof 和 fuser 确实是找到保持某个文件打开的进程的两种方法。如果您只想 umount 成功,您应该调查它的 -f 和 -l 选项。
这正是“fuser -m /mount/point”存在的原因。
顺便说一句,我不认为“fuser”或“lsof”会指示内核模块何时持有资源,尽管我通常没有这个问题..
打开文件
带有打开文件的进程通常是罪魁祸首。显示它们:
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>
)后,杀死所有剩余进程是安全的(r):
fuser -vmMk <mountpoint>
挂载点
罪魁祸首可能是内核本身。另一个文件系统安装在您尝试的文件系统上umount
会导致悲伤。检查:
mount | grep <mountpoint>/
对于环回挂载,还要检查以下输出:
losetup -la
匿名 inode (Linux)
可以通过以下方式创建匿名 inode :
- 临时文件(
open
带O_TMPFILE
) - 通知手表
- [eventfd]
- [事件投票]
- [定时器]
这些是最难以捉摸的口袋妖怪类型,并在lsof
'sTYPE
列中显示为a_inode
(在 lsof
手册页中未记录)。
它们不会出现在 中lsof +f -- /dev/<device>
,因此您需要:
lsof | grep a_inode
有关杀死持有匿名 inode 的进程,请参阅:列出当前 inotify 监视(路径名,PID)。
lsof 和 fuser 也没有给我任何东西。
在将所有可能的目录重命名为 .old 并在每次进行更改后重新启动系统之后,我发现了一个负责的特定目录(与 postfix 相关)。
事实证明,我曾经建立了一个从 /var/spool/postfix 到 /disk2/pers/mail/postfix/varspool 的符号链接,以最大限度地减少对基于 SDCARD 的根文件系统(Sheeva Plug)的磁盘写入。
有了这个符号链接,即使停止了 postfix 和 dovecot 服务(ps aux 和 netstat -tuanp 都没有显示任何相关内容),我也无法卸载 /disk2/pers。
当我删除符号链接并更新后缀和 dovecot 配置文件以直接指向 /disk2/pers/ 上的新目录时,我能够成功停止服务并卸载目录。
下次我将更仔细地查看以下输出:
ls -lR /var | grep ^l | grep disk2
上面的命令将递归地列出目录树中的所有符号链接(这里从 /var 开始)并过滤掉那些指向特定目标挂载点(这里是 disk2)的名称。
如果您在停止所有打开文件的服务和进程后仍然无法卸载或重新安装您的设备,则可能是交换文件或交换分区使您的设备忙。这不会显示为fuser
or lsof
。关闭交换:
sudo swapoff -a
您可以事先检查并显示任何交换分区或交换文件的摘要:
swapon -s
或者:
cat /proc/swaps
作为使用命令的替代方法sudo swapoff -a
,您还可以通过停止服务或systemd单元来禁用交换。例如:
sudo systemctl stop dphys-swapfile
或者:
sudo systemctl stop var-swap.swap
在我的情况下,关闭交换是必要的,除了停止任何打开文件进行写入的服务和进程,这样我就可以将我的根分区重新挂载为只读,以便fsck
在我的根分区上运行而无需重新启动。这在运行 Raspbian Jessie 的 Raspberry Pi 上是必需的。
target is busy
除了正在使用的任何文件之外,安装在您尝试卸载的文件系统上的文件系统可能会导致错误。(例如当你mount -o bind /dev /mnt/yourmount/dev
为了使用chroot
那里。)
要查找文件系统上挂载了哪些文件系统,请运行以下命令:
mount | grep '/mnt/yourmount'
要查找正在使用的文件,请参阅此处其他人已经建议的建议:
lsof | grep '/mnt/yourmount'