控制台在 /mnt/folder (CIFS) 共享自动完成时冻结

控制台在 /mnt/folder (CIFS) 共享自动完成时冻结

我有一台 Ubuntu 14.04 服务器,当您尝试使用制表符自动完成 /mnt 目录中 CIFS 共享的路径时,它会在一段不确定的时间后锁定。我挂载了共享,它似乎在一段不确定的时间内工作正常。我可以对挂载的共享中的文件夹执行 ls 或运行 du。然后我将转到制表符以显示文件夹路径,我的控制台锁定。我可以启动一个新会话,但只要我尝试弄乱挂载的共享,它就会锁定;如果我让其他用户也尝试,也会发生这种情况。我不知道为什么会发生这种情况?我从未见过这个问题。

答案1

这与 bash 完成的工作方式和 cifs 作为协议的工作方式有关。

bash 补全的工作原理如下:

  1. readline 通知 bash 当前输入的字符串和 tab 键。
  2. bash 执行深度优先搜索文件系统的根位于文件系统层次结构中最匹配的部分。此搜索的每个步骤实际上都是来自文件系统的多个请求(一个列表请求)。
  3. readline 块 - 等待 bash 的响应并显示可能的结果列表。
  4. 该列表到达后,readline 显示它,并将输入控制权返回给用户。

在块级别或本地级别或其他相当快的文件系统上,这一切都发生得非常快。

不幸的是,CIFS 不是块级文件系统。相反,CIFS 是一种基于命令的事务协议。针对 CIFS 发出的每个请求都是:

  • 交易性,需要请求、确认和确认确认,
  • 由多个单独的 CIFS/SMB 命令块表示
  • 进行身份验证

简而言之,CIFS/SMB(至少在 SMB1 中,几乎可以肯定您使用它来安装此 CIFS 共享)非常繁琐。

在通常直接使用已知文件名时,请求是单例的。您发出文件请求,CIFS 对您进行身份验证,确认您的请求,您确认他们的确认,然后您的文件就会传输。

对于制表符补全的情况,该循环会乘以特定目录中的文件数量,如果它取消引用 Windows 快捷方式,则可能乘以两倍(或更多!)。

遍布网络。

这将导致速度严重下降,因为 readline 等待 bash,而 bash 又等待文件系统驱动程序与 CIFS 服务器进行协商。

您可能希望通过执行以下操作来解决此问题,例如从内部运行会话screen,这样,如果您的 bash 会话锁定,您可以获得ctrl-A-c一个全新的终端,这样您就可以继续工作,甚至可以杀死另一个终端。

相关内容