1. 使用 lsof 命令(推荐)
lsof(List Open Files)可以列出所有打开的文件和设备的进程信息。
语法:
bash
sudo lsof /dev/<设备名> # 查看特定设备
sudo lsof <挂载点> # 查看挂载目录
示例:
bash
sudo lsof /dev/sdb1 # 查看谁在使用 /dev/sdb1
sudo lsof /mnt/usb # 查看谁在访问 /mnt/usb
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1234 root cwd DIR 8,17 4096 2 /mnt/usb
vim 5678 user 4u REG 8,17 1024 3 /mnt/usb/file.txt
COMMAND:进程名(如 bash、vim)。
PID:进程 ID,可以用 kill -9
USER:运行该进程的用户。
FD:文件描述符(cwd=当前工作目录,mem=内存映射文件等)。
2. 使用 fuser 命令
fuser 可以显示正在使用某个设备或挂载点的进程 PID。
语法:
bash
sudo fuser -v /dev/<设备名> # 查看设备
sudo fuser -v <挂载点> # 查看挂载目录
sudo fuser -vm /mnt/usb # 显示详细信息
示例:
bash
sudo fuser -v /dev/sdb1
sudo fuser -vm /mnt/usb
输出示例:
USER PID ACCESS COMMAND
/mnt/usb: root kernel mount /mnt/usb
alice 1234 ..c.. bash
ACCESS 列:
c:当前目录在该挂载点。
f:打开的文件在该挂载点。
m:内存映射文件(如 lib 库或 mmap 文件)。
结束占用进程
bash
sudo fuser -km /mnt/usb # 强制结束所有占用 /mnt/usb 的进程
3. 使用 lsblk + lsof 结合
如果想查看所有挂载的设备及其占用情况:
bash
lsblk # 查看块设备
sudo lsof /dev/sdb1 # 查看特定设备的进程
4. 特殊情况:umount 失败时如何查找进程
如果 umount 报错 target is busy,可以:
bash
sudo umount -l /mnt/usb # 延迟卸载(lazy unmount),等设备不再使用时自动卸载
或者:
bash
sudo lsof +f -- /mnt/usb # 强制检查挂载点
sudo fuser -vm /mnt/usb # 查看占用进程
5. 检查内核模块占用的设备
如果是内核模块(如 nfsd、mdadm)占用设备,可以:
bash
dmesg | grep <设备名> # 查看内核日志
lsmod | grep nfs # 查看是否 NFS 相关模块占用
总结
方法命令适用场景lsofsudo lsof /dev/sdb1查看具体哪个进程打开了设备文件fusersudo fuser -vm /mnt/usb快速查看占用进程并结束umount -lsudo umount -l /mnt/usb延迟卸载,避免 device is busylsblk + lsoflsblk + lsof结合查看块设备和进程
如果设备被占用,可以:
结束进程:kill -9
延迟卸载:umount -l。
检查内核模块:dmesg 或 lsmod