cifsマウントのオプションが間違っていた事に気が付いた

CentOS 7.3→7.4に更新した後から、cifsで接続しているNASへ繋がらなくなった。


autofs で自動マントの設定をしているものの、接続しようとすると、次のようなメッセージが出た。

# ls /mnt/nas

Broadcast message from root@xxxxxxx (Fri 2017-09-15 05:33:14 JST):

Password entry required for 'Password for root@//nas/path:' (PID 8688).
Please enter password with the systemd-tty-ask-password-agent tool!

/var/log/messages には、オプションが違う旨のログが出ていた。
(ここで、/path/credential_file はNASの認証情報を記載したファイル)

Sep 15 05:33:14 localhost kernel: CIFS: Unknown mount option "credential=/path/credential_file"


autofs や mount の man でオプションを確認しても、「credential」が無い。

これは cifs-utils のものだと思い出して、そのマニュアルを参照、
https://linux.die.net/man/8/mount.cifs

すると、「credential」が無くて、「credentials」がある。

今まで正常に動作していたのに?と思ったが、とりあえず、

autofs の設定ファイルにて、以下のようにマウントのオプションを修正したら接続できた。

 credential=/path/credential_file
  ↓
 credentials=/path/credential_file


前に使っていた「credential」というオプションで動作していた方が異常だったと思われる。
なお、CentOS 6.x では、このオプションで動作していた。(2017/9/15時点)

どういう訳か調べる事にした。

まずは、RPMソースを入手

# yumdownloader --enablerepo=base-source --source cifs-utils

展開してファイルを確認。

$ rpm -ivh cifs-utils-6.2-10.el7.src.rpm
$ cd ~/rpmbuild/SOURCES
$ ls -1
0001-asn1-fix-use-after-free-in-asn1_write.patch
0001-autoconf-Use-DEFS-when-building-idmapwb.so.patch
0001-autoconf-fix-link-of-libwbclient.patch
0001-cifs-use-krb5_kt_default-to-determine-default-keytab.patch
0001-get-setcifsacl-fix-bad-bit-shifts.patch
0002-getcifsacl-remove-some-dead-code.patch
0002-mount.cifs-on-2nd-try-mount.cifs-must-also-uppercase.patch
0003-asn1-remove-some-usused-functions.patch
0003-mtab.c-include-paths.h-for-_PATH_MOUNTED.patch
0004-data_blob-clean-out-unused-functions.patch
0004-manpage-clarify-use-of-backupuid-and-backupgid-in-mo.patch
0005-mount.cifs-fix-bad-free-of-string-returned-by-dirnam.patch
0005-mount.cifs-ignore-x-mount-options.patch
0007-aclocal-fix-typo-in-idmap.m4.patch
0008-mount.cifs-Removed-extra-comma-in-front-of-domain.patch
0009-mount.cifs-Accept-empty-domains-on-the-command-line.patch
0010-mount.cifs-Fixed-command-line-parsing-and-aligned-wi.patch
0011-mount.cifs-Remove-unneeded-stdbool-header-include.patch
0012-manpage-document-mfsymlinks-in-the-mount.cifs-man-pa.patch
cifs-utils-6.2.tar.bz2


grepで関係しそうなものを検索

$ grep -rl 'cred' ./
./0001-autoconf-Use-DEFS-when-building-idmapwb.so.patch
./0010-mount.cifs-Fixed-command-line-parsing-and-aligned-wi.patch

バージョン6.2.9の方では、パッチが0005-* までしか含まれていないので、「0010-mount~」が該当する。

該当行を表示

$ grep 'cred' ./0010-mount.cifs-Fixed-command-line-parsing-and-aligned-wi.patch
-       if (strncmp(token, "cred", 4) == 0)
+       if (strcmp(token, "cred") == 0 || /* undocumented */
+               strcmp(token, "credentials") == 0)


前のバージョンでは、

-       if (strncmp(token, "cred", 4) == 0)

のように、先頭4文字だけチェックしていた模様。

今回のバージョンでは、

+       if (strcmp(token, "cred") == 0 || /* undocumented */
+               strcmp(token, "credentials") == 0)

のように、"cred" または "credentials" の完全一致をチェックするようになっている。
但し、"cred"はドキュメント化されていない旨がコメントに書いてある。


従って、先頭4文字が一致していた「credential」という存在しないオプション名でも、動作していた事になる。

なお、これは autofs に限らず、mountコマンドで cifs をマウントする時も同じ。

まだ修正されていないCentOS 6.x で、以下を試してみた。

成功:
# mount -t cifs -o cred123=/path/credential_file //host/path /mnt

失敗:
# mount -t cifs -o cre=/path/credential_file //host/path /mnt

といったように、先頭4文字だけで判定されていた。
(そのうち修正されるかも)