mountしたNFSv4上のファイルに対してchownをした際の挙動


2012年 02月 27日

私は基本的にプログラマでインフラは専門ではありませんが、開発環境の構築など必要に応じてLinux/UNIXを触ることがあります。今回はその開発環境構築の際にはまったことを書いてみたいと思います。

構築内容は
  • Solaris10 が NFSv4のサーバとして、/export/home をexport
  • Debian6.0 がNFSv4クライアントとして、SolarisからexportされたディレクトリをNFSv4でマウント
という比較的シンプルなものです。
Solaris10とDebianの混成とちょっと変わっていますが、今までお客様の環境はSolaris10のみで構成されていたものを、今回一部Debianに置き換えるためにこのような構成に変更となりました。つまりこの構成は未検証というものです。

NFSは以前少しだけサーバ/クライアントともにCentOS5.xで構築したことがあり、最低限動かすだけならばそんなに難しいものではないと思っていました。ただ、今回は
  • サーバとクライアントでOSが異なる
  • そもそもDebianおよびSolaris、特にSolarisに不慣れ
  • /etc/passwd, /etc/shadow, /etc/group がLDAPを参照している
という点で不安要素がありました。

さて、実際にNFSのexport/mount を行ってみたところ問題が発生しました。
普通にNFSクライアントであるDebianから、Solarisのファイルの参照は問題なくできます。中身も見ることができます。が、なんとchownがうまくいかない現象に遭遇しました。今回環境移行とともに、既存のSolaris10で動いてた一部ツールをDebianに引越しますが、その中でchwonを実行している箇所があるため、これは問題です。ちなみにchwonを実行した際にエラー内容は

Invalid argument
です。このエラー内容には頭の中に「?」が浮かびました。実行したコマンドは

# chown [username]/[groupname] filename

で、LDAP経由で参照しているpasswd, group には存在しています。さて何が悪いのでしょうか?
この問題を解決してくれたのは同僚でした。ユーザ名、グループ名を引きに行く際、NFSv3とNFSv4とではプロトコルレイヤーで解決方法がことなることが原因ということでした。(参考のURLは失念してしまいました。すいません。)
ちなみに、そこのページにはNFSv4の仕様について記述があるのですが、「NFSは後方互換性はないよ!(超意訳)」とはっきり書かれていました。

では結局どうしたかというと、あえてNFSv4を使う必要がないためDebianでNFSをマウントする際に明示的にNFSv3のプロトコルを指定するようにしました。NFSv4とNFSv3で完全な互換性はないものの、NFSv4の実装はNFSv3の実装も持っているので大抵はこれで回避できます。
暫定ではありますがこれで問題解決。めでたしめでたし。