ディスクレス mini PC チュートリアル

このチュートリアルでは、小型 x86 mini PC を、内蔵ディスクへ OS を導入せずに ルーター化します。 routerd ライブ ISO から起動し、設定を USB に保存します。 ログは RAM に一時保存し、1 日 1 回だけ圧縮アーカイブを USB へ書き出します。
用意するもの
- ネットワークインターフェースを 2 つ以上持つ mini PC
- routerd 永続化用の USB メモリー
- 最新の
routerd-live.iso - コンソールアクセス(Proxmox VE では
qm terminalでシリアルコンソールを使えます) - DHCPv4 または静的アドレスを使える WAN
- LAN スイッチまたは隔離されたテストブリッジ
1. USB メモリーを準備する
パーティションを 1 つ作り、ライブ ISO がマウントできるファイルシステムで
フォーマットします。
既定では ext4 を推奨します。
単純なリムーバブルメディアなら vfat と exfat も使えます。
ISO が自動検出できるように、ラベルを ROUTERD にします。
FAT32 は blkid では通常 vfat と表示されます。
routerd 専用の USB メモリーなら ext4 が扱いやすいです。
Linux 端末での例を示します。
sudo mkfs.ext4 -L ROUTERD /dev/sdX1
/dev/sdX1 は、実際の USB パーティションに置き換えてください。
誤ったデバイスをフォーマットしないように注意してください。
2. ライブ ISO を起動する
固定 URL から取得します。
curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-live.iso
curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-live.iso.sha256
sha256sum -c routerd-live.iso.sha256
mini PC を ISO から起動します。 同じイメージでビデオコンソールとシリアルコンソールの両方を使えます。
Proxmox VE での例を示します。
qm create 200 \
--name routerd-live-demo \
--memory 1536 \
--cores 2 \
--ostype l26 \
--serial0 socket \
--vga std \
--boot order=ide2 \
--ide2 local:iso/routerd-live.iso,media=cdrom \
--net0 virtio,bridge=vmbr0 \
--net1 virtio,bridge=vmbr490
qm start 200
qm terminal 200
DHCP や RA の初期試験では、隔離された LAN ブリッジを使います。

ISO はビデオコンソールとシリアルコンソールの両方を有効にします。
Proxmox VE では、対話式ウィザードは qm terminal の方が読みやすいです。
VGA の画面キャプチャは起動の証跡として使い、実際の入力と結果は下のシリアルコンソールログで確認します。
3. ウィザードを実行する
root でログインすると、ライブ ISO が初期設定ウィザードを起動します。
シリアルコンソールでは、ライブ ISO の案内とウィザードの開始が次のように 表示されます。
routerd live v20260510.1811
localhost login: root
Run the setup wizard:
/usr/share/routerd/install.sh configure
Starting routerd setup wizard. Press Ctrl+C to skip.
routerd initial configuration wizard
Available interfaces:
- lo
- eth0
- eth1
ウィザードは次を確認します。
- ルーター名
- WAN インターフェース
- WAN IPv4 モード
- LAN インターフェース
- LAN アドレス
- DHCPv4、DNS、NTP、RA、firewall、NAT44
- 管理経路の置き場所
- USB 永続化
実機検証時のシリアルコンソールログを次に示します。
Router name [routerd-router]: routerd-live-router-test
WAN interface: eth0
WAN IPv4 mode (dhcp/static) [dhcp]: dhcp
Default DNS upstreams when DHCP DNS is unavailable [1.1.1.1]: 1.1.1.1
LAN interface: eth1
LAN address/CIDR [192.168.10.1/24]: 192.168.99.1/24
LAN client CIDR [192.168.99.0/24]: 192.168.99.0/24
Enable DHCPv4 server? (yes/no) [yes]: yes
DHCPv4 pool start [192.168.99.100]:
DHCPv4 pool end [192.168.99.200]:
Enable DHCPv6 stateless service? (yes/no) [no]: no
Enable IPv6 RA? (yes/no) [no]: no
Enable DNS resolver? (yes/no) [yes]: yes
Enable NTP server? (yes/no) [yes]: yes
Enable 3-role firewall? (yes/no) [yes]: yes
Enable NAT44 from LAN to WAN? (yes/no) [yes]: yes
Management placement (separate/lan) [lan]: lan
Save config to USB for diskless persistence? (yes/no) [no]: no
generated candidate config: /usr/local/etc/routerd/router.yaml.configure
Install this config as router.yaml? (yes/no) [no]: yes
USB 永続化を聞かれたら yes を選び、USB パーティションを指定します。
パーティションに ROUTERD ラベルが付いていれば、自動的に候補へ表示されます。
短時間の試験でなければ、1 日 1 回の USB 書き出しジョブを有効にします。
既定のログバッファーは /run/routerd/logs に置かれる 100 MiB です。
live helper は、blkid で ext4、vfat、exfat を判定します。
USB 永続化は、USB への書き込みを減らすため、既定で async,noatime としてマウントします。
同期書き込みが必要な場合だけ、kernel command line に routerd.usb_mount=sync を追加します。
選択した USB パーティションは /media/routerd-usb にマウントされます。
保存先の設定ファイルは /media/routerd-usb/routerd/router.yaml です(/mnt/routerd/router.yaml ではありません)。
4. 初回反映を確認する
確認が終わると、ウィザードは次を書き出します。
/usr/local/etc/routerd/router.yaml
その後、次を実行します。
routerctl validate -f /usr/local/etc/routerd/router.yaml --replace
routerctl plan -f /usr/local/etc/routerd/router.yaml --replace
routerctl apply -f /usr/local/etc/routerd/router.yaml --replace
状態を確認します。
routerctl status
phase が Healthy になれば成功です。
シリアルログでは、次のような状態が返ってきます。
{
"apiVersion": "control.routerd.net/v1alpha1",
"kind": "Status",
"status": {
"phase": "Healthy",
"generation": 1,
"resourceCount": 14
}
}
5. LAN クライアントを試す
LAN インターフェースまたはテストブリッジへ、クライアントを接続します。
クライアントは、次を受け取るはずです。
- DHCPv4 プールからの IPv4 アドレス
- routerd を向くデフォルトルート
- routerd を向く DNS サーバー
- 有効化した場合は、routerd を向く NTP サーバー
基本的な確認は次のとおりです。
dig @192.168.10.1 www.google.com A +short
curl -4 https://www.google.com/generate_204
LAN prefix を変えた場合は、アドレスを読み替えてください。
PVE 検証では、隔離 LAN ブリッジに一時的な network namespace を接続しました。 クライアントは routerd からリースを受け取り、routerd の NAT44 を経由して 外部へ通信できました。
inet 192.168.99.186/24
default via 192.168.99.1 dev veth-rtest
dig @192.168.99.1 www.google.com A +short
142.251.156.119
142.251.150.119
142.251.151.119
...
curl -4 https://www.google.com/generate_204
http_code=204 remote_ip=142.251.156.119 time_total=0.024397
curl http://192.168.99.1:8080/
http_code=200 remote_ip=192.168.99.1 time_total=0.000537
6. 再起動して永続化を確認する
USB メモリーを接続したまま、mini PC を再起動します。
起動時に、ライブ ISO は次を行います。
- 記録済みデバイス、
routerd.usb=指定、ROUTERDラベルの順で USB デバイスを探します。 - USB デバイスを
/media/routerd-usbにマウントします。 /media/routerd-usb/routerd/router.yamlを復元します。/run/routerd/logsを tmpfs として準備します。- ルーター設定を反映します。
- ライブ routerd デーモンを起動します。
ログイン後に確認します。
routerctl status
ウィザードを再実行せずに収束すれば成功です。
設定が復元されず /usr/local/etc/routerd/router.yaml もない場合は、設定ウィザードが起動します。
7. ログ永続化の仕組み
ログは、まず RAM へ書き込みます。
/run/routerd/logs
日次の書き出しジョブは、次を USB へコピーします。
- 現在の
router.yaml - routerd の状態スナップショット
- 圧縮ログアーカイブ
USB フラッシュメモリーへの常時書き込みを避けるためです。 tmpfs の上限を超えた場合は、古いファイルから削除します。
手動で書き出す場合は、次を実行します。
/usr/share/routerd/live-persistence.sh flush
USB デバイスを物理的に抜く前に、flush と unmount を実行します。
/usr/share/routerd/live-persistence.sh flush
/usr/share/routerd/live-persistence.sh umount
unmount せずに抜いた場合でも routerd は RAM 上で動作を続けます。 警告を出し、新しいログは USB が戻るまで tmpfs に保持します。
トラブルシューティング
USB メモリーが候補に出ない
シェルからパーティションを確認します。
blkid
lsblk -f
必要なら、カーネル引数で明示的に指定します。
routerd.usb=/dev/sdb1
再起動後にまたウィザードが出る
ISO が保存済みの設定を見つけられていません。 USB デバイスをマウントして確認します。
mount /dev/sdX1 /media/routerd-usb
ls -l /media/routerd-usb/routerd/router.yaml
再起動後にログがない
ログは RAM に一時保存しています。 日次の書き出しジョブ、または手動の flush を実行した後に、USB へ残ります。
LAN クライアントにアドレスが出ない
ウィザードで選んだ LAN インターフェースを確認します。
routerctl status --json
ip addr
Proxmox VE で試す場合は、クライアントと routerd の LAN NIC が同じ隔離ブリッジに接続されていることを確認してください。