「NFS」の版間の差分
細 (1版 をインポートしました) |
|
(相違点なし)
|
2015年1月6日 (火) 21:37時点における版
関連記事
Wikipedia より:
- Network File System (NFS) はローカルストレージにアクセスするのと同じようにネットワーク上のファイルにクライアントコンピュータでアクセスできるようにする分散ファイルシステムおよびそのプロトコルである。1984年に Sun Microsystems によって開発された。
インストール
クライアントとサーバーどちらでも必要なのは nfs-utils パッケージのインストールだけです。
設定
サーバー
ID マッピング
/etc/idmapd.conf
を編集して Domain
を設定してください。
/etc/idmapd.conf
[General] Verbosity = 1 Pipefs-Directory = /var/lib/nfs/rpc_pipefs Domain = atomic [Mapping] Nobody-User = nobody Nobody-Group = nobody
固定ポート
デフォルトでは、NFSv3 による rpc.statd
や lockd
の制御にはランダムな一時的なポートが使われます。ファイアウォールを通して NFSv3 の制御ができるようにするには固定ポートを定義する必要があります。/etc/conf.d/nfs-common.conf
を編集して STATD_OPTS を設定してください:
/etc/conf.d/nfs-common.conf
STATD_OPTS="-p 32765 -o 32766 -T 32803"
rpc.mountd
は /etc/services
を読み込んで通常の状態では同じ固定ポート 2048 に bind されます。しかしながら、明示的に定義する必要があるときは /etc/conf.d/nfs-server.conf
を編集して MOUNTD_OPTS を設定してください:
/etc/conf.d/nfs-server.conf
MOUNTD_OPTS="-p 20048"
これらの変更を加えたら、複数のサービスを再起動してください。最初に設定オプションを /run/sysconfig/nfs-utils
(参照: /usr/lib/systemd/scripts/nfs-utils_env.sh
) に書き出して、二番目に新しいポートで rpc.statd
を再起動し、最後に新しいポートで lockd (カーネルモジュール) をリロードします。
# systemctl restart nfs-config # systemctl restart rpc-statd # systemctl restart nfs-server
再起動後、サーバーで rpcinfo -p
を使って固定ポートが思い通りにいってるか確認してください。クライアントから rpcinfo -p <server IP>
を使えば本当に同じ固定ポートを使っているか明らかになります。
任意のサーバー設定
/etc/conf.d/nfs-server.conf
には rpc.nfsd, rpc.mountd, rpc.svcgssd のオプションを任意で記述します。シンプルな設定をする場合はこのファイルを編集する必要はありません。
ファイルシステム
/etc/exports
に NFS ルートの相対パスで NFS 共有を定義します。この例では、NFS ルートは /srv/nfs4
とし、/mnt/music
を共有させます。
# mkdir -p /srv/nfs4/music
クライアントが書き込めるように music ディレクトリには読み書きの権限を設定しておきます。
そして実際の対象の共有である /mnt/music
を NFS 共有に mount コマンドでマウントします:
# mount --bind /mnt/music /srv/nfs4/music
サーバーを再起動してもマウントされるように、bind マウントを fstab
に追加:
/etc/fstab
/mnt/music /srv/nfs4/music none bind 0 0
エクスポート
共有するディレクトリと、マウントを許可するクライアントマシンの ip アドレスまたはホスト名を exports
に追加します:
/etc/exports
/srv/nfs4/ 192.168.1.0/24(rw,fsid=root,no_subtree_check) /srv/nfs4/music 192.168.1.0/24(rw,no_subtree_check,nohide) # note the nohide option which is applied to mounted directories on the file system.
共有をサブネット全体で開く必要はありません。単一の IP アドレスまたはホスト名だけを指定することも可能です。
利用可能なオプションについての詳細は man 5 exports
を見て下さい。
# exportfs -rav
NFSv2 との互換性
NFSv2 を使用するクライアント (例えば U-Boot) のサポートが必要な場合、/etc/conf.d/nfs-server.conf
に NFSD_OPTS="-V 2"
を設定してください。
サーバーを起動する
systemd を使って nfs-server.service
を起動して下さい。また、サービスを有効にして起動時に systemd がサーバーを起動すように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは systemd によって自動的に起動されます。
ファイアウォール設定
ファイアウォールを通過してアクセスできるようにするには、デフォルト設定の場合 tcp と udp のポート 111, 2049, 20048 を開放する必要があります。rpcinfo -p
を使ってサーバーで使用しているポートを確認してください。この設定を iptables でするには、/etc/iptables/iptables.rules
を編集して以下の行を含めるようにしてください:
/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT -A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT -A INPUT -p tcp -m tcp --dport 20048 -j ACCEPT -A INPUT -p udp -m udp --dport 111 -j ACCEPT -A INPUT -p udp -m udp --dport 2049 -j ACCEPT -A INPUT -p udp -m udp --dport 20048 -j ACCEPT
NFSv3 と、上記の rpc.statd
や lockd
の固定ポートを使用している場合は、それらも設定に追加してください:
/etc/iptables/iptables.rules
-A INPUT -p tcp -m tcp --dport 32765 -j ACCEPT -A INPUT -p tcp -m tcp --dport 32803 -j ACCEPT -A INPUT -p udp -m udp --dport 32765 -j ACCEPT -A INPUT -p udp -m udp --dport 32803 -j ACCEPT
変更を適用するために、iptables
サービスを再起動してください。
クライアント
systemd を使って rpcbind.service
と nfs-client.target
を起動して下さい。また、サービスを有効にして起動時に systemd がクライアントを起動するように設定することも推奨されています。このユニットは他のサービスも必要としますが、それらは systemd によって自動的に起動されます。
3.12.7-2 以前のカーネルバージョン (例えば現在の linux-lts) のクライアントは rpc-gssd.service
を起動しなくてはなりません。そうしないとカーネルバグによって約15秒の遅延が発生して dmesg に "RPC: AUTH_GSS upcall timed out" というエラーが表示されます。
または Red Hat の Bugzilla に書かれているように rpcsec_gss_krb5
をブラックリストに入れます。
# echo "blacklist rpcsec_gss_krb5" > /etc/modprobe.d/rpcsec_gss_krb5-blacklist.conf # reboot
Linux からマウントする
サーバーのエクスポートされたファイルシステムを表示:
$ showmount -e servername
次にサーバーの NFS エクスポートルートは省略してマウント:
# mount -t nfs servername:/music /mountpoint/on/client
マウントが失敗する場合はサーバーのエクスポートルートを含めて見て下さい (Debian/RHEL/SLES では必須、ディストリビューションによっては -t nfs
ではなく -t nfs4
):
# mount -t nfs servername:/full/path/to/music /mountpoint/on/client
/etc/fstab を使う
クライアントを立ち上げたときにいつでも NFS 共有が使えるように、常に稼働させているサーバーでは fstab を利用すると便利です。/etc/fstab
ファイルを編集して、設定に合わせて適切な行を追加してください。また、サーバーの NFS エクスポートルートは省略します。
/etc/fstab
servername:/music /mountpoint/on/client nfs4 rsize=8192,wsize=8192,timeo=14,_netdev 0 0
マウントオプションの説明は以下の通り:
- rsize と wsize
rsize
はサーバーから読み込むときに使用されるバイト数の値です。wsize
はサーバーに書き込むときのバイト数の値です。どちらもデフォルトは 1024 ですが、8192 などと値を高く設定することでスループットを改善できます。この値は汎用ではありません。値を変更した後にテストを行うことを推奨します、#パフォーマンスチューニング を見て下さい。
- timeo
timeo
は RPC タイムアウトの後に再送信を行うまで待機する時間の値です (10分の1秒単位)。最初にタイムアウトした後、再試行する度にタイムアウトの値は2倍になっていき、最大60秒になるか正式なタイムアウトになります。遅いサーバーやトラフィックの多いネットワークに接続する場合、このタイムアウトの値を増やすことでパフォーマンスが改善されるかもしれません。
- _netdev
_netdev
オプションは共有をマウントする前にネットワークが立ち上がるまで待機するようシステムに通知するオプションです。systemd は NFS がこのオプションを使うことを想定していますが、どんな形式のネットワークファイルシステムであれ、このオプションを使うことはグッドプラクティスと言えます。
- minorversion
- NFS バージョン 4.1 の Windows Server 2012 (Essentials) の共有をマウントするときは
minorversion=1
を使います。
systemd で /etc/fstab を使う
systemd の automount
サービスを使う方法もあります。接続が遮断されたり、復帰した時に素早くネットワークデバイスを再マウントするため、_netdev
よりも好ましいと思われます。さらに、autofs の問題も解決します、下の例を見て下さい:
/etc/fstab
servername :/home /mountpoint/on/client nfs users,noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=14,soft,intr,noatime 0 0
autofs を使う
複数のマシンを NFS で接続したい場合は autofs を使うのが便利です。サーバーだけでなくクライアントにもなることができます。他の簡単な方法よりもこの方法が推奨される理由は、サーバーの電源が落とされた時に、クライアントがNFS 共有を見つけられないことについてエラーを投げないからです。詳しくは autofs#NFS network mounts を見て下さい。
Windows からマウントする
"Client for NFS" サービスが有効になっていれば Windows から NFS 共有をマウントできます (デフォルトでは有効になっていません)。 サービスをインストールするにはコントロールパネルの "Programs and features" から "Turn Windows features on or off" をクリックしてください。"Services for NFS" と副サービス ("Administrative tools" と "Client for NFS") を両方有効にします。
"Services for Network File System" (検索ボックスで探して下さい) を開いて client > properties を右クリックすることでグローバルオプションを設定できます。
エクスプローラーを使って共有をマウントするには:
Computer
> Map network drive
> servername:/srv/nfs4/music
OS X からマウントする
insecure
フラグを使って共有をエクスポートし、Finder でマウントする:
Go
> Connect to Server
> nfs://servername/
またはターミナルでセキュアなポートを使って共有をマウント:
# mount -t nfs -o resvport,nolocks,locallocks servername:/srv/nfs4 /Volumes/servername
nolocks
と locallocks
オプションを使う理由については https://blogs.oracle.com/jag/entry/nfs_on_snow_leopard を見て下さい。
Tips and tricks
パフォーマンスチューニング
NFS を使い倒すつもりならば、ネットワーク設定の要件を満たすように rsize
や wsize
マウントオプションを調整してするのが必須になります。
自動マウントの処理
ローカルのワイヤレスネットワークから nfs 共有を使う必要があるノートパソコンでこの設定は役に立ちます。nfs ホストが到達できない状態になったとき、nfs 共有はアンマウントされ、hard マウントオプションを使っている際にシステムフリーズが起こらなくなります。https://bbs.archlinux.org/viewtopic.php?pid=1260240#p1260240 を参照。
NFS のマウントポイントが /etc/fstab
に正しく記述されていることを確認してください:
$ cat /etc/fstab
lithium:/mnt/data /mnt/data nfs noauto,noatime,rsize=32768,wsize=32768,intr,soft 0 0 lithium:/var/cache/pacman /var/cache/pacman nfs noauto,noatime,rsize=32768,wsize=32768,intr,soft 0 0
noauto
マウントオプションは起動時に自動的に共有をマウントしないように systemd に命じます。これを設定していないとネットワーク上に共有が存在するかどうかわからないのに systemd が共有をマウントしようとしてブート中にブランクスクリーンで止まってしまいます。
root 以外のユーザー user
で NFS 共有をマウントするには fstab にエントリを追加する必要があります。
cron を使って NFS ホストが到達可能なチェックする auto_share
スクリプトを作成:
/root/bin/auto_share
#!/bin/bash SERVER="YOUR_NFS_HOST" MOUNT_POINTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " " | cut -f2 -d" ") ping -c 1 "${SERVER}" &>/dev/null if [ $? -ne 0 ]; then # The server could not be reached, unmount the shares for umntpnt in ${MOUNT_POINTS}; do umount -l -f $umntpnt &>/dev/null done else # The server is up, make sure the shares are mounted for mntpnt in ${MOUNT_POINTS}; do mountpoint -q $mntpnt || mount $mntpnt done fi
# chmod +x /root/bin/auto_share
毎分 auto_share
を実行する root の cron エントリを作成:
# crontab -e
* * * * * /root/bin/auto_share
systemd のユニットファイルを使って起動時に NFS 共有をマウントすることも可能です。クライアントに NetworkManager がインストール・設定されている場合はユニットファイルは必要ありません。#NetworkManager dispatcher を見て下さい。
/etc/systemd/system/auto_share.service
[Unit] Description=NFS automount [Service] Type=oneshot RemainAfterExit=yes ExecStart=/root/bin/auto_share [Install] WantedBy=multi-user.target
Now enable auto_share
.
NetworkManager dispatcher
上で説明している方法に加えて、ネットワークの状態が変わった時にスクリプトを実行するよう NetworkManager を設定することもできます。
NetworkManager-dispatcher
サービスを有効化・起動してください。
ネットワーク状態の変化にあわせてネットワーク上の共有をマウントする一番簡単な方法は auto_share
スクリプトにシンボリックリンクを作成することです:
# ln -s /root/bin/auto_share /etc/NetworkManager/dispatcher.d/30_nfs.sh
もしくはネットワークが利用可能かチェックする以下のマウントスクリプトを使って下さい:
/etc/NetworkManager/dispatcher.d/30_nfs.sh
#!/bin/bash SSID="CHANGE_ME" MOUNT_POINTS=$(sed -e '/^.*#/d' -e '/^.*:/!d' -e 's/\t/ /g' /etc/fstab | tr -s " " | cut -f2 -d" ") ISNETUP=$(nmcli dev wifi | \grep $SSID | tr -s ' ' | cut -f 10 -d ' ') 2>/dev/null # echo "$ISNETUP" >> /tmp/nm_dispatch_log if [[ "$ISNETUP" == "yes" ]]; then for mntpnt in ${MOUNT_POINTS}; do mountpoint -q $mntpnt || mount $mntpnt done else for srvexp in ${MOUNT_POINTS}; do umount -l -f $srvexp &>/dev/null done fi
ワイヤレス SSID "CHANGE_ME" が立ち上がったり落ちたりする度に、nfs.sh
スクリプトが実行され素早く共有をマウント・アンマウントします。
トラブルシューティング
NFS Troubleshooting を参照してください。
参照
- Avahi, NFS 共有の自動検出が出来る Zeroconf 実装
- HOWTO: Diskless network boot NFS root
- NFS Performance Management
- Microsoft Services for Unix NFS Client info
- NFS on Snow Leopard