hack のためのネタ帳, etc,,,

状況

しばらく前まで、正常に cifs でマウントできていた環境だったのだが、最近になって
$ sudo mount -t cifs //HOST/USER MOUNTPOINT -o user=USER,uid=UID,gid=GID
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
みたいに cifs によるマウントに失敗するようになった。

原因

問題の環境は、
物理マシン上の Ubuntu 16.04.3 LTS に linux-image-generic-hwe-16.04-edge 入れて linux-image-4.13.0-17-generic (4.13.0-17.20~16.04.1) が入ってる状態なんだけど、
man page には vers=1.0 が default って書いてあるのに、
別のマシンの samba に vers 指定なしで繋いでみると smbstatus -p で SMB3_02 が返ってくる(mount.cifs のマニュアルと違う)。

VM 上の Ubuntu 16.04.3 LTS に linux-headers-generic-hwe-16.04 入れて linux-image-4.10.0-40-generic (4.10.0-40.44~16.04.1) が入ってる状態だと、
同様にして、
別のマシンの samba に vers 指定なしで繋いでみると smbstatus -p で NT1 が返ってくる(mount.cifs のマニュアルの通り)。

mount.cifs の md5sum は同一だし、vers のデフォルト値いじる設定ファイル等は特に文書化されてない状況だし、
mount.cifs のソースである cifs-utils 眺めて見ても
vers 処理しているように見える部分がないので、これどうも、kernel module の cifs.ko に丸投げしてるっぽい雰囲気。

ということで、Linux 4.10.0 → 4.13.0 の間で、cifs.ko 内の vers のデフォルト値に変更が加えられた線に濃厚な疑いがかかった。

で、cifs.ko のソースを捜索にかかったのだが、
それらしい物が git.kernel.org には見当たらなくて、
どうも git.samba.org / sfrench / cifs-2.6.git がそれっぽい感じ。

これを見ると、2017-09-18 にコミットされた 9764c02fcbad40001fd3f63558d918e4d519bb75 のログにデフォルト値を SMB3 に変更したみたいなことが書かれており、
fs/cifs/smb2ops.c#3133 にデフォルト値として SMB302 が設定されているのを確認できた。

で、これ、ソース追っかけてみると、
multidialect negotiation に失敗すると kernel log 吐くコードが仕込んであって、
dmesg 見てみたら、ちゃんと以下のような log が残っていた。
[   90.830618] No dialect specified on mount. Default has changed to a more secure dialect, SMB2.1 or later (e.g. SMB3), from CIFS (SMB1). To use the less secure SMB1 dialect to access old servers which do not support SMB3 (or SMB2.1) specify vers=1.0 on mount.
[   91.830752] CIFS VFS: cifs_mount failed w/return code = -112

ということで、Linux 4.10.0 → 4.13.0 の間で、cifs.ko における vers のデフォルト値が 1.0 → 3.02 になり、multidialect negotiation するようになったが、SMB1 は multidialect negotiation の対象外なので、vers=1.0 を明示してやる必要があるというのが原因だった。
もっと根本的な話としては IO-DATA HDL-XR が SMB1 にしか対応してないのが一番の問題なんだが。

あと、mount.cifs じゃなくて cifs.ko がログ吐いてるので仕方ないのかもしれないが、
mount 叩いてて、エラーメッセージは stderr に出てるのに、根本原因への対処法が別途 kernel log に出力されてるってのが地味に分かり難い。
今後、mount がおかしい時は kernel log も気にかけるようにしよう。

追記:
Linux Kernel 4.13.5 の ChangeLog 上の commit log が入ってる模様(というか、commit log にも 4.13 って書いてあった)
参考:

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます