連接到執行 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