Linux:在执行umount时哪个进程导致“设备忙”?

时间:2009-03-08 19:39:38

标签: linux shell device mount umount

Linux:在执行umount时哪个进程导致“设备忙”?

12 个答案:

答案 0 :(得分:96)

查看lsof命令(列出打开文件) - 它可以告诉您哪些进程正在保持打开状态。有时它很棘手,但通常像sudo lsof | grep (your device name here)那样简单的事情可以帮到你。

答案 1 :(得分:41)

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

答案 2 :(得分:22)

您应该使用fuser命令。

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

如果您要尝试卸载,可以使用-k开关删除这些过程(请参阅man fuser)。

答案 3 :(得分:18)

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

答案 4 :(得分:15)

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

答案 5 :(得分:9)

lsof +f -- /mountpoint

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

答案 6 :(得分:7)

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

答案 7 :(得分:5)

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

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

答案 8 :(得分:2)

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)的名称。

答案 9 :(得分:1)

打开文件

打开文件的进程是常见的罪魁祸首。显示它们:

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)

Anonymous inodes可以通过以下方式创建:

  • 临时文件(openO_TMPFILE
  • inotify观看
  • [eventfd]
  • [eventpoll]
  • [timerfd]

这是最难以捉摸的口袋妖怪类型,并在lsof的{​​{1}}列中显示为TYPE(在lsof man page中未记录)。

它们不会出现在a_inode中,因此您需要:

lsof +f -- /dev/<device>

要杀死持有匿名inode的进程,请参阅:List current inotify watches (pathname, PID)

答案 10 :(得分:1)

如果在使用打开的文件停止所有服务和进程后仍无法卸载或重新安装设备,则可能存在交换文件或交换分区,导致设备忙碌。这不会显示fuserlsof。关闭交换:

sudo swapoff -a

您可以事先检查并显示任何交换分区或交换文件的摘要:

swapon -s

或:

cat /proc/swaps

作为使用命令sudo swapoff -a的替代方法,您也可以通过停止服务或 systemd 单元来禁用交换。例如:

sudo systemctl stop dphys-swapfile

或:

sudo systemctl stop var-swap.swap

在我的情况下,关闭交换是必要的,除了停止打开文件写入的任何服务和进程,以便我可以将我的根分区重新安装为只读,以便在我的root上运行fsck分区无需重启。这对于运行Raspbian Jessie的Raspberry Pi来说是必要的。

答案 11 :(得分:0)

安装在您尝试卸载的文件系统上的文件系统除了正在使用的任何文件外,还会导致target is busy错误。 (例如,当您mount -o bind /dev /mnt/yourmount/dev在那里使用chroot时。)

要查找文件系统上挂载的文件系统,请运行以下命令:

mount | grep '/mnt/yourmount'

要查找其他人正在使用的建议:

lsof | grep '/mnt/yourmount'