SMB 2.0(SMB 1.0無効)を実行しているサーバーに接続すると、mount -t cifs -v <address>
を使用するとHost is Down
エラーが返されます。 mount
の引数リストにvers=2.0
を指定することです。これは、コマンドライン経由でマウントしていて、この引数を指定する機能がある場合は正常に機能します。ただし、GUIまたは代わりにmount
を呼び出しますが、この引数は指定されていません。
SMB 2.0+をすべてのmount -t cifs
呼び出しのデフォルトに設定する方法はありますか?呼び出し元が何であるかに関係なく?おそらくsmb.conf
で?
現在Arch Linuxを実行しています。
編集:min protocol = SMB2
を/etc/samba/smb.conf
に追加し、サービスを再起動しました。 mount
とsmbclient
はどちらも、サーバーに接続する前にSMBバージョンを指定する必要があります。
EDIT2:client min protocol = SMB2
およびclient max protocol = SMB3
を追加すると、smbclient
がバージョン引数を指定せずにサーバーに接続できます。ただし、mount
は、smb.conf
に新しく追加された行を考慮しません。
残念ながら、カーネルのcifs
ファイルシステムモジュールは/etc/samba/smb.conf
をまったく読みません。 Windowsファイル共有のマウントを可能にするCIFSクライアントモジュールは、Sambaから完全に分離されています。
cifs
モジュールのデフォルトのプロトコルレベルがバニラカーネルバージョン4.13でSMB3に変更され、マルチダイアレクトネゴシエーションパッチ(事実上デフォルトを「SMB2.1以降」に設定)がバニラカーネルに追加されました2017年9月。
「エンタープライズ」のLinuxディストリビューションがパッチを以前のカーネルにバックポートしたことは確かですが、Archでは、カーネルバージョン4.13以降にアップグレードするしか選択肢がありません。
kernel.org Gitの関連するパッチへのリンクです コミットIDは、特定のカーネルバージョンでパッチを追跡するのに役立つ場合があります。
この問題の調査の一環として、mount
コマンドのCIFSパラメーターを調整するスクリプトを作成しました。
#!/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