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