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

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

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


当前回答

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

其他回答

当一切正常时,另一个选择是编辑/etc/fstab,添加noauto标志并重新启动机器。设备将不会被安装,当你完成任何操作时,移除标志并重新启动。

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

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

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

众答:

如果该设备上有一个zfs池,至少当它是一个基于文件的池时,lsof将不会显示使用情况。但你可以简单地跑步

sudo zpool export mypool

然后卸载。

我最近有一个类似的需要卸载,以便用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盘,没有任何问题。 培根得救。

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