连接到运行 SMB 2.0(禁用 SMB 1.0)的服务器时使用mount -t cifs -v <address>
返回错误。Host is Down
解决方法是指定vers=2.0
的参数列表mount
。如果您通过命令行安装并且能够指定此参数,则效果很好。但是,当使用 GUI 或某些mount
代表您调用的程序时,未指定此参数。
有没有办法让 SMB 2.0+ 成为所有mount -t cifs
调用的默认设置,无论它是什么调用?也许在smb.conf
?
目前正在运行 Arch Linux。
编辑:
添加min protocol = SMB2
并/etc/samba/smb.conf
重新启动服务。两者mount
都smbclient
需要在连接到服务器之前指定 SMB 版本。
编辑2:
添加client min protocol = SMB2
andclient max protocol = SMB3
允许smbclient
在不指定版本参数的情况下连接到服务器。但是,mount
仍然不尊重 中新添加的行smb.conf
。
答案1
不幸的是内核的文件系统模块根本cifs
不读取。/etc/samba/smb.conf
允许挂载 Windows 文件共享的 CIFS 客户端模块与 Samba 完全独立。
在普通内核版本 4.13 中,模块中的默认协议级别cifs
更改为 SMB3,并且在 2017 年 9 月向普通内核添加了多方言协商补丁(有效地将默认设置为“SMB2.1 或更高版本”)。
我非常确定“企业”Linux 发行版已将补丁向后移植到早期内核,但在 Arch 上,您唯一的选择可能是升级到内核版本 4.13 或更高版本。
以下是 kernel.org Git 中相关补丁的链接。提交 ID 可能有助于跟踪特定内核版本中的补丁。
答案2
作为研究此问题的一部分,我编写了一个脚本来调整命令的 CIFS 参数mount
。
#!/bin/bash
#
# Force SMB2.0 mount. We prefix the options list because a later explicit
# "vers=..." option overrides the one we add.
########################################################################
#
args=()
# Only consider checking options if we have a CIFS mount
[[ "$*" =~ '-t cifs' ]] && cifs=yes || cifs=
options=
for arg in "$@"
do
if [[ $next == 'options' ]]
then
# Prefix version to options string
arg="vers=2.0,$arg"
next=
fi
args+=("$arg")
# CIFS options check
if [[ $cifs == 'yes' ]]
then
[[ $arg == '-o' ]] && next=options
fi
done
logger -p user.notice -t "${0/*\/}" "intercepted $0 ${args[*]}"
exec "$0.real" "${args[@]}"
将此脚本安装为/bin/mount.sh
.然后运行这些命令
chmod a+x /bin/mount.sh
mv /bin/mount /bin/mount.real && ln -fs mount.sh /bin/mount
卸载它
test -L /bin/mount && rm -f /bin/mount && mv -f /bin/mount.real /bin/mount
rm -f /bin/mount.sh