我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(从SQL表)的代码,并将它们挂载到所有用户都可以访问它们的特殊目录中。
我想知道,如果我从我的SQL表中删除驱动器(有效地使其脱机)如何,甚至是,有一种方法来卸载繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。
忽略破坏数据的可能性-是否有可能卸载当前正在读取的设备?
我有一些samba驱动器,每天都有多个用户访问。我已经有了识别共享驱动器(从SQL表)的代码,并将它们挂载到所有用户都可以访问它们的特殊目录中。
我想知道,如果我从我的SQL表中删除驱动器(有效地使其脱机)如何,甚至是,有一种方法来卸载繁忙的设备?到目前为止,我发现任何形式的umount都不起作用。
忽略破坏数据的可能性-是否有可能卸载当前正在读取的设备?
当前回答
sudo fusermount -u -z <mounted path>
注意:不要对路径使用补全,因为这也会冻结终端。
其他回答
在卸载文件系统之前。我们需要检查是否有任何进程持有或使用文件系统。这就是为什么它显示设备繁忙或文件系统正在使用。 运行以下命令查看文件系统所使用的进程:
定影器 -cu /本地/mnt/
它将显示有多少进程持有/使用文件系统。
Local /mnt: 1725e(root) 5645c(shasankarora)
ps -ef | grep 1725 < - > ps -ef | grep < pid >
Kill -9 pid
杀死所有进程,然后您将能够卸载分区/繁忙设备。
我最近有一个类似的需要卸载,以便用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盘,没有任何问题。 培根得救。
sudo fusermount -u -z <mounted path>
注意:不要对路径使用补全,因为这也会冻结终端。
看看umount2:
Linux 2.1.116 added the umount2() system call, which, like umount(), unmounts a target, but allows additional flags controlling the behaviour of the operation: MNT_FORCE (since Linux 2.1.116) Force unmount even if busy. (Only for NFS mounts.) MNT_DETACH (since Linux 2.4.11) Perform a lazy unmount: make the mount point unavailable for new accesses, and actually perform the unmount when the mount point ceases to be busy. MNT_EXPIRE (since Linux 2.6.8) Mark the mount point as expired. If a mount point is not currently in use, then an initial call to umount2() with this flag fails with the error EAGAIN, but marks the mount point as expired. The mount point remains expired as long as it isn't accessed by any process. A second umount2() call specifying MNT_EXPIRE unmounts an expired mount point. This flag cannot be specified with either MNT_FORCE or MNT_DETACH. Return Value On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
文件夹内的多个挂载
另一个原因可能是在你的主挂载文件夹中有一个副挂载,例如,在你为嵌入式设备使用SD卡后:
# mount /dev/sdb2 /mnt # root partition which contains /boot
# mount /dev/sdb1 /mnt/boot # boot partition
卸载/mnt将失败:
# umount /mnt
umount: /mnt: target is busy.
首先我们必须卸载引导文件夹,然后卸载根目录:
# umount /mnt/boot
# umount /mnt