在Linux系统下卸载设备时,常常会遇到“Device is busy”的提示,报错的缘由一般是由于待卸载磁盘正在使用,导致无法直接卸载,需要降当前使用数据盘的进程杀掉,才能卸载。如果贸然强行删除,可能会导致数据丢失或设备损坏。需要使用fuser命令查找和删除占用的程序。
umount: /PT5/Docker/overlay2: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
方法一:
- 安装fuser命令
有些机器系统中fuser不是默认安装,需要用户安装
列如CentOS 7 系统中
yum install psmisc
- 查看正在使用的进程
Fuser:显示出当前程序正在使用设备上的某个文件,挂载点,甚至网络端口,并给出程序进程的详细信息。
格式:fuser [option] filename….
-v:查看某文件正在运行的进程,会给出进程号
-k:干掉访问这个文件的程序
-a:在命令行显示所有特殊文件
-m FILENAME:显示所有使用指定文件系统的进程,后面可以跟挂载点,或是dev设备
-km MOUNT_POINT:k选项是杀掉正在访问这个文件的进程,而m是指定这个挂载这个文件系统或者块设备的具体文件(挂载点),两个选项合起来就是干掉正在访问挂载点的所有进程。如果正在使用这个文件系统的操作是一个bash,那么干掉这个bash就会让用户弹出来。
例如:无法卸载的设备为/dev/vdd1,运行以下命令:
fuser -m -v /dev/vdd1
- 杀死占用的进程
fuser -mk /dev/vdd1
或
kill -9 进程号 (强制 kill 进程可能会导致数据丢失,请确保数据得到有效备份后,再进行相关操作。)
PS: 如果bash在使用此磁盘,会发现bash退出了,新开bash 并再次查看fuser -mv /dev/vdd1
确认是否还有占用进程。
- 卸载命令
umount /dev/vdd1
方法二:
[root@server-10 ~]# lsof /mnt/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 16302 root cwd DIR 8,17 50 64 /mnt
找到PID对应的进程或者服务,然后杀死或者停止相应服务即可。
常见问题
此案例中即使使用上述所有操作删除占用的进程,但还是提示磁盘busy,使用kill去杀进程,发现进程号一直在变化,惊觉可能是某个服务进程一直在运行,使用fuser -m -v /dev/vdd1 去查看详细的进程信息,发现是docker服务一直在占用。
解决方案:停止docker服务
systemctl stop docker
umount /dev/vdd1
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...