我有一个小型本地网络,其中有一个 Gentoo 盒子和一个 Windows 盒子。我使用如下命令将源自 Windows 框的共享安装到 Gentoo 框:
mount -t cifs -o username=WindowsUsername,password=thepassword,uid=pistos //192.168.0.103/Users /mnt/windowsbox
大多数时候,一切正常,我可以毫无问题地读写。但是,每隔几周左右,连接或挂载点似乎就会死机或挂起,这样任何尝试访问挂载点的进程都会卡在 D 状态(磁盘或 I/O 等待)。这些进程变得不受 TERM 和 KILL 信号的影响。从网络断开和重新连接 Windows 盒子没有帮助。冻结状态持续 5 分钟以上。这真的很令人沮丧,并且妨碍了正常工作,因为它冻结了另存为对话框、ls
命令等。如果我umount
在挂载点上发出 a,它要么挂起,要么报告挂载点正在使用中。最终,死状态自行解决,挂载点被卸载,或者可以立即卸载umount
。
我的猜测是,当连接/挂载空闲或 Windows 机器空闲时会发生这种情况。我不太确定。
为什么会发生这种情况,我能做些什么来防止它发生?或者我怎样才能成功地随意杀死这些 D 状态进程?
可能相关:CIFS 挂载在读取时挂起
不知道为什么会出现问题,但作为一种解决方法,您是否尝试过每分钟都放置类似
touch /mnt/windowsbox/keepalive.txt
或echo "I am still alive." >/mnt/windowsbox/keepalive.txt
通过 cron 运行的东西?这样连接应该保持活跃。我也每隔几个月就会遇到这种情况。
sudo umount -l
是我的解决方法。 https://stackoverflow.com/a/96288/2097284另一个可能的答案建议通过 cron 定期写入挂载上的文件。我建议改为使用 smbclient 程序连接到共享并断开连接。
我写了一个这样的 bash 脚本来完成它:
此命令与共享建立一个新连接,然后运行 exit 命令,立即关闭它刚刚在命令行上建立的连接。服务器名称前应有 8 个斜杠,共享名称前应有 4 个斜杠,因为反斜杠需要转义,并且在双引号字符串中时需要转义转义。也许有一种更聪明的方法可以做到这一点,但这似乎确实有效。
也许有一种方法可以通过让它一次保持连接打开几分钟来使其更加可靠,但这有点超出我的范围。