我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(从SQL表)的代码,并将它们挂载到所有用户都可以访问它们的特殊目录中。

我想知道,如果我从我的SQL表中删除驱动器(有效地使其脱机)如何,甚至是,有一种方法来卸载繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。

忽略破坏数据的可能性-是否有可能卸载当前正在读取的设备?


当前回答

我最近有一个类似的需要卸载,以便用gparted更改它的标签。

/dev/sda1通过/etc/fstab以/media/myusername挂载。当尝试卸载失败时,我研究了这个错误。我忘了先卸载一个挂载点在/dev/hda1上的双分区u盘。

我给了'lsof'一个建议。

$ sudo lsof | grep /dev/sda1

其结果是:

lsof:警告:不能stat()保险丝。Gvfsd-fuse文件系统/run/user/1000/gvfs . zip 输出信息可能不完整。 lsof:警告:不能stat()融合文件系统/run/user/1000/doc 输出信息可能不完整。

由于lsof发出了两个保险丝警告,我在/run/user/1000/*中戳了一下,并猜测可能是打开的文件或挂载点(或两者都有)干扰了事情。

由于挂载点在/media/中,我再次尝试:

$ sudo lsof | grep /media

同样的两个警告,但这次它返回了额外的信息:

bash 4350 myusername cwd DIR 8,21 4096 1048577 /media sudo 36302 root cwd DIR 8,21 4096 1048577 /media grep 36303 myusername cwd DIR 8,21 4096 1048577 /media lsof 36304 root cwd DIR 8,21 4096 1048577 /media lsof 36305 root cwd DIR 8,21 4096 1048577 /media

我搔着头,这时我想起了u盘从USB接口伸出来。也许是抓挠起了作用。

所以我卸载了u盘分区(卸载一个分区会自动卸载另一个分区),并安全地拔掉了u盘的插头。在这样做之后,我能够卸载/dev/sda1(不再安装任何东西),用gparted重新标记它,重新安装驱动器和u盘,没有任何问题。 培根得救。

其他回答

当您尝试卸载时,请确保您不在已安装的设备中。

尝试下面的操作,但在运行之前请注意-k标志将终止所有使设备处于繁忙状态的正在运行的进程。

-i标志使fuser在kill前询问。

fuser -kim /address  # kill any processes accessing file
unmount /address

在卸载文件系统之前。我们需要检查是否有任何进程持有或使用文件系统。这就是为什么它显示设备繁忙或文件系统正在使用。 运行以下命令查看文件系统所使用的进程:

定影器 -cu /本地/mnt/

它将显示有多少进程持有/使用文件系统。

Local /mnt: 1725e(root) 5645c(shasankarora)

ps -ef | grep 1725 < - > ps -ef | grep < pid >

Kill -9 pid

杀死所有进程,然后您将能够卸载分区/繁忙设备。

使用exportfs -v检查导出的NFS文件系统。如果发现,使用exportfs -d share:/directory删除。这些不会在fuser/lsof列表中显示,并且会阻止umount成功。

在我的例子中,我无法卸载挂载到AFP共享目录的分区。(分享到Apple bonjour/avahi mdns世界) 我把服务器上的所有登录都移动到它们的主目录;我把所有远程连接的mac电脑都移到了其他目录下。 即使使用umount -f,我仍然无法卸载分区 所以我重启了服务器上的netatalk守护进程。 (/etc/netatalk/afp.conf中有共享分配) 日志含义重启netatalk后,不带-f参数,umount成功。