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

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

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

  4. AIX 4.3.2 のオートマウントは、明らかにどこかがへんです。

8.2. BSD

8.2.1. BSD サーバと Linux クライアント

BSD カーネルはブロックサイズを大きくしたほうが より良く動作する傾向があります。

8.2.2. Linux サーバと BSD クライアント

BSD のバージョンによっては、 サーバが非特権ポートで動作している必要があります。 この場合ボリュームをエクスポートするときに insecure オプションが必要になります。 詳細は exports(5) の man ページを。

8.3. Compaq 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 
   

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

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

この組み合わせには注意点が 2 つあります。まず、 Tru64 Unix のマウントはデフォルトで Version 3 NFS を用います。 Linux のサーバが Version 3 NFS をサポートしていないと、 マウントエラーになるでしょう。 次に、Tru64 Unix 4.x では、NFS ロックリクエストを daemon が行います。 従って Tru64 Unix 4.x クライアントにエクスポートするボリュームには、 すべて insecure_locks を指定する必要があります。 詳細は exports(5) の man ページを。

8.4. HP-UX

8.4.1. HP-UX サーバと Linux クライアント

HP-UX での /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 オプションは、 情報として示す目的だけです。いらなければ指定しなくても構いません。)

8.4.2. Linux サーバと HP-UX クライアント

HP-UX のディスクレスクライアントに対して、 デバイスファイルを正しくエクスポートするには、 少なくともカーネルのバージョン 2.2.19 (あるいは 2.2.18 にパッチを当てたもの) が必要になります。

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 カーネルでは修正されています。 とりあえず回避するには、ファイルシステムの下の階層を 別々にエクスポートしてマウントさせることです。

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

相互運用に関する事項は特にありません。

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.6.2. Solaris クライアント

Solaris のクライアントは定期的に次のようなメッセージを出します。

svc: unknown program 100227 (me 100003)
  

これは Solaris のクライアントが、マウントする際に、 ACL 情報を取得しようとするからです - もちろん Linux にはありません。 このメッセージは無視して構いません。

ディスクレスな Solaris クライアントに関しては、 2 つほど注意点があります。まず /dev/null を正しくエクスポートするには、 少なくともカーネルのバージョンが 2.2.19 でなければなりません。 次に、ディスクレスの sparc クライアントでは、 パケットサイズを非常に小さく (すなわち 1024 に) しなければなりません。 クライアントはパケットを逆に並べ換えることができないからです。 これはクライアントの /etc/bootparams で設定できます。

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
   

8.7.2. SunOS クライアント

SunOS は NFS ロックリクエストをすべて daemon として行います。 従って SunOS クライアントにエクスポートするボリュームには、 すべて insecure_locks を指定する必要があります。 詳細は exports(5) の man ページを。