如何强制 CIFS 连接卸载

我有一个安装在 Linux 机器上的 CIFS 共享。CIFS 服务器关闭,或者因特网连接关闭,任何接触到 CIFS 挂载的东西现在都需要几分钟的超时时间,并且在等待期间是不可杀死的。我甚至不能在我的主目录中运行 ls,因为有一个符号链接指向 CIFS 挂载,ls 试图跟随它来决定它应该是什么颜色。如果尝试 ummount 它(即使使用-fl) ,ummount 进程也会像 ls 一样挂起。即使是 sudo kill-9也杀不死它。如何强制卸载内核?

225949 次浏览

有一个 -f 选项可以尝试 ummount:

umount -f /mnt/fileshare

是否指定要挂载的“-t cifs”选项?还要确保没有指定要挂载的“硬”选项。

您可能还需要考虑 翻译,因为文件系统将在用户空间中运行,您可以像杀死其他进程一样杀死它。

尝试 ummount-f/mnt/share。

另外,看一下 autofs,它将只在访问时挂载共享,并且将在以后挂载它。

Www.howtoforge.net有一个很好的教程

我使用惰性卸载: umount -l(小写的 L)

懒惰卸载。分离文件系统 从现在的文件系统层次结构,和 方法的所有引用 文件系统,只要它不忙 (需要内核2.4.11或 稍后。)

这个问题困扰了我一天,直到我找到了真正的解决办法。与其强迫卸载挂起的中小企业股票,不如使用“软”选项挂载该股票。如果一个进程试图连接到不可用的共享,它将在一定时间后停止尝试。

让挂载变软。在文件系统调用失败后几秒钟。

mount -t smbfs -o soft //username@server/share /users/username/smb/share


stat /users/username/smb/share/file
stat: /users/username/smb/share/file: stat: Operation timed out

也许不是你问题的真正答案,但它是问题的解决方案

umount -a -t cifs -l

在 CentOS 6.3上非常有效,帮我省去了重启服务器的麻烦。

这对我很有用(Ubuntu 13.10桌面到 Ubuntu 14.04服务器) :-

 sudo umount -f /mnt/my_share

安装了

 sudo mount -t cifs -o username=me,password=mine //192.168.0.111/serv_share /mnt/my_share

其中 serv _ share 是在 smb.conf 文件中设置并指向的。

我和 Davfs 也有类似的问题。在 umount.davfs的手册页中,我发现 umount.davfs忽略了 -f -l -n -r -v选项。为了强制卸载 davfs 挂载,我必须使用 umount -i -f -l /media/davmount

在 RHEL 6上,这个方法奏效了:

umount -f -a -t cifs -l

在 RHEL 6上,这对我也有效:

Ummount-f-a-t cifs-l FOLDER _ NAME

umount -f -t cifs -l /mnt &

小心 &,让 umount在后台运行。 umount将首先分离文件系统,因此您将找不到任何关于 /mnt的内容。如果您运行 df命令,那么它将强制 umount /mnt

懒惰的卸载将为您完成这项工作。

umount -l <mount path>

我经历了非常不同的结果,关于卸载一个死的 cifs 挂载,并找到了几个技巧来绕过问题暂时。

让我们从 mountpoint命令开始:

mountpoint /mnt/smb_share

通常它返回 is a mountpoint/ is not a mountpoint

但它甚至可以回归:

  • 没有这种装置
  • 未连接传输端点
  • < 没有/陈旧 >

对于 is not a mountpoint的每一个预期结果,都有一个卸载的机会。

你可以试试通常的方法:

umount /mnt/smb_share

或强制模式:

umount /mnt/smb_share -f

但通常这种力量并不起作用,它只是返回相同的令人讨厌的 device is busy消息。

那么唯一的选择就是使用延迟模式:

umount /mnt/smb_share -l

但是: 这不会卸载任何东西。它只是将挂载“移动”到系统的根目录,这可以看作是:

# lsof | grep mount | grep cwd
mount.cif  3125             root  cwd   unknown                                          / (stat: No such device)
mount.cif  3150             root  cwd   unknown                                          / (stat: No such device)

文件中甚至提到:

延迟卸载。从文件层次结构中分离文件系统 现在,尽快清除对该文件系统的所有引用 因为它不再忙碌了。

现在,如果你运气不好,它将永远停留在那里。即使取消这个过程可能也无济于事:

kill -9 $pid

但是这有什么问题呢?因为除非 Linux 内核真正清理了懒惰的未装载路径,否则 mount /mnt/smb_share无法工作。甚至在 umount的文档中也提到了这一点。“惰性”只应用于避免长时间的关机/重启时间:

系统重新启动将在不久的将来,如果你是 将对网络文件系统或本地文件系统使用此选项 推荐的用例 Ummount-l 是为了防止由于 无法到达的网络共享,其中一个正常的数量将挂起到期 服务器或网络分区 分享是不可能的。

变通方法

使用不同的 SMB 版本

如果你仍然希望懒惰的卸载路径不再忙碌,并且被 Linux 内核清理干净,或者你现在不能重启,那么你可能是幸运的,你的 SMB 服务器支持不同的协议版本。通过这种方式,我们可以使用以下技巧:

假设你的份额增加如下:

mount.cifs //smb.server/share /mnt/smb_share -o username=smb_user,password=smb_pw

通过该 Linux 自动尝试最大支持 SMB 协议版本。也许是3.1。现在,您可以强制执行这个版本,它不会像预期的那样挂载:

mount.cifs //smb.server/share /mnt/smb_share -o username=smb_user,password=smb_pw,vers=3.1

不过,你可以试试另一个版本:

mount.cifs //smb.server/share /mnt/smb_share -o username=smb_user,password=smb_pw,vers=3.0

或者2.1:

mount.cifs //smb.server/share /mnt/smb_share -o username=smb_user,password=smb_pw,vers=2.1

更改 SMB 服务器的 IP

如果您能够更改 IP 地址或向 SMB 服务器添加第二个 IP,则可以使用该地址挂载同一服务器。

前进交通

假设 SMB 服务器的 IP 地址为10.0.0.1,挂载实际上已经死亡。然后创建这个 iptables规则:

iptables -t nat -A OUTPUT -d 10.0.0.250 -j DNAT --to-destination 10.0.0.1

现在相应地更改您的 mount 规则,以便它通过 IP 10.0.0.250而不是10.0.0.1挂载 samba 服务器,瞧,它的挂载不需要重新启动服务器。很脏,但很有效。PS 此规则在重新启动后无法生存,因此您应该手动挂载 SMB 服务器,并像往常一样保留 /etc/fstab

更多的调试

如果您想检查 samba 连接本身是否在理论上正常工作,您可以尝试通过 SMB3列出服务器的所有 SMB 共享,如下所示:

smbclient //smb.server -U "smb_user" -m SMB3 -L

或浏览以中小企业价格计算的股票内容:

smbclient //smb.server -U "smb_user" -m NT1 -c ls

从侧面解决这个问题:

如果因为文件系统繁忙而无法卸载,那么 ssh/终端会话是否被 cd 到 mount 目录中,从而使文件系统繁忙?

对我来说,解决方案是把光盘放进家里,然后 sudo umamount 就可以完美地工作了。

cd ~
umount /path/to/my/share

我想发表这个作为评论,但我没有足够的名声。希望免除别人的前额耳光。