为什么卸载时总提示“device or resource busy”?
卸载失败是因为还有进程占用着这个文件系统。先找出占用者、结束它,再重新卸载。
快速开始
只有还有东西在用这个文件系统时,umount 才会失败:比如当前目录就停在里面某个文件夹的终端、打开着文件的编辑器或文件管理器、正在播放的播放器,或者后台的同步、索引进程。内核不会把这些进程脚下的文件系统直接抽走。解决思路每次都是一样的——找出占用者、让它放手、再试一次,完全不需要重启。
症状
先查出是谁占用了挂载点
第一步做这个,是因为报错的对象不是硬盘,而是还在用这个文件系统的东西。这条检查会列出进程号、所属用户以及挂载点内部被打开的具体文件,让你分得清是自己停在那个目录里的终端,还是不该乱动的系统服务。如果它一点输出都没有,说明占用者不是普通的打开文件,接着看下一步。
用 fuser -vm 找出占用挂载点的进程,关闭它们(或退出停在该目录的终端)后再卸载。
$ fuser -vm /media/usb▾ 撤销
$ null检查是否有人占着已删除的文件
文件被删除以后,只要还有进程打开着它,这个文件描述符依然算作文件系统上的一处占用,所以你看着已经关掉的程序或轮转过的日志,可能就是背后那个看不见的占用者。如果输出里出现了挂载点下面的路径,那条记录就是拦路的,除非对应进程退出或被结束,否则卸载会一直失败。没有匹配项,就直接进入下一步去结束进程。
当 df 显示磁盘满但 du 却找不到大文件时,多半是有进程还握着已删除的文件;lsof +L1 能把它们和占用进程一起列出来。
$ sudo lsof +L1先温和结束,不行再强杀
先发普通的终止信号,让程序有机会把缓冲区写回去、把文件关干净;如果几秒之后它还在,再升级成强制终止。判断是否奏效的办法,是回头再查一次挂载点上的占用情况:列表空了,文件系统就自由了。强制终止可能丢掉还没写进目标设备的资料,所以留到最后再用。
按 PID 结束指定进程:先用普通 kill(SIGTERM),进程拒不退出时才用 kill -9(SIGKILL)。
$ kill 12345不想找进程号就按名字结束
当占用者是一整个会不断拉起子进程的程序,或者你有好几个终端都停在那个挂载点里、不想一个一个关时,按名字匹配最省事,一次把同名的进程全部结束。风险也在这里:名字一定要写准,写得太宽泛就可能误伤别的程序。确认办法和前面一样,再查一次挂载点的占用情况,应该已经没有谁占着它了。
如何确认已解决
对同一个挂载点再卸载一次。成功的话不再报错、退出码为 0,设备从挂载表里消失,读写指示灯也不再闪,这时候拔线才安全。
一键全部撤销
上面每一条命令都可以撤销。按此顺序执行即可全部还原。
$ null执行前请先确认——部分步骤之间可能并非相互独立。
来源
- pgrep, pkill, pidwait - look up, signal, or wait for processes based on name and other attributes依据: "pkill ... will send the default signal (SIGTERM) to each process instead of listing them on stdout." The page also documents the -signal and -l/--list-signals options.
- Ubuntu Manpage: pgrep, pkill, pidwait - look up, signal, or wait for processes依据: "pkill ... will send the default signal (SIGTERM) to each process instead of listing them on stdout."
- kill - send a signal to a process依据: kill sends signals to processes; the signal list includes "9) SIGKILL" and "1) SIGHUP", and the default signal is TERM. The -s/-<signal> options select the signal to send.
- Ubuntu Manpage: kill - terminate or signal processes依据: The kill utility sends a signal to processes by PID; the -<signal> form selects the signal, e.g. -9 (SIGKILL) and -HUP (SIGHUP); the default is SIGTERM.
- fuser(1) — identify processes using files or sockets依据: fuser -v -m DIR lists processes using the mounted filesystem
- lsof(8) - Linux manual page依据: The +L1 option selects files with a link count less than one, i.e. open files that have been unlinked (deleted).
- umount(8) — unmount file systems依据: describes the EBUSY 'target is busy' condition
最后验证: 2026-09-22