Cover Image for Openwrt x86ルーターの空き領域をNFSストレージにした

Openwrt x86ルーターの空き領域をNFSストレージにした

はじめに

以前、Openwrt x86で光クロス用ルーターを作りました。

openwrtでenひかりクロス+v6プラス+固定IP+ひかり電話環境用ルーターを作った - Qiita
はじめに ひかり電話を契約しているので、ONU直結ではないです。 XG-100NE(HGW)の配下トンネル手順になります。 最近になってProxmoxのVMや家の中のネットワークデバイスが増え、XG-100NEの動作が不安定になってきました。 また、ポート開放時に...
openwrtでenひかりクロス+v6プラス+固定IP+ひかり電話環境用ルーターを作った - Qiita favicon https://qiita.com/katori_m/items/92fd87ea8206d4ec6bb7
openwrtでenひかりクロス+v6プラス+固定IP+ひかり電話環境用ルーターを作った - Qiita

ProxmoxのVM/LXCとして作っても良かったのですが、調べた感じだとオーバーヘッドがかなり大きくなってしまう人を見かけていたので、ストレージの全領域を食わせて作成しました。
ただ搭載しているストレージが256GBのSSDなうえに、パッケージをガツガツ入れまくっても200MiBしか消費しておらず、あまりにも無駄が大きいのでNFSサーバーを立ててProxmox用のストレージ領域として払い出すことにしました。

構築

そのまま払い出して容量を食い尽くされるようなことを防ぐため、ext4のReserve Blockを使用してシステム領域を保護します。

パッケージインストール

まずは必要なパッケージをインストールします。

console
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で実態をチェックします。

console
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と確認できたので、実際に予約ブロックの設定を行います。

ブロック指定

次のコマンドを実行します。

console
tune2fs -r 1572864 /dev/sda2

実際に予約されたか確認します。

console
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ユーザーで書き込んでしまうと、予約ブロック設定の意味が無くなってしまうので専用ユーザーを作成します。

ユーザー作成

console
groupadd -g 2000 nfsgroup
useradd -u 2000 -g 2000 -d /nonexistent -s /bin/false nfsuser

書き込みディレクトリ設定

console
mkdir -p /srv/nfs
chown 2000:2000 /srv/nfs
chmod 755 /srv/nfs

export設定

export設定を書き込みます。

console
echo "/srv/nfs 10.0.0.0/16(rw,sync,no_subtree_check,all_squash,anonuid=2000,anongid=2000)" > /etc/exports

NFSサーバーを再起動します。

console
exportfs -r
/etc/init.d/nfsd enable
/etc/init.d/nfsd restart

Proxmoxでの設定

今回は、nconnectやrsize・wsizeオプションを使用するので設定ファイルに直接書き込みます。

/etc/pve/storage.cfsの設定

オプションは自由に変更してください。
以下を追記します。

/etc/pve/storage.cfg
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で切り替えてマウントします。

console
pvesm set openwrt-nfs --disable 1
pvesm set openwrt-nfs --disable 0

接続の確認

Proxmoxのシェルで接続テストを行います。

接続オプションのチェック

console
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

マルチセッションのチェック

console
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   

書き込み速度テスト

実際に書き込んで速度テストをしてみます。

console
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にしてはだいぶ遅めですが、まあ困りはしない程度の速度は出ているのでヨシとします。

おわりに

言いたいことがたくさんある方もいると思いますが、ガバガバ設計が生んだ産物なので許してください。
とりあえず無駄が減ったのでよかったです。