我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(从SQL表)的代码,并将它们挂载到所有用户都可以访问它们的特殊目录中。
我想知道,如果我从我的SQL表中删除驱动器(有效地使其脱机)如何,甚至是,有一种方法来卸载繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。
忽略破坏数据的可能性-是否有可能卸载当前正在读取的设备?
我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(从SQL表)的代码,并将它们挂载到所有用户都可以访问它们的特殊目录中。
我想知道,如果我从我的SQL表中删除驱动器(有效地使其脱机)如何,甚至是,有一种方法来卸载繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。
忽略破坏数据的可能性-是否有可能卸载当前正在读取的设备?
当前回答
众答:
如果该设备上有一个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盘,没有任何问题。 培根得救。
是的! !有一种方法可以立即分离繁忙的设备-即使它繁忙且不能强制卸载。你可以稍后清理:
umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS (NETWORK-FILE-SYSTEM)
注意/警告
这些命令可能会中断正在运行的进程,导致数据丢失或损坏打开的文件。在强制卸载后,访问目标DEVICE/NFS文件的程序可能会抛出错误或无法正常工作。 不要在挂载路径(文件夹/驱动器/设备)内部执行以上umount命令。首先,您可以使用pwd命令验证您的当前目录路径(不应该是挂载路径),然后使用cd命令退出挂载路径-稍后使用上述命令卸载它。
在卸载文件系统之前。我们需要检查是否有任何进程持有或使用文件系统。这就是为什么它显示设备繁忙或文件系统正在使用。 运行以下命令查看文件系统所使用的进程:
定影器 -cu /本地/mnt/
它将显示有多少进程持有/使用文件系统。
Local /mnt: 1725e(root) 5645c(shasankarora)
ps -ef | grep 1725 < - > ps -ef | grep < pid >
Kill -9 pid
杀死所有进程,然后您将能够卸载分区/繁忙设备。
如果可能的话,让我们定位/识别繁忙的进程,终止该进程,然后卸载samba共享/驱动器,以最大限度地减少损害:
Lsof | grep '< /dev/sda1的挂载点>'(或任何被挂载的设备) kill target_process(将busy proc.按名称| kill PID | killall target_process) Umount /dev/sda1(或任何已挂载的设备)
有人提到过,如果你正在使用终端,而你的当前目录在你想要卸载的路径中,你会得到错误。 作为补充,在这种情况下,你的lsof | grep path-to-be unmounted必须有以下输出:
bash ... path-to-be-unmounted