Linux NFS-HOWTO | ||
---|---|---|
Prev |
あらゆる OS (Linux も含む) には、それぞれの NFS の実装に、 ちょっとした違いや癖があります。 ある場合はプロトコルが曖昧なせいだったり、 ある場合はでっかいセキュリティホールを残したままであるせいだったり、 理由はいろいろです。 Linux は、我々の知る限りでは、 メジャーなベンダの NFS 実装すべてと正しく動作します。 しかし、 2 つの OS がお互いクリアに通信しているかどうかを確認するには、 追加の作業が必要になることもあります。 このセクションではこれらの作業を細かく見ていきます。
一般的に言って、カーネル 2.2.18 よりも前の Linux マシンを、 Linux 以外のクライアントの NFS サーバとするのは、 全くおすすめできません。古いカーネルでの実装は、 クライアントとしてなら問題なく動作すると思います。 しかしこれらのカーネルで何か問題が起きた場合、 我々からできるアドバイスは、 まずカーネルをアップグレードして問題が解決するか見てみろ、です。 ユーザ空間の NFS 実装も、 Linux 以外のクライアントとはうまく動きません。
以降に、Linux をメジャーな OS といっしょに使う場合に 知られている事柄を挙げておきます。
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 |
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 |
AIX の Version 4.3.2 (おそらくはそれ以前のバージョンも) に対しては、 ファイルシステムを insecure オプションで エクスポートする必要があります。すなわち NFS を非特権ポート (つまり 1024 以上の、root 以外のユーザがバインドできるポート) で待機させます。古いバージョンの AIX では、これは必要ないようです。
AIX のクライアントは、デフォルトでは Version 3 NFS over TCP でマウントします。 Linux サーバがこれをサポートしていない場合は、 マウントのオプションに vers=2 や proto=udp を指定しなければなりません。
/etc/exports にネットマスクを使うと、 あるクライアントがリセットしたときに、 別のクライアントのマウントが切れてしまう場合があります。 これは各ホストを一つ一つリストすれば解決します。
AIX 4.3.2 の automount は、明らかにどこか変です。
BSD カーネルはブロックサイズを大きくしたほうが より良く動作する傾向があります。
BSD のバージョンによっては、 サーバが非特権ポートで動作している必要があります。 この場合ボリュームをエクスポートするときに insecure オプションが必要になります。 詳細は exports(5) の man ページを。
一般に 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 の多くのバージョンでは、このコマンドは存在しません。
この組み合わせには注意点が 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 ページを。
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 |
HP-UX のディスクレスクライアントに対して、 デバイスファイルを正しくエクスポートするには、 少なくともカーネルのバージョン 2.2.19 (あるいは 2.2.18 にパッチを当てたもの) が必要になります。 また、HP-UX クライアントへエクスポートする際には、必ず insecure_locks オプションを指定する必要があります。
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 |
報告によると、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 ファイルシステムはサポートされていません。
IRIX のバージョン 6.5.12 までには、 Linux マシンがエクスポートしたファイルシステムをマウントすると、 問題が起こりました。マウントポイントが「消えて」しまうのです。 すなわち:
# mount linux:/disk1 /mnt # cd /mnt/xyz/abc # pwd /xyz/abc |
これは IRIX のバグであることがわかっており (SGI bug 815265 - IRIX not liking file handles of less than 32 bytes)、 IRIX 6.5.13 で修正されました。 IRIX 6.5.13 にアップグレードすることが不可能な場合には、 非公式な回避方法ですが、 常に 32 ビットのファイルハンドルを用いるよう Linux の nfsd に強いるやり方もあります。
たくさんのパッチがあります。次のところを見てください。
Solaris のサーバ側の形式は、他の OS と少々異なっています。 設定ファイルには /etc/exports でなく /etc/dfs/dfstab を用います。 エントリには share コマンドを用います。 Section 3 での例に対応する書式は次のようになります。
share -o rw=slave1,slave2 -d "Master Usr" /usr |
Solaris のサーバはパケットサイズに非常に敏感です。 Linux クライアントを Solaris サーバと使う場合には、 必ずマウント時に rsize と wsize を 32768 にしてください。
最後に Solaris における root squash について述べておきます。 root はユーザ noone にマップされますが、 これはユーザ nobody とは異なります。 クライアントでファイルのパーミッションに関して問題がおきたら、 マッピングが期待通りになっているか、忘れずにチェックしてください。
Solaris のクライアントは定期的に次のようなメッセージを出します。
svc: unknown program 100227 (me 100003) |
これは Solaris のクライアントが、マウントする際に ACL 情報を取得しようとするからです - もちろん Linux にはありません。 このメッセージは無視して構いません。
ディスクレスな Solaris クライアントに関しては、 2 つほど注意点があります。まず /dev/null を正しくエクスポートするには、 少なくともカーネルのバージョンが 2.2.19 でなければなりません。 次に、ディスクレスの sparc クライアントでは、 パケットサイズを非常に小さく (すなわち 1024 に) しなければなりません。 クライアントはパケットを逆に並べ換えることができないからです。 これはクライアントの /etc/bootparams で設定できます。
SunOS には NFS Version 2 over UDP しかありません。
サーバ側では、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 オプションは情報を示す目的でのみ使われており、 いらなければ指定しなくても構いません。
SunOS は NFS ロックリクエストをすべて daemon として行います。 従って SunOS クライアントにエクスポートするボリュームには、 すべて insecure_locks を指定する必要があります。 詳細は exports(5) の man ページを。