k8s からの NFS のテスト用に NFS サーバーがほしくなったので、 lima で試してみました。

動作確認バージョン

  • macOS Sequoia 15.7.1
  • limactl version 1.2.1
  • Ubuntu 24.04.2 LTS

最初の動作確認

最初は以下のように同じネットワークに接続して動作確認しました。

limactl start template://ubuntu-lts --name nfs-server --containerd none --vm-type vz --network=lima:user-v2 --tty=false
limactl start template://ubuntu-lts --name nfs-client --containerd none --vm-type vz --network=lima:user-v2 --tty=false

NFS サーバー側設定

最初は以下の設定で試しました。

sudo apt update
sudo apt install nfs-kernel-server
sudo mkdir /exports
sudoedit /etc/exports

/etc/exports には以下の設定をしました。

/exports *(rw,fsid=0,sync,no_subtree_check,no_root_squash)

NFS クライアント側

最初は以下のコマンドで試しました。

sudo apt update
sudo apt install nfs-common
mkdir /tmp/nfs
sudo mount -t nfs -o port=2049,rw,nfsvers=4,soft lima-nfs-server.internal:/ /tmp/nfs

実際には soft 以外のオプションはデフォルトなので不要でした。 -t nfs も明示する必要はありませんでした。

NFSv4 のみに変更

Ubuntu 22.04 に NFSv4 サーバ構築(NFSv3 無効化) を参考にして以下のように設定変更しました。

sudo systemctl mask --now rpc-statd.service rpcbind.socket rpcbind.service
sudoedit /etc/nfs.conf
sudo ufw allow 22/tcp
sudo ufw allow 2049/tcp
sudo ufw enable

/etc/nfs.confvers3=y がコメントアウトされていた [nfsd] セクションに以下の設定を追加しました。 vers2= の行はありませんでしたが、一緒に追加しないとエラーになるようでした。

vers2=n
vers3=n

この状態でもマウントできたので、ポートは 2049/tcp しか使われていないのが確認できました。

外部からの接続確認

minikube などの他の仮想マシンから接続するには、ホスト側の IP アドレスで接続できる必要があります。

確認用に --network=lima:user-v2 なしで VM を作りなおしました。

limactl start template://ubuntu-lts --name nfs-client --containerd none --vm-type vz
limactl start template://ubuntu-lts --name nfs-server --containerd none --vm-type vz

port forwarding の設定変更

ホスト側で nc -v localhost 2049 はつながるのに、 nc -v 192.168.253.154 2049 でつながりませんでした。 (192.168.253.154 は macOS の IP アドレス)

server 側の lima.yaml で

portForwards:
 - guestPort: 2049
   hostIP: "0.0.0.0"

として localhost 限定じゃなくす必要がありました。

NAT 経由の問題対応

client 側から TCP 接続がつながるようになっても、 Operation not permitted でつながりませんでした。

$ sudo mount -t nfs -o port=2049,rw,nfsvers=4,soft 192.168.253.154:/ /tmp/nfs
mount.nfs: Operation not permitted for 192.168.253.154:/ on /tmp/nfs

エラーメッセージで原因がわかりにくいですが、 VirtualBoxのNAT環境でNFSクライアントとしてマウントする に書いてあるように、 NAT 経由だと /etc/exports に

/exports *(rw,fsid=0,sync,no_subtree_check,no_root_squash,insecure)

という感じで insecure も必要でした。

分離されたネットワークにいるマシンなので insecure にしてしまいましたが、 共有のネットワークにいるマシンなら他の方法の方が良いかもしれません。

まとめ

いくつかひっかかる点がありましたが、簡単な NFS サーバーを用意して、 クライアントからのマウントまで試せました。

最後に設定例をまとめておきます。

サーバー側

lima.yaml に追加:

portForwards:
 - guestPort: 2049
   hostIP: "0.0.0.0"

設定コマンド:

sudo apt update
sudo apt install nfs-kernel-server
sudo mkdir /exports
sudoedit /etc/exports
sudo systemctl mask --now rpc-statd.service rpcbind.socket rpcbind.service
sudoedit /etc/nfs.conf
sudo ufw allow 22/tcp
sudo ufw allow 2049/tcp
sudo ufw enable

/etc/exports に追加:

/exports *(rw,fsid=0,sync,no_subtree_check,no_root_squash,insecure)

/etc/nfs.conf[nfsd] セクションに設定:

vers2=n
vers3=n

クライアント側

sudo apt update
sudo apt install nfs-common
mkdir /tmp/nfs
sudo mount -o soft ${NFS_SERVER}:/ /tmp/nfs
Disqus Comments

Kazuhiro NISHIYAMA

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

znz znz


Published