以前のエントリの
MPC8349E-mITX LinuxでRTCの時刻を取得する方法- nfs で マウントした/ ディレクトリに新規ファイルの作成はできるが、ファイル内容の変更ができない
の現象ですが、nfsサーバ側の問題だったようです。
nfsサーバに使用していたのは、
- OS: Ubuntu Intrepid
- Kernel: linux-2.6.27-7-server
- nfs-user-server: 2.2beta47-25
これで、MPC8349E-mITXのLinuxをnfsクライアントとしたときに
- ファイルの新規作成はOK
- 既存ファイルへの追加など既存ファイルをwriteでopenするとエラー
という現象が起こっていました。
ただ、NetBSD 3.1をnfsクライアントとして上記のnfsサーバをマウントしているときは上記問題は起こっていませんでしたので、てっきりMPC8349E-mITXのLinux側の問題と思っていました。
ふと思い立って、MPC8349E-mITXで上記Ubuntuではなく別のNFSサーバをマウントしたところ問題なくすんなり動いてしまいました。
調べてみたところ、nfsのsetattrで、mtime.utime=1000000(INVALID)とすると、nfsサーバ側ではサーバの時刻を使用するという慣例があるようだが、nfs user server 2.2beta47では単にmtime()に渡すようになっており、INVALIDエラーがそのままnfsクライアント側に返されるという実装になっています。
nfs user serverはメンテされていないようなのでnfs kernel serverを使用するようにするのが正攻法のようです。
というわけで、Ubuntuでnfs kernel serverを導入したところ、無事に問題が解決されました。
ちなみに、パケットの中身をみたところ、NetBSD 3.1ではsetattrでmtime=0xffffffff(無効値)を渡すようです。