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文字だけで判定されていた。
(そのうち修正されるかも)