はじめに
以前、Openwrt x86で光クロス用ルーターを作りました。
ProxmoxのVM/LXCとして作っても良かったのですが、調べた感じだとオーバーヘッドがかなり大きくなってしまう人を見かけていたので、ストレージの全領域を食わせて作成しました。
ただ搭載しているストレージが256GBのSSDなうえに、パッケージをガツガツ入れまくっても200MiBしか消費しておらず、あまりにも無駄が大きいのでNFSサーバーを立ててProxmox用のストレージ領域として払い出すことにしました。
構築
そのまま払い出して容量を食い尽くされるようなことを防ぐため、ext4のReserve Blockを使用してシステム領域を保護します。
パッケージインストール
まずは必要なパッケージをインストールします。
opkg update
opkg install e2fsprogs dumpe2fs lsblk tune2fs nfs-kernel-server shadow-useradd shadow-groupadd
予約領域の設定
ルートデバイスに対して6GB相当のブロックを予約します。
なぜ6GBかと言うと、使用可能量が数字の上で250GBになるからです。ここは適当なので減らそうが増やそうがご自由に。
予約ブロック数
4KBブロックとして、総予約ブロック数を計算します。
6 * 1024 * 1024 * 1024 / 4096 = 1572864
1572864ブロックを指定します。
ルートデバイスのマッピングの確認
df -hで確認すると/dev/rootが出てきてしまうので、lsblkで実態をチェックします。
root@OpenWrt:~# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 235.4G 206.2M 229.2G 0% /
tmpfs 3.8G 8.6M 3.8G 0% /tmp
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
/dev/sda1 16.0M 6.3M 9.7M 39% /boot
tmpfs 512.0K 0 512.0K 0% /dev
root@OpenWrt:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 238.5G 0 disk
├─sda1 8:1 0 16M 0 part /boot
│ /boot
├─sda2 8:2 0 238.5G 0 part /
└─sda3 8:3 0 239K 0 part
sr0 11:0 1 1024M 0 rom
/dev/sda2と確認できたので、実際に予約ブロックの設定を行います。
ブロック指定
次のコマンドを実行します。
tune2fs -r 1572864 /dev/sda2
実際に予約されたか確認します。
root@OpenWrt:~# dumpe2fs -h /dev/sda2 | grep "Reserved block count"
dumpe2fs 1.47.0 (5-Feb-2023)
Reserved block count: 1572864
これで残り6GBを切った場合rootユーザー以外が書き込めなくなりました。
書き込みユーザーの設定
NFSがrootユーザーで書き込んでしまうと、予約ブロック設定の意味が無くなってしまうので専用ユーザーを作成します。
ユーザー作成
groupadd -g 2000 nfsgroup
useradd -u 2000 -g 2000 -d /nonexistent -s /bin/false nfsuser
書き込みディレクトリ設定
mkdir -p /srv/nfs
chown 2000:2000 /srv/nfs
chmod 755 /srv/nfs
export設定
export設定を書き込みます。
echo "/srv/nfs 10.0.0.0/16(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000)" > /etc/exports
NFSサーバーを再起動します。
exportfs -r
/etc/init.d/nfsd enable
/etc/init.d/nfsd restart
Proxmoxでの設定
今回は、nconnectやrsize・wsizeオプションを使用するので設定ファイルに直接書き込みます。
/etc/pve/storage.cfsの設定
オプションは自由に変更してください。
以下を追記します。
nfs: openwrt-nfs
export /srv/nfs
server 10.0.0.1
content images,iso,import,vztmpl,snippets,rootdir,backup
options nconnect=16,noatime,rsize=262144,wsize=262144,vers=4.2
path /mnt/pve/openwrt-nfs
マウント
pvesmで切り替えてマウントします。
pvesm set openwrt-nfs --disable 1
pvesm set openwrt-nfs --disable 0
接続の確認
Proxmoxのシェルで接続テストを行います。
接続オプションのチェック
root@pve:~# cat /proc/mounts | grep openwrt-nfs
10.0.0.1:/srv/nfs /mnt/pve/openwrt-nfs nfs4 rw,noatime,vers=4.2,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,nconnect=16,timeo=600,retrans=2,sec=sys,clientaddr=10.0.10.100,local_lock=none,addr=10.0.0.1 0 0
マルチセッションのチェック
root@pve:~# ss -nt state established dst 10.0.0.1
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 0 10.0.10.100:751 10.0.0.1:2049
0 0 10.0.10.100:925 10.0.0.1:2049
0 0 10.0.10.100:733 10.0.0.1:2049
0 0 10.0.10.100:685 10.0.0.1:2049
0 0 10.0.10.100:709 10.0.0.1:2049
0 0 10.0.10.100:965 10.0.0.1:2049
0 0 10.0.10.100:767 10.0.0.1:2049
0 0 10.0.10.100:931 10.0.0.1:2049
0 0 10.0.10.100:667 10.0.0.1:2049
0 0 10.0.10.100:776 10.0.0.1:2049
0 0 10.0.10.100:799 10.0.0.1:2049
0 0 10.0.10.100:682 10.0.0.1:2049
0 0 10.0.10.100:678 10.0.0.1:2049
0 0 10.0.10.100:750 10.0.0.1:2049
0 0 10.0.10.100:958 10.0.0.1:2049
0 0 10.0.10.100:728 10.0.0.1:2049
書き込み速度テスト
実際に書き込んで速度テストをしてみます。
root@pve:~# dd if=/dev/zero of=/mnt/pve/openwrt-nfs/test.img bs=1M count=1000 status=progress conv=fdatasync
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 6.97105 s, 150 MB/s
SSDにしてはだいぶ遅めですが、まあ困りはしない程度の速度は出ているのでヨシとします。
おわりに
言いたいことがたくさんある方もいると思いますが、ガバガバ設計が生んだ産物なので許してください。
とりあえず無駄が減ったのでよかったです。