我使用 sshfs(版本 2.8.4)挂载了一个远程文件系统
sshfs -o allow_root [email protected]: ./example
但卸载失败
> fusermount -u example
umount: /home/joeuser/example: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
关于可能导致此错误的原因以及如何修复它,您有什么想法吗?
答案1
某个程序正在使用您尝试卸载的文件系统中的文件。它可能是已打开以进行读取或写入的文件、当前目录或一些更模糊的情况。它甚至可能是由于文件系统上的目录是挂载点。
要进行调查,请运行lsof +f -- example
。它将告诉您哪些进程正在使用文件系统。请自行判断是否让它们关闭文件、终止它们或推迟卸载操作。
使用 FUSE 文件系统(如 SSHFS),您可以终止提供文件系统的进程。FUSE 必须支持此功能,因为进程可能随时终止;如果所有进程尝试访问文件系统,它们都会收到“传输端点未连接”错误。这本身不会卸载文件系统,但有时这是让您的系统摆脱困境的另一种方法。
答案2
我认为你想要一个惰性卸载:
sudo umount -l example
答案3
我刚刚遇到这个问题,无法kill -9
从已安装的文件系统读取进程。即使在或(有效)kill -9
之后也不起作用。唯一有效的是。fusermount -zu /mount/point
umount -l /mount/point
pkill -9 sshfs
答案4
运行 Ubuntu 时,man fusermount
会显示一个-z
选项,记录为“延迟卸载”。它似乎相关,但需要确认,此确认由另一个手册页提供:fusermount (man.he.net),表示“延迟卸载(即使资源仍然繁忙也能工作)”。必须使用它和-u
仅使用选项-z
会产生错误。我尝试了该-z
选项,可以确认它确实有效,但这太像一个诡计了:它到底是做什么的?让它在目录不再繁忙时自动卸载?我不知道,没有记录,所以不安全。
因此,这里还有另一种选择,更加冗长,但更加安全:循环尝试卸载直至成功,根据需要进行多次尝试。
echo -n "Unmounting...";
fusermount -u -q "$MOUNT_POINT";
OK="$?";
while [ "$OK" != "0" ]
do
sleep 1;
echo -n ".";
fusermount -u -q "$MOUNT_POINT";
OK="$?";
done
echo;
进度反馈很少,因此人们知道发生了什么并且不相信它已经挂起了。
该选项在 shell 脚本中是可以接受的;对于命令行交互,使用该-z
选项更加方便,但可能必须注意手册页没有记录它,并且可能对它到底做什么存在疑问。