有时当我想卸载设备时,例如
sudo umount /dev/loop0
我会收到消息
umount: /mnt: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
我通常通过关闭控制台窗口(在我的例子中是 xfce4-terminal)然后关闭umount
.
这个问题意味着什么?有更聪明的解决方案吗?
答案1
这意味着某个进程在挂载点下有一个工作目录或一个打开的文件句柄。最好的办法是结束有问题的进程,更改其工作目录或在卸载之前关闭文件句柄。
不过 Linux 上还有一个替代方案。使用调用umount -l
“惰性”卸载。文件系统仍将被挂载,但您将无法看到或使用它,除非已经在使用它的进程。当有问题的程序退出(通过任何方式)时,系统将“完成”卸载文件系统。
答案2
您还可以使用fuser
已安装的文件系统来终止所有进程。
fuser -cuk /mnt
选项:
-c
Same as -m option, used for POSIX compatibility.
-u, --user
Append the user name of the process owner to each PID.
-k, --kill
Kill processes accessing the file. Unless changed with -SIGNAL, SIGKILL is sent. An fuser process
never kills itself, but may kill other fuser processes. The effective user ID of the process
executing fuser is set to its real user ID before attempting to kill.kill.
-m NAME, --mount NAME
NAME specifies a file on a mounted file system or a block device that is mounted. All processes
accessing files on that file system are listed. If a directory file is specified, it is
automatically changed to NAME/. to use any file system that might be mounted on that directory.
请自行检查解释shell。
答案3
我发现了一种可能会干扰卸载设备的情况,尽管这个问题已经很老了,但我将分享它作为答案。
如果您的计算机上托管有 NFS 共享,并且这些 NFS 共享中的任何一个都由您尝试卸载的设备支持,则您将必须停止共享它们(最好通过停止 NFS 服务来完成,例如sudo service nfs-kernel-server stop
在最新版本的 Ubuntu 上) )。 NFS 服务器可能不会显示在 lsof 或 fusionr 中,这会使问题难以识别。
答案4
给定您的“通常解决方案”,这意味着您在控制台窗口中运行的 shell 将该设备上的文件系统中的一个目录作为其当前工作目录。
Linux 和一般的 Unix 系统,如果进程在该文件系统中拥有当前工作目录,则非常希望保持该文件系统的挂载状态。
您可以只cd
在控制台窗口中使用来退出其中或之下的目录,/mnt
而不是杀死控制台窗口以及在其中运行的 shell。