Linux:进行卸载时,哪个进程导致“设备繁忙”?[关闭]


78

Linux:执行卸载时,哪个进程导致“设备繁忙”?


您将需要提供更多信息。可能有许多不同的答案....
AAA

您需要什么信息?可能的答案是什么?
flybywire

还原最近的编辑。首先,shell脚本与.net,SQL查询或iphone开发一样多。其次,删除linux名称会使这个问题变得雄心勃勃。BSD,OSX等的语义稍有不同,而Solaris等的语义甚至更多。
MarkusQ,2009年

不要忘记NFS!您需要停止所有NFS导出或要安装的驱动器上的安装点umount。NFS不会出现在lsoffuser...上,因此非常棘手!
Trevor Boyd Smith,

Answers:


106

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


14
就我而言,对设备名称进行grep操作没有显示任何结果。但是,删除实际安装设备的路径确实可以做到;所以最后,通过终止该过程,我能够成功卸载设备。
brAzzi64

在我的情况下,该命令未显示任何内容。退出SSH客户端并再次登录即可。
machineaddict 2014年

4
尝试卸下它时,您可能在该方向之内。
Bosiwow 2014年

4
lsof /mountpoint而不是lsof /mountpoint/
songhir

使用lsof +f /dev/device而不是mountpoint有一个优势。对于带有匿名inode的内核进程,也可以看到相同的结果,即使在该列表中也可能不显示。
汤姆·黑尔

43

以防万一...有时会发生从终端调用umount的情况,并且当前目录属于已挂载的文件系统。


4
也有我 如果lsof列出了“ bash”进程(debian),您可以识别出来
Matthias Bayer

fuser我相信这样可以捕获当前的工作目录。
Trevor Boyd Smith,

26

您应该使用fuser命令。

例如。fuser /dev/cdrom将使用返回过程的pid /dev/cdrom

如果您要卸载,则可以使用-k开关取消这些过程(请参阅参考资料man fuser)。


2
仅供参考,fuser有时会显示lsof不符合要求的事物,反之亦然。所以你不能只做一个!
Trevor Boyd Smith,

没用,但是您给了我一个杀死我的媒体播放器的主意,那很有用,所以谢谢您的主意;-)
PJ Brunet

18

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


1
究竟!我将循环设备安装到有问题的分区上的.iso文件中。在umount -l /data实际工作-在FS消失了-但后来卸载/dev/loop0/dev/loop1挂了一段时间。但是现在看来还好。这个答案非常重要,因为它可以帮助已经知道lsoffuser有多年历史的人们……
Tomasz Gandor 2012年

这对我来说很关键。在我的情况下,docker devicemapper存储驱动器创建了/dev/loop0 /dev/loop1循环设备。我可以摆脱它们的唯一方法是使用列出设备,dmsetup ls 然后找到可疑的docker devicemapper设备docker-253:0-4291588-pool。 dmsetup remove docker-253:0-4291588-pool干净地摆脱了它
robododge '18

16

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


就我们而言,这是我们的问题。
raulsaeztapia 2014年

1
为什么不显示?(这是因为nfs部分在内核中吗?(相比之下,它完全是用户空间))
hbogert

9
lsof +f -- /mountpoint

(如下所示,该过程使用/ mountpoint上安装的文件上的文件进行处理。对于查找使用已安装USB记忆棒或CD / DVD的进程特别有用。


这帮助我找到了一个进程,该进程的当前工作目录阻止了循环设备挂载的自动清除。未在fuser或标准中列出lsof
汤姆·黑尔

更好的是使用,/dev/<device>而不是/mountpoint那样/mountpoint会在一次之后消失umount -l
汤姆·黑尔

7

lsof和fuser实际上是找到使特定文件保持打开状态的过程的两种方法。如果只希望umount成功,则应研究其-f和-l选项。


1
我最近遇到了这个问题,热熔器或lsof都不会使用该设备显示任何内容,但是umount -l允许我卸载它。至少,它似乎(-l表示惰性卸载,现在从文件系统层次结构中分离文件系统,并在不再繁忙时清除对文件系统的所有引用。)
Jeff Welling

5

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

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


8
但这正是我似乎遇到的问题。一个如何调试呢?
K3 --- rnc 2014年

2

lsof和热熔器也没有给我任何东西。

在将所有可能的目录重命名为.old并在每次进行更改后每次重新引导系统的过程之后,我发现一个特定的目录(与postfix有关)负责。

原来,我曾经做过一个从/ var / spool / postfix到/ disk2 / pers / mail / postfix / varspool的符号链接,以最大程度地减少基于SDCARD的根文件系统(Sheeva Plug)上的磁盘写入。

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

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

下次,我将更仔细地观察以下内容的输出:

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

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


我实际上正在寻找符号链接(命令中的^ l),您的命令可能会更快,但效果不一样。
captcha

D'oh ...那是因为我打错了命令。应该是find /var -lname *disk2*
womble 2014年

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>)后,可以安全地杀死所有剩余进程:

fuser -vmMk <mountpoint>

挂载点

罪魁祸首可能是内核本身。您尝试安装在文件系统上的另一个文件系统umount将引起麻烦。检查:

mount | grep <mountpoint>/

对于环回安装,还请检查以下输出:

losetup -la

匿名索引节点(Linux)

可以通过以下方式创建匿名索引节点

  • 临时文件(open带有O_TMPFILE
  • inotify的手表
  • [eventfd]
  • [事件投票]
  • [timerfd]

这些是最难以捉摸的宠物小精灵类型,在lsofTYPE列中显示为a_inode(在lsof手册页中未记录 )。

它们不会出现在中lsof +f -- /dev/<device>,因此您需要:

lsof | grep a_inode

有关杀死持有匿名inode的进程,请参阅:列出当前inotify监视(路径名,PID)


1

如果停止所有带有打开文件的服务和进程后仍无法卸载或重新安装设备,则可能存在交换文件或交换分区,使设备忙碌。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上是必需的。


0

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

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

mount | grep '/mnt/yourmount'

要查找正在使用的文件,其他人已经在这里提出了建议:

lsof | grep '/mnt/yourmount'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.