將 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

相關內容