Linux:执行卸载时,哪个进程导致“设备繁忙”?
NFS
!您需要停止所有NFS导出或要安装的驱动器上的安装点umount
。NFS不会出现在lsof
或fuser
...上,因此非常棘手!
Linux:执行卸载时,哪个进程导致“设备繁忙”?
NFS
!您需要停止所有NFS导出或要安装的驱动器上的安装点umount
。NFS不会出现在lsof
或fuser
...上,因此非常棘手!
Answers:
查看lsof命令(列出打开的文件)-它可以告诉您哪些进程正在保持打开状态。有时这很棘手,但通常sudo lsof | grep (your device name here)
它会为您完成一些简单的事情。
lsof /mountpoint
而不是lsof /mountpoint/
lsof +f /dev/device
而不是mountpoint有一个优势。对于带有匿名inode的内核进程,也可以看到相同的结果,即使在该列表中也可能不显示。
以防万一...有时会发生从终端调用umount的情况,并且当前目录属于已挂载的文件系统。
fuser
我相信这样可以捕获当前的工作目录。
fuser
有时会显示lsof
不符合要求的事物,反之亦然。所以你不能只做一个!
使用“ losetup -a”检查映射到文件系统上文件的开环设备。他们不会与lsof或融合器一起出现。
umount -l /data
实际工作-在FS消失了-但后来卸载/dev/loop0
和/dev/loop1
挂了一段时间。但是现在看来还好。这个答案非常重要,因为它可以帮助已经知道lsof
并fuser
有多年历史的人们……
/dev/loop0 /dev/loop1
循环设备。我可以摆脱它们的唯一方法是使用列出设备,dmsetup ls
然后找到可疑的docker devicemapper设备docker-253:0-4291588-pool。 dmsetup remove docker-253:0-4291588-pool
干净地摆脱了它
同时检查/etc/exports
。如果要通过NFS导出安装点内的路径,则在尝试卸载时会出现此错误,并且fuser
或中不会显示任何内容lsof
。
lsof和fuser实际上是找到使特定文件保持打开状态的过程的两种方法。如果只希望umount成功,则应研究其-f和-l选项。
这就是存在“ fuser -m / mount / point”的原因。
顺便说一句,尽管我通常没有这个问题,但我不认为“ fuser”或“ lsof”会指示内核模块何时拥有资源。
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)的名称。
find /var -lname *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>
)后,可以安全地杀死所有剩余进程:
fuser -vmMk <mountpoint>
罪魁祸首可能是内核本身。您尝试安装在文件系统上的另一个文件系统umount
将引起麻烦。检查:
mount | grep <mountpoint>/
对于环回安装,还请检查以下输出:
losetup -la
可以通过以下方式创建匿名索引节点:
open
带有O_TMPFILE
)这些是最难以捉摸的宠物小精灵类型,在lsof
的TYPE
列中显示为a_inode
(在lsof
手册页中未记录 )。
它们不会出现在中lsof +f -- /dev/<device>
,因此您需要:
lsof | grep a_inode
有关杀死持有匿名inode的进程,请参阅:列出当前inotify监视(路径名,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'