nfs
nfs-kernel-server
のインストール
$ sudo apt install nfs-kernel-server
サーバ側の設定
/etc/default/nfs-kernel-server
のパラメータ設定
- nfsd(サーバサイド)の設定
- 起動時のスレッド数(プロセス数)が8個しかないので、増やす
# Number of servers to start up
# RPCNFSDCOUNT=8
RPCNFSDCOUNT=64
/etc/exports
の設定
- 公開したいディレクトリ or ディスクをシェアする設定
rw
- 読み込み許可
async
- 非同期許可
no_wdelay
- 書き込み遅延時の待ち時間を設けない
fsid=0
- 疑似ルートとなるディレクトリ
crossmnt
- マウントしたディレクトリが再帰構造を持つことを許可(nestされたマウントを許可)
root_squash
- rootのリクエストを匿名の権限で実行
no_root_squash
- rootのリクエストをrootで実行
all_squash
- すべてのリクエストを匿名の権限で実行(ゲスト権限を期待するときなど)
anonuid=1000
,anongid=1000
- 匿名のUIDとGIDはいくつなのかを指定
設定の具体例
/mnt/sdc *(rw,async,no_auth_nlm,no_wdelay,no_subtree_check) # sdcをexport
/mnt/nvme0n1 192.168.0.0/16(rw,async,no_auth_nlm,no_wdelay,no_subtree_check) # nvme0n1をexport, ipアドレスのアクセスを192.168.*.*に限定
/mnt/nvme0n1 58.138.0.0/16(rw,async,no_auth_nlm,no_wdelay,no_subtree_check) # 複数のIPレンジを複数行に分けて記すことができる
/home/user/.mnt *(rw,async,no_auth_nlm,no_wdelay,no_subtree_check,crossmnt,fsid=0,anonuid=1000,anongid=1000,insecure,all_squash) # macosx用のexport
反映(export)
$ sudo exportfs -a
再反映(export)
$ sudo exportfs -r
反映取り消し(unexport)
$ sudo exportfs -au
nfsサーバに接続している情報を表示
$ showmount -a
または
$ showmount
nfsサーバが公開しているディレクトリを表示
$ showmount -e 127.0.0.1
Export list for 127.0.0.1:
/home/<username>/sda *
nfsの統計情報
$ nfsstat
クライアント側の設定
OSXでのマウント例
- mountオプションとして
resvport
が必要. resvportの意味は特権ポートを使用するかというオプションでOSXでは必要であるようである - nfsサーバサイドのディスクの設定が
anonuid=1000,anongid=1000,insecure,all_squash
が入っている必要がある(uid,gidは適宜サーバのユーザに変更)
# mount -t nfs -o resvport ${IP_ADDR}:${SEVER_DIR_PATH} ${TARGET_PATH}
/etc/fstab
の設定とマウントオプション
マウントオプション
rsize
,wsize
- 読み書きのバイト数、大きいほうが基本的に良い
sync
async
のほうが早いがファイルが壊れる可能性がある
soft
hard
はハングアップのリスクがありsoft
だとプログラムがタイムアウト等で終了するリスクを許容するretrans
- softでマウントしたときの試行回数
hard
intr
- hardでマウントした時の割り込みを受け付け
nordirplus
- globbing時に投機的にデータを取得する機能をOFFするオプション
timeo
- TCP接続時の応答が帰るまでに許容する時間
fsc
- fs-cacheを有効化したときにつけるオプション
nolock
- ファイルをロックしない
- ipv6等は早くならない
具体例
# nfs
192.168.50.16:/home/user/sdb /home/user/.mnt/nfs/favs00 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.20:/home/user/nvme0n1 /home/user/.mnt/nfs/favs01 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.12:/home/user/sda /home/user/.mnt/nfs/favs02 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.12:/home/user/sdd /home/user/.mnt/nfs/favs03 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.12:/home/user/sdc /home/user/.mnt/nfs/favs04 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.16:/home/user/nvme0n1 /home/user/.mnt/nfs/favs05 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.12:/home/user/sde /home/user/.mnt/nfs/favs06 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
192.168.50.12:/home/user/sdf /home/user/.mnt/nfs/favs07 nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
# cache
192.168.50.16:/home/user/sdc /home/user/.mnt/nfs/cache nfs nordirplus,rsize=8192,wsize=8192,async,soft,timeo=1 0 0
fs-cacheの有効化
キャッシュを利用したほうが基本的に早くなるので入れたほうが良い
2020/10追記:このファイルシステムは壊れやすく、壊れるとリカバリーが大変なので、入れないほうがいい
$ sudo apt install cachefilesd
/etc/default/cachefilesdの編集
RUN=yes
cachefilesdの起動
$ sudo systemctl start cachefilesd
トラブルシューティング
mount.nfs: access denied by server while mounting (null)
- サーバに問題があるのではなく、クライアントのマウントポイントがマウント不可になっているときに出る
- 別のファイルシステムがマウントされていないか等確認する
hardオプションでマウントしてしまうと、クライアントのターミナルがハングアップする
- softオプション無しでマウントしてしまうとハングアップすることがある
sudo umount -f -l <mount-point>
で強制的にアンマウントすることで操作可能になる
mount_nfs: can’t mount with remote locks when server (..***) is not running rpc.statd: RPC prog. not avail
- nfsサーバサイドで
rpc-statd
とrpcbind
のサービスが停止している可能性がある - osxがクライアントの時、発生することがある
$ sudo systemctl start rpcbind
$ sudo systemctl enable rpcbind
$ sudo systemctl start rpc-statd
$ sudo systemctl enable rpc-statd
参考
- https://blog.frehi.be/2019/01/03/fs-cache-for-nfs-clients/
- https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.6-NFS-Client
- https://unix.stackexchange.com/questions/149014/why-is-ls-command-slow-to-interrupt-on-nfs-directory-with-lots-of-files