8. Linux の NFS を他の OS と使う

あらゆる OS (Linux も含む) には、それぞれの NFS の実装に、 ちょっとした違いや癖があります。 ある場合はプロトコルが曖昧なせいだったり、 ある場合はでっかいセキュリティホールを残したままであるせいだったり、 理由はいろいろです。 Linux は、我々の知る限りでは、 メジャーなベンダの NFS 実装すべてと正しく動作します。 しかし、 2 つの OS がお互いクリアに通信しているかどうかを確認するには、 追加の作業が必要になることもあります。 このセクションではこれらの作業を細かく見ていきます。

一般的に言って、カーネル 2.2.18 よりも前の Linux マシンを、 Linux 以外のクライアントの NFS サーバとするのは、 全くおすすめできません。古いカーネルでの実装は、 クライアントとしてなら問題なく動作すると思います。 しかしこれらのカーネルで何か問題が起きた場合、 我々からできるアドバイスは、 まずカーネルをアップグレードして問題が解決するか見てみろ、です。 ユーザ空間の NFS 実装も、 Linux 以外のクライアントとはうまく動きません。

以降に、Linux をメジャーな OS といっしょに使う場合に 知られている事柄を挙げておきます。

8.1. AIX

8.1.1. Linux クライアントと AIX サーバ

Section 3 で用いた例に対応する /etc/exports ファイルのフォーマットは、 次のようになります。
  /usr   slave1.foo.com:slave2.foo.com,access=slave1.foo.com:slave2.foo.com
  /home  slave1.foo.com:slave2.foo.com,rw=slave1.foo.com:slave2.foo.com
    

8.1.2. AIX クライアントと Linux サーバ

AIX は /etc/fstab ではなく /etc/filesystems を用います。 Section 4 での例に対応するエントリのサンプルを 示しておきます。
/mnt/home:
        dev             = "/home"
        vfs             = nfs
        nodename        = master.foo.com
        mount           = true
        options         = bg,hard,intr,rsize=1024,wsize=1024,vers=2,proto=udp
        account         = false
  

  1. AIX の Version 4.3.2 (おそらくはそれ以前のバージョンも) に対しては、 ファイルシステムを insecure オプションで エクスポートする必要があります。すなわち NFS を非特権ポート (つまり 1024 以上の、root 以外のユーザがバインドできるポート) で待機させます。古いバージョンの AIX では、これは必要ないようです。

  2. AIX のクライアントは、デフォルトでは Version 3 NFS over TCP でマウントします。 Linux サーバがこれをサポートしていない場合は、 マウントのオプションに vers=2proto=udp を指定しなければなりません。

  3. /etc/exports にネットマスクを使うと、 あるクライアントがリセットしたときに、 別のクライアントのマウントが切れてしまう場合があります。 これは各ホストを一つ一つリストすれば解決します。

  4. AIX 4.3.2 の automount は、明らかにどこか変です。

8.2. BSD

8.3. Tru64 Unix

8.3.1. Tru64 Unix サーバと Linux クライアント

一般に Tru64 Unix サーバは Linux クライアントと 極めて良好に動作します。 Section 3 で我々が用いた例に対応する /etc/exports ファイルのフォーマットは、 次のようになります。
     
/usr         slave1.foo.com:slave2.foo.com \
     -access=slave1.foo.com:slave2.foo.com \

/home        slave1.foo.com:slave2.foo.com \
         -rw=slave1.foo.com:slave2.foo.com \
       -root=slave1.foo.com:slave2.foo.com 
   

(ここで最後のエントリにある root オプションは情報を示しているだけです。 必要なければ指定しなくても構いません。)

Tru64 は、マウント要求があるたびに /etc/exports ファイルをチェックします。 従って exportfs コマンドを起動する必要はありません。 実際 Tru64 Unix の多くのバージョンでは、このコマンドは存在しません。

8.4. HP-UX

8.5. IRIX

8.5.1. IRIX サーバと Linux クライアント

IRIX での /etc/exports のエントリの例を挙げます。
/usr -ro,access=slave1.foo.com:slave2.foo.com
/home -rw=slave1.foo.com:slave2.fo.com:root=slave1.foo.com:slave2.foo.com
  
(最後のエントリでの root オプションは、 情報を示す目的でのみ用いられています。 いらなければ指定しなくても構いません。)

報告によると、linux 2.2 ベースのシステムに nohide オプションを用いてエクスポートすると問題があるそうです。 これは 2.4 カーネルでは修正されています。 とりあえず回避するには、ファイルシステムの下の階層を 別々にエクスポートしてマウントさせることです。

カーネル 2.4.17 の時点では、相互運用上の小さな問題がまだ存在しており、 カーネルのアップグレードが必要になるかもしれません。 特記すべきことをいくつか述べておきます。

  • Trond Myklebust の seekdir (または dir) カーネルパッチを 忘れずに適用しておいてください。 最新版 (2.4.17 向け) は次の場所にあります。

    http://www.fys.uio.no/~trondmy/src/2.4.17/linux-2.4.17-seekdir.dif

  • IRIX サーバは、再起動の前後で同じ fsid 属性フィールドを用いるとは 限らないため、マウントしている IRIX サーバが再起動すると Linux クライアントで inode number mismatch というエラーになるかもしれません。 パッチは次の場所にあります。

    http://www.geocrawler.com/lists/3/SourceForge/789/0/7777454/

  • naming version=1 で作成された IRIX XFS ファイルシステムがエクスポートされたものから、 数百のファイルを保持しているような大きなディレクトリを読み出そうとすると、 Linux カーネル 2.4.9 以降では問題が起こりました。 理由は次の URL に与えられています。

    http://www.geocrawler.com/archives/3/789/2001/9/100/6531172/

    naming version は、(IRIX サーバで) 次のコマンドを用いればわかります。

    	xfs_growfs -n mount_point
         

    問題を回避するには、これらのファイルシステムのエクスポートに際して、 /etc/exports ファイルで -32bitclients オプションを指定します。 問題を修正するには、ファイルシステムを 'naming version=2' に変換します。残念ながら、これを行うには backup/mkfs/restore が唯一の方法です。

    IRIX 6.5.14 (およびそれ以降) で mkfs_xfs を行うと、 デフォルトでは naming version=2 の XFS ファイルシステムができます。 IRIX 6.5.5 から 6.5.13 の間では、次のコマンドを用いてください。
    	mkfs_xfs -n version=2 device
          

    IRIX 6.5.5 以前では、 naming version=2 の XFS ファイルシステムはサポートされていません。

8.6. Solaris

8.6.1. Solaris サーバ

Solaris のサーバ側の形式は、他の OS と少々異なっています。 設定ファイルには /etc/exports でなく /etc/dfs/dfstab を用います。 エントリには share コマンドを用います。 Section 3 での例に対応する書式は次のようになります。
share -o rw=slave1,slave2 -d "Master Usr" /usr
   
そして編集後には、exportfs の代わりに shareall を実行します。

Solaris のサーバはパケットサイズに非常に敏感です。 Linux クライアントを Solaris サーバと使う場合には、 必ずマウント時に rsizewsize を 32768 にしてください。

最後に Solaris における root squash について述べておきます。 root はユーザ noone にマップされますが、 これはユーザ nobody とは異なります。 クライアントでファイルのパーミッションに関して問題がおきたら、 マッピングが期待通りになっているか、忘れずにチェックしてください。

8.7. SunOS

SunOS には NFS Version 2 over UDP しかありません。

8.7.1. SunOS サーバ

サーバ側では、SunOS は /etc/exports ファイルの伝統的な形式を用います。 Section 3 での例は次のようになります。
/usr    -access=slave1.foo.com,slave2.foo.com
/home   -rw=slave1.foo.com,slave2.foo.com, root=slave1.foo.com,slave2.foo.com
   

ここでも、 root オプションは情報を示す目的でのみ使われており、 いらなければ指定しなくても構いません。