记一次mount point is busy问题排查
概述
在针对公司防火墙设备制作补丁的时候,遇到个蛋疼的问题,补丁没有安装之前,“mount -o remount,ro /” 命令能正常执行,但是安装补丁后,总是提示“mount: /XX/XX: mount point is busy.”
问题分析
根据补丁改动的文件进行分析,fuser -mv /XX/XX,发现太多进程使用对应挂载点,没办法确认具体进程。后面在参考链接1里面找到简便方法
lsof +f -- /XX/XX | awk 'NR==1 || $4~/[0-9]+[uw -]/'
但是,我执行上面命令发现没有占用的程序,后面采用下面命令
lsof +f -- /XX/XX | more
分析输出内容,主要查看FD列,FD列的含义如下
The manpages describe the interpretation; 'r' for read; 'w' for write' and 'u' for read and write access.
r - 读; w - 写; u - 读写;
但是我在分析的时候,发现FD列并没有wu相关的标志,大部分是mem、reg、cwd之类的,但是发现多了个DEL标志,而且拥有该标志的文件就是补丁修改的某个动态库,最终确认问题根源。
问题根源
应该是修改的动态库被间接链接到该程序,但是我制作补丁的时候,没有重启该程序就直接替换动态库,从而引发了该问题。
解决方案
在补丁加上重启的对应进程的逻辑即可。
针对普通场景,临时解决方案也可以,通过以下命令,将占用进程全部杀一遍
fuser -kim /XX/XX
当然,通过mount -l参数(umount也一样)进行延迟处理也没问题。但是这个方案在我的问题应该是解决不了的。
参考链接
How to unmount a busy device