Linux:这一过程造成的"设备的忙"这样做时卸下?

有帮助吗?

解决方案

查看 lsof 命令(列出打开的文件) - 它可以告诉你哪些流程持有什么开放。有时它很棘手,但通常像 sudo lsof |那样简单grep(你的设备名称)可以为你做。

其他提示

以防万一...有时你会从终端调用umount,而你当前的目录属于挂载的文件系统。

您应该使用 fuser 命令。

EG。 fuser / dev / cdrom 将使用 / dev / cdrom 返回进程的pid。

如果您要卸载,可以使用 -k 开关终止该过程(参见 man fuser )。

使用“losetup -a”检查映射到文件系统上文件的开环设备。他们不会出现lsof或fuser。

同时检查 / etc / exports 。如果要通过NFS在mountpoint中导出路径,则在尝试卸载时会出现此错误,并且 fuser lsof 中不会显示任何内容。

lsof +f -- /mountpoint

(列出使用挂载在/ mountpoint上的文件的进程。特别适用于查找使用已安装的USB记忆棒或CD / DVD的进程。

lsof和fuser确实是找到保持某个文件打开的进程的两种方法。 如果你只是想让umount成功,你应该研究它的-f和-l选项。

这正是为什么“fuser -m / mount / point”的原因。存在。

顺便说一句,我不认为“fuser”或“lsof”或“lsof”将指示内核模块何时持有资源,尽管我通常没有这个问题..

lsof和fuser也没有给我任何东西。

在将所有可能的目录重命名为.old并在每次更改后重新启动系统之后,我找到了一个负责的特定目录(与postfix相关)。

原来我曾经从/ var / spool / postfix创建了一个符号链接到/ disk2 / pers / mail / postfix / varspool,以便最小化基于SDCARD的根文件系统(Sheeva Plug)上的磁盘写入。 / p>

使用这个符号链接,即使停止后缀和dovecot服务(ps aux以及netstat -tuanp都没有显示任何相关内容),我无法卸载/ disk2 / pers。

当我删除符号链接并更新postfix和dovecot配置文件以直接指向/ disk2 / pers /上的新dirs时,我能够成功停止服务并卸载目录。

下次我会更仔细地看看输出:

ls -lR /var | grep ^l | grep disk2

上面的命令将以递归方式列出目录树中的所有符号链接(此处从/ var开始),并过滤掉那些指向特定目标安装点(此处为disk2)的名称。

打开文件

进程打开文件通常的罪魁祸首。显示他们:

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 可创建通过:

  • 临时文件(openO_TMPFILE)
  • 手表
  • [eventfd]
  • [eventpoll]
  • [timerfd]

这些是最难以捉摸的种类型的小精灵,现在 lsof's TYPE 列作为 a_inode (这是无证件的 lsof 人页).

他们不会出现在 lsof +f -- /dev/<device>, 所以你会需要:

lsof | grep a_inode

对于杀人的程序保持匿名的节点,参见: 清单目前,钟表(路径,PID).

如果在使用打开的文件停止所有服务和进程后仍无法卸载或重新安装设备,则可能存在交换文件或交换分区,导致设备忙碌。这不会显示 fuser 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'

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top