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.conf は vers3=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