glusterfs に他のサーバーから書き込むのに、 NFS 経由の方が gluster のバージョンに悩む必要がなくて良いかと思って、 nfs-ganesha-gluster を設定してみました。 設定例が少ないので簡単かと思いきや、意外とハマりどころがありました。

動作確認環境 (サーバー側)

  • Raspbian 10 (buster)

インストール

sudo apt install nfs-ganesha-gluster で依存している nfs-ganesha なども含めて入ります。

インストール途中で起動に失敗しますが、設定前なので気にしなくても大丈夫そうです。

Setting up nfs-ganesha (2.7.1-2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-ganesha.service → /lib/systemd/system/nfs-ganesha.service.
Created symlink /etc/systemd/system/nfs-server.service.wants/nfs-ganesha-lock.service → /lib/systemd/system/nfs-ganesha-lock.service.
nfs-ganesha-config.service is a disabled or a static unit, not starting it.
Job for nfs-ganesha.service failed because the control process exited with error code.
See "systemctl status nfs-ganesha.service" and "journalctl -xe" for details.

設定ファイルは /etc/ganesha/ganesha.conf のみ

/etc/ganesha/gluster.conf が存在するので、 /etc/ganesha/*.conf 全部が読み込まれているのかと勘違いして、 かなり悩んでしまったのですが、 デフォルトでは /etc/ganesha/ganesha.conf だけしか使われていませんでした。

/etc/ganesha/gluster.conf を元に /etc/ganesha/ganesha.conf に設定をしました。

バージョンアップ時の処理を考慮して conffile をあまり変更したくないなら、 /etc/default/nfs-ganeshaOPTIONS="-L /var/log/ganesha/ganesha.log -f /etc/ganesha/ganesha.conf -N NIV_EVENT" のファイル指定を変更しても良さそうです。

設定

/etc/ganesha/ganesha.conf は以下のような設定にしました。

firewall の設定に困るので https://github.com/nfs-ganesha/nfs-ganesha/blob/next/src/doc/man/ganesha-core-config.rst を参考にして MNT_PortNLM_Port は固定にしました。 ポート番号は何でも良さそうだったので https://github.com/nfs-ganesha/nfs-ganesha/wiki/Ganesha-config からとってきました。

EXPORT
{
	# Export Id (mandatory, each EXPORT must have a unique Export_Id)
	Export_Id = 42;

	# Exported path (mandatory)
	Path = "/mydata";

	# Pseudo Path (required for NFS v4)
	Pseudo = "/mydata";

	# Required for access (default is None)
	# Could use CLIENT blocks instead
	Access_Type = RW;

	# Allow root access
	Squash = No_Root_Squash;

	# Security flavor supported
	SecType = "sys";

	# Exporting FSAL
	FSAL {
		Name = "GLUSTER";
		Hostname = "10.42.42.1";
		Volume = "mydata";
		Up_poll_usec = 10; # Upcall poll interval in microseconds
		Transport = tcp; # tcp or rdma
	}
}

NFS_Core_Param
{
	MNT_Port = 32767;
	NLM_Port = 32769;
}

firewall の許可

111,875,2049,32767,32769 番ポートを tcp と udp の両方で許可しておきます。

tcp wrapper の許可

/etc/hosts.allowrpcbind を許可しました。

mountd などは nfs-ganesha が提供していて、 tcp wrapper は使っていないようなので、 ここでの許可は不要でした。

設定例としては以下のような感じです。

rpcbind: 127.0.0.1 [::1]
rpcbind: 10.
rpcbind: 192.168.0.0/24
rpcbind: [fe80::%eth0]/10
rpcbind: [fe80::%wlan0]/10
rpcbind: [fdcb:a987:6543:2100::]/64

マウントテスト

mkdir -p /tmp/test; sudo mount localhost:/mydata /tmp/test のように nfs でマウントできて、 読み書きもできることを確認します。

大丈夫そうなら、 /etc/fstab に追加するなど、 普通に使えます。

トラブルシューティング

起動しない

systemctl status nfs-ganesha/var/log/ganesha/ のログをみて調べました。

ポートがわからない

sudo rpcinfo -p | grep mountdsudo ss -lntp で調べました。

export されているかどうかわからない

showmount コマンドを使って、動作確認しました。

  • sudo /sbin/showmount -e localhost
  • sudo /sbin/showmount -e 127.0.0.1
  • sudo /sbin/showmount -e
  • sudo /sbin/showmount -e 192.168.0.42

clnt_create: RPC: Program not registerednfs-ganesha の起動に失敗しているようなので、 設定やログを確認します。

rpc mount export: RPC: Unable to send; errno = Operation not permitted は firewall で塞がれていないか確認します。

clnt_create: RPC: Authentication error は tcp wrapper の設定を確認します。

Export list for localhost: のような行だけだと何も export されていません。

/mydata (everyone) のような行が続いていれば、それをマウントできます。

owner, group が変?

Debian 9 (stretch) のホストからマウントして使ってみると、 drwxr-xr-x 2 nobody 4294967294 4096 4月 26 17:27 . のように owner と group がすべて nobody 4294967294 (-2) に見えているという現象が出ていたのですが、 rsync でのバックアップとして使った感じだと、 ちゃんと書き込めていて、 他のマシンからみると問題なく owner や group が見えていて、 rsync を実行し直しても変化していて書き込み直しにもならない、 ということがおきていました。

stretch は oldstable でバックアップを取り終わったら止める予定だったので、 深く追求することはしませんでした。

感想

wireguard 経由で自宅サーバーの USB HDD を VPS から nfs でマウントしたので、 速度的にはそれなりなので、直接の作業場所として使うのには向いていませんが、 バックアップ先としては問題なく使えそうでした。

nfs-ganesha の層でキャッシュもあるので、 gluster のサーバー群とは離れたサーバーからは gluster 直接よりも良さそうに感じました。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published