我有一个安装在 Linux 机器上的 CIFS 共享。CIFS 服务器关闭,或者因特网连接关闭,任何接触到 CIFS 挂载的东西现在都需要几分钟的超时时间,并且在等待期间是不可杀死的。我甚至不能在我的主目录中运行 ls,因为有一个符号链接指向 CIFS 挂载,ls 试图跟随它来决定它应该是什么颜色。如果尝试 ummount 它(即使使用-fl) ,ummount 进程也会像 ls 一样挂起。即使是 sudo kill-9也杀不死它。如何强制卸载内核?
有一个 -f 选项可以尝试 ummount:
umount -f /mnt/fileshare
是否指定要挂载的“-t cifs”选项?还要确保没有指定要挂载的“硬”选项。
您可能还需要考虑 翻译,因为文件系统将在用户空间中运行,您可以像杀死其他进程一样杀死它。
尝试 ummount-f/mnt/share。
另外,看一下 autofs,它将只在访问时挂载共享,并且将在以后挂载它。
在 Www.howtoforge.net有一个很好的教程
我使用惰性卸载: umount -l(小写的 L)
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。
umount.davfs
-f -l -n -r -v
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
/mnt
df
umount /mnt
懒惰的卸载将为您完成这项工作。
umount -l <mount path>
我经历了非常不同的结果,关于卸载一个死的 cifs 挂载,并找到了几个技巧来绕过问题暂时。
让我们从 mountpoint命令开始:
mountpoint
mountpoint /mnt/smb_share
通常它返回 is a mountpoint或 / is not a mountpoint。
is a mountpoint
/ is not a mountpoint
但它甚至可以回归:
对于 is not a mountpoint的每一个预期结果,都有一个卸载的机会。
is not a mountpoint
你可以试试通常的方法:
umount /mnt/smb_share
或强制模式:
umount /mnt/smb_share -f
但通常这种力量并不起作用,它只是返回相同的令人讨厌的 device is busy消息。
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的文档中也提到了这一点。“惰性”只应用于避免长时间的关机/重启时间:
mount /mnt/smb_share
系统重新启动将在不久的将来,如果你是 将对网络文件系统或本地文件系统使用此选项 推荐的用例 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
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。
/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
我想发表这个作为评论,但我没有足够的名声。希望免除别人的前额耳光。