2と3のリビジョン間の差分
2016-06-08 01:08:42時点のリビジョン2
サイズ: 7518
コメント:
2016-06-08 01:10:14時点のリビジョン3
サイズ: 7746
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 82: 行 82:
 * もちろんNFSv4の売り文句であるところの、NFSv4クライアントでのロックは問題無し。
 * NFSv4クライアント同士のロック共有が可能かは未検証。

NFSv4サーバーの作り方

検証環境

  • FreeBSD/amd64 10.3-RELEASE をNFSv4サーバーとする。
  • CentOS をサーバーにするケースは今回は無しで。
  • NFSv4 on ZFS で、使用するプロトコルはNFSv4に絞る。
  • ZFSはUFSでもかまわない。
  • UFSの場合、sharenfs でなく、/etc/exports で反映を行う。
  • 過去との互換性?今時 v2 はおろか、v3 でもないでしょ。v4 ないしは v4.1 で。

セットアップ

ZFS領域確保(作業例)

sysctl vfs.zfs.min_auto_ashift=12
zpool create -O atime=off export /dev/da1
  • 今回、/export 上にNFS共有するファイルシステムを専用に用意するものとする。
  • またマウント可否は sharenfs プロパティで制御するものとする(デフォルトは off)。

/boot/loader.conf(環境依存)

vfs.zfs.trim.enabled="0"

※VMware ESXi 上(LSI Logic SAS アダプタ)では TRIM/UNMAP が効かないのでオフにする。 基本的に物理環境下ならHDDと言えど TRIM/UNMAP 試してエラーになることは無いと思われるので、CAMのエラーメッセージがうるさい時だけ設定する。

/etc/rc.conf(NICチューニング)

ifconfig_インターフェース="inet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX mtu 9000"

今時のファイル共有ならGbEや10GbE当たり前なので、MTU値を設定する。 MTU値はネットワーク依存で、通信に絡んでいる一番小さな値を指定することになるが、最近だと9000バイトあたりに収束しつつあるのかなぁと思いつつ。

なお手動で設定できるが、MTU値を反映するため、一度下記のようにインターフェースをダウンさせる必要がある。

ifconfig インターフェース mtu 9000
ifconfig インターフェース down
ifconfig インターフェース up

/etc/sysctl.conf

NFSの最低利用バージョンの指定

vfs.nfsd.server_min_nfsvers=4

なお最大利用バージョンの指定は rc.conf 中の「nfsv4_server_enable="YES"」設定で行われている。

ZFSのチューニング

vfs.zfs.min_auto_ashift=12
vfs.zfs.vdev.async_write_max_active=31

特に async_write_max_active はドライブが対応しているNCQ・TCQの数(-1)を指定する。

NFSのチューニング(未検証)

vfs.nfsd.issue_delegations=0
vfs.nfsd.enable_locallocks=0
  • NFSサーバーでデリゲーション機能を提供するとNFSクライアントにメリットがあるらしい。
  • しかし、調べた範囲だと、NFSクライアントで使用が明言されてないので、とりあえずオフっておく。
  • ロックについては、NFSサーバーとNFSクライアント間でのロック共有ができるようになる。
  • しかし、以下の組み合わせで、できたりできなかったりする。
    • NFSクライアント(CentOS 6.8)→NFSサーバー(FreeBSD 10.3-R)の順でロックすると問題無くロックできる。
    • NFSサーバー(FreeBSD 10.3-R)→NFSクライアント(CentOS 6.8)の順でロックするとNFSクライアント側でロックされずにエラーになる。
  • 調査が足りてないので、とりあえずオフっておく。
  • もちろんNFSv4の売り文句であるところの、NFSv4クライアントでのロックは問題無し。
  • NFSv4クライアント同士のロック共有が可能かは未検証。

/etc/exports

V4: /export -network ネットワークアドレス -mask ネットマスク

とりあえず、/export がNFSv4共有できるようになる。ただし、/export 自体は sharenfs=off なので、どこからからもマウントできない(できるけどアクセスできない)。

/etc/rc.conf

  • NFSv4サーバーとして運用するために必要なデーモン(およびオプション)は以下の通り。

rpcbind_enable="YES"
nfsuserd_enable="YES"
mountd_enable="YES"
nfs_server_enable="YES"
nfsv4_server_enable="YES"
  • また、以下の設定の設定によりある程度のアクセス制限を行う。

rpcbind_flags="-h 公開するNFSv4サーバーのIPアドレス"
nfsuserd_flags="-domain アカウント識別用ドメイン"
mountd_flags="-l -h 公開するNFSv4サーバーのIPアドレス"
nfs_server_flags="-t -h 公開するNFSv4サーバーのIPアドレス"

このうち、nfsuserd_flags で指定する「ドメイン」の指定が重要となる。 NFSv4では、NFSサーバーとNFSクライアント間のユーザー識別子を「ユーザー@ドメイン」で識別するため、合わせておく必要がある。

これは厳密にはサーバーのドメインとは別物であるため、別途決め打ちする必要がある。

アカウント作成

  • 先にも述べたがNFSv4におけるサーバーとクライアント間のアカウント識別は「ユーザー@ドメイン」である。
  • これはNFSv3/v2までと違い、UID、GIDという数字では識別していないことを意味する。
  • 「ドメイン」については先に決めたとおりとする。
  • よく使いそうな「ユーザー」については事前に作成しておくこと。
  • NFSサーバーとNFSクライアント間でアカウントミスマッチが起きると、以下の現象が発生する。
    • NFSクライアント(CentOS 6.8): nobody ユーザー・nobody グループにマップされる。
    • NFSサーバー(FreeBSD 10.3-R):32767 ユーザー・32767 グループにマップされる。

アカウント作成例

pw groupadd postgres -g 5432
pw useradd  postgres -u 5432 -g postgres -c "postgres" -s /usr/sbin/nologin
install -d -o postgres -g postgres -m 0755 /home/postgres

※FreeBSD の PostgreSQL 用アカウントとして pgsql (/usr/ports/UIDs ファイル参照のこと)があるが、CentOS の PostgreSQL 用アカウント(postgres)とはマッチしないので、別途作成する。

領域の共有設定

/export をどう共有するかによるが「/export/NFSv4クライアント」として、クライアント単位で共有設定する場合は、下記のようにパーティションを切る。

zfs create -o sharenfs="-maproot=0:0 NFSv4クライアント名" export/NFSv4クライアント

sharenfs 設定を行うと、/etc/zfs/exports ファイルに掃き出されるのと、合わせてmountd(8)に再読み込み(HUP シグナル)が実施される。

一つの領域を複数のNFSv4クライアント案とで共有するなら、/etc/exports に集約するのが良いと思われ(未実験)。

参考文献

NFSv4/サーバー (最終更新日時 2016-07-24 23:43:53 更新者 NorikatsuShigemura)