*

NFS(version3)について調べたことをまとめ

公開日: : NFS

  1. 概要
  2. デーモンと利用するサービス
  3. 設定ファイル
  4. nfs で使うコマンド
  5. nfs独自のマウントオプション
  6. さらに詳しく

概要

 NFS(Network File System)は、UNIX系OSで標準的なファイル共有の仕組み。NFSにはバージョン2、バージョン3、バージョン4があるが、バージョン3について記述する。バージョン4からNFSの構造が大きく変更されたとのこと。
 NFSでは、クライアント・サーバ形式でUNIXのファイル共有サービスを提供する。NFSサーバは特定のディレクトリをNFSクライアントに公開(エクスポート)し、NFSクライアントはエクスポートされたディレクトリをマウントして利用する。

デーモンと利用するサービス

  • nfsd : サーバサービス
  • mountd : サーバサービス
  • portmap : 利用するサービス。ユーザー、グループ

設定ファイル

 NFSサーバでエクスポート(公開)するディレクトリの設定は、/etc/exportsファイルに記述する。

export host1(options1) host2(options2) host3(options3,option4)
 optionは省略可能
  • export : エクスポートされるディレクトリ
  • host : エクスポートの共有先となるホスト、またはネットワーク
  • options : host のために使用するマウントオプション

 /etc/exportsファイルでは、エクスポートするディレクトリごとに設定を行う。アクセスを許可するホストやネットワークを複数指定する場合は空白で区切り、並べて記述する。
 host を指定せずマウントオプションのみ指定した場合にはすべてのホストにマウントオプションが適用される。その場合は「*(ro)」のようにすべてのホストを「*」で指定することが推奨される。
 option を指定せずhost のみ指定した場合はデフォルトの設定が適用される

マウントオプションの種類
マウントオプション 説明
ro 読み取り専用でマウントする(デフォルト)
rw 書き込み可能でマウントする
sync 同期書き込みを行う(デフォルト)
async 非同期書き込みを行う
root_squash rootユーザーのアクセスは匿名ユーザー(nfsnobodyなど)にマッピングされる。(デフォルト)クライアント側のrootがサーバにアクセスした際にサーバ側でもrootとしてログインするのはセキュリティ上望ましくないため
no_root_squash rootユーザーのアクセスは匿名ユーザーにマッピングされずroot権限が行使される
all_squash すべてのユーザーアクセスは匿名ユーザーにマッピングされる
 /home/john 192.168.30.20(rw) *(ro)

nfs で使うコマンド

キーワード
  • exportfs
  • showmount
  • mount
  • nfsstat
exportfs [option]
 []は省略可能、<>内は必須。

 nfsサービスが開始すると、/usr/sbin/exportfsコマンドが発動して /etc/exportsファイルを読み込み、マウントプロセスのために制御を rpc.mountd(バージョン2とバージョン3の場合)とその後にrpc.nfsdに渡す。この時点に初めてファイルシステムをリモートユーザーが使用可能になる。
 適切なオプションが与えられると、/usr/sbin/exportfsコマンドはエクスポートしたファイルシステムを/var/lib/nfs/xtabに書き込む。rpc.mountdはファイルシステムへのアクセス権限を決定する際にxtabファイルを参照するため、エクスポートしたファイルシステム一覧への変更はすぐに反映される。

exportfs のoption
option 説明
-r /etc/exports 内に一覧表示してあるすべてのディレクトリから、/etc/lib/nfs/xtab 内に新しいエクスポート一覧を構成することにより、それらのディレクトリがエクスポートされることになる。結果的にこのオプションが/etc/exports内のいずれかの変更でエクスポート一覧をリフレッシュすることになる
-a /usr/sbin/exportfs に渡されるほかのオプションに応じて、すべてのディレクトリがエクスポートされるか、またはされないかになる。ほかのオプションが指定されない場合は、/usr/sbin/exportfsは/etc/exports内に指定してあるすべてのファイルシステムをエクスポートする
-o file-system /etc/exports内に一覧表示されていないディレクトリを指定する。/etc/exportsに書き込む前にテストするために使用する
-i /etc/exportsを無視する。コマンドラインで指定されたオプションのみがエクスポート用のファイルシステムの定義に使用される
-u すべての共有ディレクトリをエクスポートしない。コマンド/usr/sbin/exportfs -ua は、すべてのNFSデーモンを稼動状態にしながら、NFSファイル共有を保留にする。NFS共有を再度有効にするには、exportfs -r を使用する
-v 詳細表示
showmount [option]
 []は省略可能、<>内は必須。

 ホスト上のNFSサーバの情報を表示する。デフォルトでは、そのホストのNFSファイルシステムをマウントしているすべてのクライアントのホスト名を表示する。

  • -a : 形式を指定してすべてのマウントポイントを表示する「host:ディレクトリ」
  • -d : クライアントのホスト名の変わりに、マウントポイントのディレクトリパスを表示する
  • -e host : 指定したhostがエクスポートしているディレクトリを表示する
nfsstat [option]
 []は省略可能、<>内は必須。

 NFSサーバとクライアントの統計情報を表示するコマンド

option
option 説明
-s サーバの統計情報
-c クライアントの統計情報
-n NFSの統計情報のみ表示
-r RPCの統計情報のみ表示
-m ファイルシステムごとのネットワーク統計情報を表示
 nfsstat -c

Client rpc:
Connection oriented:
calls    badcalls  badxids  timeouts newcreds  badverfs   timers     
1595799  1511      59       297      0         0          0          
cantconn nomem     interrupts 
1198      0         7          
Connectionless:
calls    badcalls  retrans  badxids  timeouts  newcreds   badverfs   
80785    3135      25029    193      9543      0          0          
timers   nomem     cantsend   
17399    0         0          

Client nfs:
calls    badcalls  clgets   cltoomany  
1640097  3112      1640097  0          
Version 2: (46366 calls)
null     getattr   setattr  root     lookup     readlink  read       
0 0%     6589 14%  2202 4%  0 0%     11506 24%  0 0%      7654 16%   
wrcache  write     create   remove   rename     link      symlink    
0 0%     13297 28% 1081 2%  0 0%     0 0%       0 0%      0 0%       
mkdir    rmdir     readdir  statfs     
24 0%    0 0%      906 1%   3107 6%    
Version 3: (1585571 calls)
null    getattr    setattr  lookup     access     readlink  read     
0 0%    508406 32% 10209 0% 263441 16% 400845 25% 3065 0%  117959 7%
write    create     mkdir    symlink    mknod    remove   rmdir 
69201 4% 7615 0%    42 0%    16 0%      0 0%     7875 0%  51 0%      
rename   link       readdir  readdir+   fsstat   fsinfo   pathconf   
929 0%   597 0%     3986 0%  185145 11% 942 0%   300 0%   583 0%     
commit     
4364 0%    
 
Client nfs_acl:
Version 2: (3105 calls)
null       getacl     setacl     getattr    access     
0 0%       0 0%       0 0%       3105 100%  0 0%       
Version 3: (5055 calls)
null       getacl     setacl     
0 0%       5055 100%  0 0% 

 nfsstat -c コマンドの出力とその説明
calls :
 送信された合計呼び出し数
badcalls :
 RPCによって拒否された合計呼び出し数
retrans :
 再伝送の合計数。このクライアントの場合、再伝送数は1%未満(6888回の呼び出しのうち、10回程度のタイムアウト)再伝送は1知事的な以上により発生する可能性がある。1%以上の再伝送率の場合は、問題が発生している可能性がある
badxid :
 1つのNFS要求に対して重複する承認を受信した回数
wait :
 利用可能なクライアントハンドルがないため呼び出しが待機した回数
timeout :
 タイムアウトした呼び出しの回数
newcred :
 認証情報を書き換えなければならなかった回数
timers :
 タイムアウト値が、呼び出しに対して指定されたタイムアウト値以上であった回数
readlink :
 シンボリックリンクに対して読み取りが行われた回数。この値が大きい(10%を超える)場合は、シンボリックリンクが多すぎる可能性がある

nfs独自のマウントオプション

 mount -t nfs -o [option] host:/wnqs/pub /mnt
 mount -t nfs -o [option1,option2] host:/wnqs/pub /mnt
option
option 説明
nolock NFSロックを向こうか(ロックをサポートしていないふるいNFS用)
bg 最初のNFSマウントがタイムアウトになったときにバックグラウンドでマウントを継続
fg 最初のNFSマウントがタイムアウトになったときにフォアグラウンドでマウントを継続
soft サーバにクライアントのアクセス要求が届かなくなると一定期間リトライした後、タイムアウトする
hard サーバにクライアントのアクセス要求が届かなくなると応答があるまでリトライを続ける。サーバがクラッシュした場合、ファイルにアクセスしているプログラムはハングしてしまう。intrを同時に指定しておけば、プロセスを「intrrupt」「kill」できる。通常はhardが推奨でintrが必須
retry= NFSマウントの試行を中止するまでの時間を分単位で指定する
intr ハードマウント時に割り込みを受け付ける。
rsize= 読み取りのバッファサイズをバイト単位で指定
wsize= 書き込みのバッファサイズをバイト単位で指定

/etc/init.d/netfs クライアントマシン起動時に自動的にマウントする場合はこのファイルを参照する様子

さらに詳しく

http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/ch-nfs.html
にくわしく解説してあったので、要約してみる。

NFSで利用するプロトコル

 NFSはバージョン2(v2)、バージョン3(v3)、バージョン4(v4)があり、TCPのみで動くのはv4で、TCPでもUDPでも動作するのはv2とv3になる。UDPを使用した場合、クライアントが共有ボリュームへのアクセス認証を得た後でNFSサーバがクライアントにクッキーを送信するので、通常の状態ではステートレスUDP接続は最低限の通信で行うことができる。トラフィックが少ない。しかし、サーバが不意に障害を起こした場合、UDPクライアントはサーバへの要求を送り続けるためネットワークに負荷をかけてしまう。→マウントオプション

NFSのアクセス制限

 NFSは、クライアントシステムが共有NFSリソースをマウントするときのみ、認証を実行する。NFSサービスへのアクセスを制限するにはTCPラッパーを利用する。*

Centosのmanコマンドで exports を引いたときの「ユーザーIDのマッピング」のところをコピペ
ユーザ ID のマッピング
サーバマシン上のファイルに対する nfsd によるアクセスコントロールは、それぞれの NFS RPC request の際に
与えられる uidgid に基づいている。ユーザは通常、サーバ上にある自分のファイルには、それが普通の フ
ァ イルシステム上にあるのと同様にアクセス可能であることを期待している。これにはクライアントとサーバ上
で用いられる uidgid がそれぞれ同じである必要があるが、これは常に真であるとは限らず、望ましいと も
限らない。

クライアントマシンの root が NFS サーバのファイルにアクセスするとき、サーバの root として扱われてしま
限らない。

クライアントマシンの root が NFS サーバのファイルにアクセスするとき、サーバの root として扱われてしま
うのは、ほとんどの場合は望ましくない。このため uid 0 は普通は別の id (anonymous や nobody uid) にマッ
ピングされる。この動作は ‘root squashing’ と呼ばれるが、これがデフォルトである。 no_root_squash を使
えばオフにできる。

デフォルトでは、 nfsd は起動時に password ファイル中の nobody ユーザを参照して、 anonymous の uid
gid を得ようとする。もしそれが見つからない場合には、 uidgid として -2 (つまり 65534) を用いる。こ

デフォルトでは、 nfsd は起動時に password ファイル中の nobody ユーザを参照して、 anonymous の uid
gid を得ようとする。もしそれが見つからない場合には、 uidgid として -2 (つまり 65534) を用いる。こ
れらの数値は anonuid と anongid オプションによって変更できる。

これに加え、 nfsd によって nobody に割り当てるべき適当な uidgid とを指定することもできる。最後 に
、 all_squash オプションを指定すれば、全ての user request を anonymous uid に割り当てることもできる。

マシンごとに uid が異なるような場合への導入を容易にするため、 nfsd ではサーバの uid をクライアント の
uid に (あるいはその逆に) 動的にマッピングする手法をいくつか提供している。静的なマッピングファイル
、NIS ベースのマッピング、 ugidd ベースのマッピング、である。

ugidd ベースのマッピングは map_daemon オプションを指定して Ugid RPC プロトコルを使えば可能となる。 こ
のプロトコルを動かすにはクライアントで ugidd(8) mapping デーモンを動作させる必要がある。これは 3 つあ
る方法の中で、セキュリティ的には最悪である。なぜなら ugidd を動作させると、誰でもクライアントに問い合
わせて、有効なユーザ名のリストを入手できてしまうからである。 ugidd へのアクセスを特定のホストのみに制
限して、身を守ることもできる。これには許可するホストのリストを hosts.allow または hosts.deny ファイル
に 記述すればよい。サービス名は ugidd である。これらのファイルの文法については、 hosts_access(5) を参
照してほしい。

静的なマッピングは map_static オプションによって動作させることができる。このオプションは、マッピン グ
を 記述したファイルの名前を引数にとる。 NIS ベースのマッピングは、クライアントの NIS サーバに問い合わ
せて、サーバーホストでのユーザ名およびグループ名からクライアントでのユーザ名およびグループ名への、 マ
ッピング情報を入手する。

 
 
 
 

 

参考・引用

http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-rg-ja-4/ch-nfs.html
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s1-nfs-server-export.html
http://www.nxmnpg.com/ja/5/exports
http://www.nxmnpg.com/ja/8/showmount
http://www.nxmnpg.com/ja/1/nfsstat
http://docs.oracle.com/cd/E19253-01/819-0381/6n2qghim8/index.html

admax_area



関連記事

記事はありませんでした

admax_area



Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

admax_area



PAGE TOP ↑