centos 尝试访问使用CIFS装载的远程文件夹在断开连接时挂起

3vpjnl9f  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(353)

此问题是that question的延伸。
再一次:我在CentOS 6.0下工作,我有一个远程win7文件夹,安装有:

mount -t cifs //PC128/mnt /media/net -o "username=WORKGROUP\user,password=pwd,rw,noexec,soft,uid=user,gid=user"

当远程文件夹不可用时(例如,网络电缆被拔出),试图访问远程文件夹会锁定我正在使用的应用程序。起初,我发现QDir::exists()会导致锁定20-90秒(我仍然不知道为什么会有这样的差异),进一步,我发现任何对stat()函数的调用都会导致应用程序锁定。
我遵循了上面主题中的建议,我将QDir::exists()调用(以及稍后对stat()函数的调用)移到了另一个线程,但这并没有解决问题。当连接突然丢失时,应用程序仍然挂起。Qt跟踪显示锁在内核的某个地方:

0   __kernel_vsyscall
1   __xstat64@GLIBC_2.1               /lib/libc.so.6
2   QFSFileEnginePrivate::doStat      stat.h

我也试图检查远程共享是否仍然挂载之前,试图访问文件夹本身,但它没有帮助。方法,如:

mount | grep /media/net

显示即使没有到网络活动连接,共享文件夹仍被装载。
正在检查文件夹状态差异,例如:

stat -fc%t:%T /media/net/ != stat -fc%t:%T /media/net/..

也会挂起约20秒。
所以我有几个问题:
1.有什么办法可以更改CIFS超时吗?我确实试过找出,但似乎没有合适的参数,也没有CIFS配置。
1.如何检查远程文件夹是否仍处于装载状态且未被锁定?
1.我如何检查文件夹是否存在并且不被锁定?

e1xvtsh3

e1xvtsh31#

您的问题:“一个无法访问的网络文件系统”是一个非常著名的例子,它会触发linux挂起任务,这与僵尸进程完全不同(杀死父PID不会做任何事情)
挂起任务是指触发了系统调用的任务,该系统调用导致内核出现问题,因此系统调用永远不会返回。主要的特点是,调度程序将任务声明为“D”状态,这意味着程序处于不可中断状态。这意味着您无法停止程序:你可以触发所有的信号到任务,它不会响应。发射数百个SIGTERM/SIGKILL什么也不做!
这是我的老内核的情况:当我的nfs服务器崩溃时,我需要重新启动客户端来终止使用文件系统的任务。2我很久以前编译过它 (我的硬盘上仍然有构建树),在配置过程中我在lib/Kconfig.debug中看到了这一点:

config DETECT_HUNG_TASK
    bool "Detect Hung Tasks"
    depends on DEBUG_KERNEL
    default LOCKUP_DETECTOR
    help
      Say Y here to enable the kernel to detect "hung tasks",
      which are bugs that cause the task to be stuck in
      uninterruptible "D" state indefinitiley.

      When a hung task is detected, the kernel will print the
      current stack trace (which you should report), but the
      task will stay in uninterruptible state. If lockdep is
      enabled then all held locks will also be reported. This
      feature has negligible overhead.

它只是建议在发现时检测这种碰撞或恐慌:我没有检查最近的内核是否真的可以解决这个问题 (这似乎是你的问题),但我认为它不值得启用它。
还有第二个问题:正常情况下,检测发生在120秒后,但我也看到了一个Konfig选项:

config DEFAULT_HUNG_TASK_TIMEOUT
    int "Default timeout for hung task detection (in seconds)"
    depends on DETECT_HUNG_TASK
    default 120
    help
      This option controls the default timeout (in seconds) used
      to determine when a task has become non-responsive and should
      be considered hung.

      It can be adjusted at runtime via the kernel.hung_task_timeout_secs
      sysctl or by writing a value to
      /proc/sys/kernel/hung_task_timeout_secs.

      A timeout of 0 disables the check.  The default is two minutes.
      Keeping the default should be fine in most cases.

这也适用于内核线程:例如:在一个文件系统上创建一个循环设备。2然后使控制文件系统的用户空间程序崩溃!3你应该得到一个名字为loopX的Ktread(X通常对应于你的环回设备号)HUNGing!
网页链接:
https://unix.stackexchange.com/questions/5642/what-if-kill-9-does-not-work(看ultrasawblade写的答案)
http://www.linuxquestions.org/questions/linux-general-1/kill-a-hung-task-when-kill-9-doesn 't帮助-697305/
http://forums-web2.gentoo.org/viewtopic-t-811557-start-0.html
http://comments.gmane.org/gmane.linux.kernel/1189978
http://comments.gmane.org/gmane.linux.kernel.cifs/7674(这是一个与您的案例类似的案例)
在你的案例中有三个问题:你有答案:这可能是由于vfs linux内核层中的一个众所周知的bug!(没有CIFS超时)

7rfyedvj

7rfyedvj2#

经过多次试验和错误,我找到了一个解决方案,坚持。


# vim /etc/fstab

//192.168.1.122/myshare /mnt/share cifs username=user,password=password,_netdev 0  0

_netdev选项很重要,因为我们要挂载网络设备。如果系统遇到网络问题,客户端可能会在 Boot 过程中挂起。
https://www.redhat.com/sysadmin/samba-windows-linux

相关问题