将 SMB 2.0 设置为安装操作的默认值

将 SMB 2.0 设置为安装操作的默认值

连接到运行 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重新启动服务。两者mountsmbclient需要在连接到服务器之前指定 SMB 版本。

编辑2: 添加client min protocol = SMB2andclient 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

相关内容