LANDISK HACKING DIARY
Since2005/8/17
TOPへ戻る
     INDEX
   
1. NFSサーバの構築
2. クライアントからアクセスする
3. /etc/fstab に記述する
4. Permission denied で書込み権限がない場合
5. autofs による NFSファイルシステムへのオートマウント
6. 参考文献




 
     NFSサーバの構築
 
LANDISKにNFSサーバーを立ててみる。いままではLinux搭載マシンは1台しかなかったのでほとんど使うことはなかったが、2台になったことでファイル共有も便利になるかもしれないという安易な考えの元にインストールしてみることにする。しかし、実のところ、NFS にはあまり必要性を感じていないのも事実。smbmount でも共有は可能なわけで、余計なサービスを立ち上げることになる分、セキュリティも下がるのでインストールするメリットもさほど感じられない。だが、自宅サーバーにおいては、LAN内に敵などいないのだから、NFSが開くポートを全てFirewall やルータで塞いでおけばとりあえずは問題ない(もっとも、ここを見ている方ならば必要なポートだけ開けているはずだが)。また、NFS+Samba を組み合わせた場合(つまり、export されたディレクトリをsamba で共有をかける)、Linux←→Linux ←→Windows という芸術的なファイル共有の連携が可能になるので、便利なことこの上ない。基幹サーバーを乗っ取られた時、それはもうNFSのセキュリティどうこうの問題ではなくもう諦めるしかないだろう(笑)。因みに、ユーザ管理が可能な NIS も同時に立てたいところだが、NISを起動させるだけでメモリを10MB以上くってしまうのでLANDISK上にインストールするのはちょっとかわいそう。かといって、別サーバにNISを立てても返って管理が面倒になりそうなのでなので今回は却下とする。

apt-get で nfs-kernel-server をインストールする。nfs-common と portmap も同時にインストールされる。調べていたら、nfs-user-server というものもあるようだが、どうも不具合も多そうなので、その拡張版としての nfs-kernel-server をインストールした。

landisk:~# apt-get install nfs-kernel-server


/etc/exports を編集する。これがないことには、nfs-kernel-server も起動しない。以下の例では、「172.16.50.0/27 のネットワークに対して /export/home を 読み書きできるようにする。また、root ユーザによるファイル要求は、 すべてサーバ上では nobody ユーザによってなされたものとして扱われる」という意味になっている。以下の設定では、LAN内にあるマシン全てを信用することを前提としているので、そのような環境にない場合は、アクセスを許可するマシンを限定したり、root_squash に変更する必要がある。no_root_squash はセキュリティ上、お勧めできるオプションではなくて、LinuxJF NFS HOW-TO でも推奨していない。よく読んでおいてもらいたい。

landisk:~# mkdir /export/home
landisk:~# vi /etc/exports
/export/home        172.16.50.0/255.255.255.224(rw,no_root_squash)

次に、TCP Wrapper でアクセスできるサービス、ホストを制御する。ローカルネットワーク以外の全てのネットワークからこれらのサービスへのアクセスを禁止するようにしておく。

landisk:~# vi /etc/hosts.allow
portmap :       172.16.50.0/255.255.255.224
lockd   :       172.16.50.0/255.255.255.224
mountd  :       172.16.50.0/255.255.255.224
rquotad :       172.16.50.0/255.255.255.224
statd   :       172.16.50.0/255.255.255.224

landisk:~# vi /etc/hosts.deny
portmap :       ALL
lockd   :       ALL
mountd  :       ALL
rquotad :       ALL
statd   :       ALL

記述し終えたら、設定変更を知らせるコマンドをうちこむ。nfs-kernel-server の起動でも構わない。

landisk:~# exportfs -ra
or
landisk:~# /etc/init.d/nfs-kernel-server start

設定を確認する。-e は、ディレクトリを共有可能な相手を表示する。-a は、全てのマウントポイントを表示する。-d は、共有しているディレクトリ名のみ表示する。rpcinfo 実行時に、portmapper, nfs, mountd が表示されれば正常に動作しています。vers の項目には、各サービスのバージョンが表示されており、どうやら SH4用の nfs はバージョン3 には対応していないようです。NFSもバージョン4の時代だというのに。しかも、オンリーUDP。

landisk:~# showmount -e
Export list for landisk:
/export/home 172.16.50.0/255.255.255.224

landisk:~# rpcinfo -p localhost
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 691 status
100024 1 tcp 694 status
100003 2 udp 2049 nfs
100021 1 udp 1035 nlockmgr
100021 3 udp 1035 nlockmgr
100005 1 udp 738 mountd
100005 1 tcp 741 mountd
100005 2 udp 738 mountd
100005 2 tcp 741 mountd



 
     クライアントからアクセスする
 
クライアントにもNFSクライアントをインストールする。 とりあえず、portmap だけインストールすればOK。

# apt-get install portmap

portmap を起動する。111ポート(rpcbind , or sunrpc)が開いたか確認する。

# /etc/init.d/portmap start
# netstat -an | grep -i 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

いざ、mount。なにも表示されなければ成功です。マウントしたディレクトリへ移動し、ファイルの読み書きができるか試してみよう。エラーが表示された場合は…とりあえず、ここを見ておきましょう。NFSは、一旦ハマリ始めたらとことんハマルので根気よく行きましょう。特に、「mount : RPC : Unable to receive; errno=Connection refused」のエラーがでた場合は、/etc/hosts.allow もしくは、/etc/hosts.deny の記述に原因があることも少なくないのでもう一度良く確認しておくこと。

# mount -t nfs -o rw landisk:/export/home /export/client/
# cd /export/client ; ls

NFS の mount に成功すると、クライアント側で 32774/tcp ポートが開く。だが、必ずしも 32774 というわけではなく、この周辺のポートが開くようになる。

# nmap 172.16.50.8

PORT STATE SERVICE
22/tcp open ssh
111/tcp open rpcbind
113/tcp open auth
32774/tcp open sometimes-rpc11

⇒NFS クライアントの設定



 
     /etc/fstab に記述する
 
クラアイントマシンは、システム起動時に自動で NFS共有にマウントするように、/etc/fstab に以下のように記述しておく。dump スイッチと fsck 指定(最後の0)は、両方とも 0 にしておく。hard オプションをつけることで、NFSサーバがクラッシュし、復活した際に、クライアント側でも自動でマウントを再開してくれるようになる。また、ファイルシステムの破壊も防いでくれる。

# vi /etc/fstab
landisk:/export/home /export/client nfs   rw,hard,intr 0       0



 
     Permission denied で書込み権限がない場合
 
書込み権限がない場合は、以下の項目をチェックする。rw になっていることを確認する。

■サーバー側

landisk:~# cat /proc/fs/nfs/exports
# Version 1.1
# Path Client(Flags) # IPs
/export/home ns1.kororo.jp(rw,no_root_squash,sync,wdelay) # 172.16.50.2
/export/home ns3.kororo.jp(rw,no_root_squash,sync,wdelay) # 172.16.50.8

■クライアント側

# cat /proc/mounts
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
172.16.50.30:/export/home /export/client nfs rw,v2,rsize=8192,wsize=8192,hard,intr,udp,lock,addr=172.16.50.30 0 0


その他には、root でない場合に、書込みができないのは、サーバー側とクライアント側で、UID及びGIDが異なっている可能性があります。UID と GID はサーバー/クライアントで同期させなければならず、そんな面倒なことができないという場合には、NIS や NIS+ などのユーザ名の同期を行うソフトウェアを導入する必要がある。



 
     autofs による NFSファイルシステムへのオートマウント
 
autofs は ファイルシステムへのマウントを自動で行ってくれるソフトウェアのことです。CD-ROMや、Floppyへアクセスする際には、mount -t iso9660 なんちゃらと長ったらしいコマンドを打ち込まなければいけませんが、autofs ならば、そのディレクトリへアクセスするだけで自動的にマウント/アンマウント してくれるようになる。まず、autofs をインストールする。

# apt-get -s install autofs

設定ファイルは、/etc/auto.master と /etc/auto.misc がある。まず、/etc/auto.master を以下のように編集する。/var/autofs/misc というのは後述する/etc/auto.misc で指定する任意のマウントポイント先になる。--timeout は自動的にアンマウントする秒数を指定する。デフォルトは5分(?)かな。

# vi /etc/auto.master
/var/autofs/misc            /etc/auto.misc  --timeout=60

次に、参照先のファイルとしての/etc/auto.master を以下のように編集する。場合によっては、既にexample が記述されているのでそれを参考にして随時コメントアウトすればよい。NFS の自動マウントの設定は2行目。セキュリティ面として、nosuid オプションをつけて、クライアントマシンがサーバーマシンを過度に信用し過ぎないように設定する。これによって、サーバー上のroot がクライアント上のroot 権限を奪取するということができなくなります。

# vi /etc/auto.misc
cd              -fstype=iso9660,ro,nosuid,nodev         :/dev/cdrom
landisk         -fstype=nfs,rw,hard,intr,nosuid         172.16.50.30:/export/home
floppy          -fstype=auto                            :/dev/fd0

autofs を再起動する。

# /etc/init.d/autofs restart

実際にNFSのマウント先までアクセスする場合には、/var/autofs/misc/landisk まで行くことになるのでシンボリックリンクを張っておく(auto.master ファイルでPATHを短くしてもいい)。

# ls /var/autofs/misc/landisk
# ln -s /var/autofs/misc/landisk /export/home
# ln -sf /var/autofs/misc/cd /dev/cdrom

実際に自動でアンマウントされるか確認してみる。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda7             456M  298M  144M  68% /
tmpfs                 252M     0  252M   0% /dev/shm
/dev/hda6              89M  9.2M   75M  11% /boot
/dev/hda10            897M   12M  886M   2% /home
/dev/hda8             1.8G  340M  1.4G  20% /usr
/dev/hda9             897M  124M  774M  14% /var

# ls /export/home
lrwxrwxrwx  1 root root 24 2005-09-14 10:05 /export/home -> /var/autofs/misc/landisk/

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda7             456M  298M  144M  68% /
tmpfs                 252M     0  252M   0% /dev/shm
/dev/hda6              89M  9.2M   75M  11% /boot
/dev/hda10            897M   12M  886M   2% /home
/dev/hda8             1.8G  340M  1.4G  20% /usr
/dev/hda9             897M  124M  774M  14% /var
172.16.50.30:/export/home
                      229G   80G  138G  37% /var/autofs/misc/landisk



 
     参考文献
 
LinuxJF NFS HOW-TO
NFS(Network File System)の設定





TOPへ戻る
 
Copyright © KORO All Rights Reserved.