“Device busy”错误源于活跃进程访问挂载点,非僵尸进程所致;lsof +D /mnt/data可精准定位cwd、root、mem、REG等占用类型,结合findmnt检查子挂载,必要时umount -l惰性卸载。

Linux 中 umount 报 “Device busy” 通常不是因为僵尸进程(zombie process)——僵尸进程本身不持有任何文件、目录或挂载点资源,它只是已终止但尚未被父进程回收的进程条目(ps 显示为 Z 状态),**无法独占挂载点或阻塞卸载**。
真正导致 umount: /xxx: device is busy 的,是那些仍在访问该挂载点下文件、目录、打开文件描述符、当前工作目录(cwd)、根目录(root)、加载的库(mem/mmap)、甚至挂载在子目录上的其他文件系统(如 bind mount 或 overlay)的**活跃进程(running/sleeping)**。而 lsof 正是用来定位这类进程的利器。
确认挂载点路径并排除常见干扰
先明确你要卸载的目标挂载点(比如 /mnt/data),并确保没有嵌套挂载:
- 运行
findmnt /mnt/data或mount | grep ' /mnt/data '确认精确挂载路径(注意尾部斜杠和空格) - 执行
findmnt -D /mnt/data查看是否有子挂载(submounts),有则需先卸载子挂载 - 检查是否被
chroot、容器(如 systemd-nspawn、podman)或 namespace 隔离的进程使用 —— 这类进程可能不会直接出现在宿主机lsof默认视图中
用 lsof 定位占用挂载点的活跃进程
运行以下命令精准查找所有访问该挂载点的进程(包括 cwd、root、open files、memory mapping 等):
lsof +D /mnt/data 2>/dev/null | head -n 20
说明:
-
+D递归扫描整个挂载点下的所有打开文件(比+d更彻底,含子目录) -
2>/dev/null屏蔽权限不足警告(如 /proc 下不可读项) -
head防止输出过长;若需完整结果,去掉| head...
重点关注输出中的 COMMAND、PID、TYPE(如 DIR、REG、mem)、NAME 列。例如:
-
bash 12345 user cwd DIR 8,3 4096 123456 /mnt/data→ bash 当前工作目录在此 -
nginx 12346 root cwd DIR 8,3 4096 123456 /mnt/data→ nginx 根目录设为此处 -
rsync 12347 user REG 8,3 1048576 789012 /mnt/data/backup.img→ 正在读写文件
处理常见占用类型
根据 lsof 输出的 TYPE 和 NAME 区分处理:
-
cwd / root 占用:终端或服务进程把挂载点当工作目录或根目录。可尝试
kill -TERM $PID或让其cd /后再 umount - REG / DIR / FIFO / socket 文件被打开:对应进程正在读写。确认是否可安全中断(如 rsync、cp、tail -f),然后 kill 或等待完成
- mem / DEL / mmap 占用:进程将文件内存映射(如数据库、Java 应用加载 jar)。需停止对应服务
-
lsof 自身或 shell 进程出现:说明你当前就在该挂载点内执行命令(如
cd /mnt/data && lsof +D .),退出目录再试
补充技巧:快速过滤与强制诊断
如果 lsof +D 太慢或权限受限,可用更轻量方式辅助判断:
- 查当前工作目录占用:
lsof +D /mnt/data 2>/dev/null | awk '$5=="cwd" {print $1,$2}' | sort -u - 查所有打开该设备上文件的进程(按设备号):
lsof -x /mnt/data 2>/dev/null(需内核支持) - 启用详细卸载诊断:
umount -v /mnt/data或查看内核日志dmesg | tail -10获取线索 - 终极手段(慎用):
umount -l /mnt/data(lazy unmount),解除挂载点绑定,待所有引用释放后自动清理
僵尸进程无需也不应通过 lsof 查找 —— 它们不影响 umount。专注找出真实活跃的占用者,问题就清楚了。


















