SMB 2.0(SMB 1.0が無効)を実行しているサーバーに接続すると、エラーが返されますmount -t cifs -v <address>
。Host is Down
解決策はvers=2.0
パラメータリストを指定することですmount
。コマンドラインからインストールしてこのパラメータを指定できる場合、これは非常に効果的です。ただし、GUIまたはmount
ユーザーに代わって呼び出される一部のプログラムを使用する場合、このパラメーターは指定されません。
mount -t cifs
すべての通話に対してSMB 2.0+をデフォルトに設定する方法はありますか?おそらくsmb.conf
?
現在、Arch Linuxを実行しています。
編集する:サービスを追加しmin protocol = SMB2
て再起動します。/etc/samba/smb.conf
どちらもサーバーに接続する前にSMBバージョンを指定する必要がありますmount
。smbclient
編集2:バージョンパラメータを指定せずにサーバーに接続できるようにclient min protocol = SMB2
追加されました。ただし、新しく追加された行はまだ尊重されていません。client max protocol = SMB3
smbclient
mount
smb.conf
答え1
残念ながら、カーネルのファイルシステムモジュールはcifs
まったく読みません。/etc/samba/smb.conf
Windowsファイル共有マウントを可能にするCIFSクライアントモジュールは、Sambaから完全に独立しています。
ストックカーネルバージョン4.13では、モジュールのcifs
デフォルトプロトコルレベルがSMB3に変更されました。
私は「エンタープライズ」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