3 ポイント 投稿者 GN⁺ 2025-04-22 | 2件のコメント | WhatsAppで共有
  • 実際の Nintendo Wii が NetBSD 10.1 と lighttpd で静的な Hugo ブログを配信しており、実験が続いているあいだ読者は Wii から直接配信されたページを見ている
  • Wii 向け NetBSD ポートは、古い趣味的なポートとは異なり、最新の安定リリース と daily HEAD ビルドが提供されていて、実運用ワークロードを載せてみられるほど保守状態が良好だった
  • インストールは Wii のソフトモッドで Homebrew Channel を起動し、wii.img.gz を SD カードに書き込んだあと、SSH、静的ネットワーク、pkginlighttpd を構成する流れで行う
  • Wii の PowerPC 750 系シングルコア CPU は静的 HTTP を処理できるが、現代的な TLS 暗号化リクエスト を並列で大量に処理するのは難しいため、Caddy が前段で TLS 終端と ACME 証明書管理を担当する
  • 再起動後に Wiimote とセンサーバーが必要になるという制約はあったが、アイドル時消費電力は約 18W、月間電力使用量は約 13.2kWh で、おもちゃのような実験が実際のインフラ学習環境になった

Wii で実際にブログを配信する実験

  • 実験が進行しているあいだ、実際の Nintendo Wii がこのブログを配信している
  • Wii のシステム負荷は live(-ish) status page で確認できる
  • 出発点は、汎用 OS を汎用目的ではないハードウェアで動かしてみたいという関心だった
  • 過去にも PS3 の Yellow Dog LinuxPS2 LinuxDreamcast LinuxPSPLinux のような例があった
  • ただし PSP Linux のカーネルイメージは 2008 年に最後にビルドされ、Dreamcast Linux は 2001 年にビルドされた 2.4.5 カーネルを使っていたため、長期運用ワークロードには向いていなかった

NetBSD の Wii ポートがこの実験を可能にした

  • NetBSD の Web サイトのインストールメディア欄では、Wii が Raspberry Pi や一般的な x86 マシンのような第一級の対象と並んで表示されている
  • Wii 向け NetBSD ポートは、2024 年 12 月の NetBSD 10.1 最新安定リリースへリンクしている
  • daily HEAD builds も Wii 向けに構成されている
  • 保守状態が生きていたため、実運用ワークロードを Wii にデプロイする実験が可能で、そのワークロードがこのブログだった

ハードウェアと性能条件

  • 実験用の Wii は EMF Camp 2024 Swap Shop で入手した個体だった
  • Wii のシングルコア Broadway CPU は IBM PowerPC 750 系列の延長線上にある
    • この系統は 1998 年の Apple Bondi Blue iMac にまでさかのぼる
    • 商用の同系統チップである PowerPC 750CL は最大 TDP が 9.8W で、Wii に入っている版よりクロックが約 33% 高い
  • シングルコア、1990 年代後半のアーキテクチャベース、10W 未満の TDP という条件のため、計算性能は限られる
  • PowerPC 750 系列は宇宙・衛星分野でも使われており、耐放射線版の RAD750 が存在する
    • NASA の資料で PowerPC 750 の使用例を確認できる
    • 火星探査車 Curiosity) と Perseverance) にも関連チップの使用例がある

Wii のソフトモッドと NetBSD のインストール

  • Wii で署名されていないコードを実行するために Wilbrand exploit を使用する
  • Wilbrand は SD カードで Wii Message Board のメッセージを保存・読み込みする機能を利用し、署名されていないコードの実行を可能にする
  • この過程で HackMii をブートし、Homebrew Channel をインストールする
  • 作業にはコンソールの MAC アドレスと、SD カードに置くファイルの生成が必要で、ブラウザベースのツールがこの処理を担う
  • 大きな SDHC カードで Wilbrand を実行すると問題があり、1GB の non-SDHC カードで最もよく動作した
  • NetBSD 用の SD カードは、NetBSD サイトから wii.img.gz イメージをダウンロードして用意する
    • Wii は SDXC 以上をサポートしないため、32GB に制限される
    • NetBSD は Wilbrand より大きなカードに対して敏感ではなく、高速で品質のよい 32GB SDHC カードが選ばれた
  • Raspberry Pi Imager を使うと、イメージの展開、書き込み、検証をまとめて処理できる
  • NetBSD の Wii イメージは、Homebrew Channel から通常のホームブリューアプリのように直接起動できるメタデータと構造を備えている
  • Wii ポートの主要な作者と思われる NetBSD developer Jared McNeill に功績がある

初期システム構成

  • NetBSD 起動後、USB キーボードは正常に動作するが、リモート管理のため SSH を設定した
  • SSH デーモンはデフォルトで動作しており、root パスワードの設定と、sshd_config への PermitRootLogin yes の追加が必要だった
  • 静的ネットワーク設定は /etc/ifconfig.axe0 を編集して構成する
  • ネットワークアダプタには公式の RVL-015 Wii LAN Adapter を使用した
    • dmesg では ASIX Electronics AX88772 USB 2.0 10/100 Ethernet controller と表示される
    • NetBSD 起動後は NetBSD ドライバを使えるため、一般的な USB アダプタも理論上は動作すると見込まれる

パッケージ管理と Web サーバ構成

  • NetBSD の pkgin パッケージマネージャは、環境変数を設定したあと pkg_add pkgin でインストールする
  • パッケージパスには https://cdn.NetBSD.org/pub/pkgsrc/packages/NetBSD/evbppc/10.1/All/ を使用する
  • インストールしたパッケージには bsdfetchiperf3lighttpdnanorsync が含まれる
  • Web サーバには、リソース制約のある環境に合った lighttpd を選択した
  • lighttpd のサンプル rc スクリプトを /etc/rc.d にコピーし、/etc/rc.conflighttpd=YES を追加してから起動する
  • 既定の静的コンテンツパスは /srv/www/htdocs である
  • ブログは Hugo でビルドされた静的ページ群なので、rsync でファイルをコピーしたあと標準 HTTP でそのまま配信できた

TLS 負荷と Caddy リバースプロキシ

  • 長時間の負荷テストの結果、PowerPC 750 は現代的な TLS で暗号化された複数ページを同時に配信すると負荷が大きいことが分かった
  • リソース確保のため、NetBSD でデフォルト起動する一部サービスを無効化した
    • devpubddhcpcdinetdmdnsdpostfix を停止
    • /etc/mailer.confsendmailmailqnewaliases/bin/true に変更し、関連プロセスの起動を防いだ
  • ntpd はシステム RAM の 15.6% を使用するため無効化した
  • 時刻同期は必要なので、ntpdate time.cloudflare.com を毎時 :42 に実行するよう crontab に追加した
  • 最終的に、ブログの TLS 終端 は Wii の前段に置かれた Caddy インスタンスが担当する
    • Caddy はリバースプロキシとして動作し、暗号化と ACME 証明書管理を処理する
    • Caddy ではキャッシュオプションは有効にしていない
    • すべてのリクエストは Wii が直接処理し、この文章の画像まで含めるとページ全体の読み込みはほぼ正確に 1MB である
  • Caddy 層では既知のスクレイパーの User-Agent リクエストをブロックし、Wii に転送されないようにしている

状態監視の構成

  • TLS 終端を Caddy に移したことで、Caddy の Prometheus exporter を利用できるようになった
  • このデータを InfluxDB + Grafana スタックに取り込み、サイト負荷を監視している
  • Wii 自体には Prometheus exporter のような追加プロセスは直接載せていない
  • 代わりに簡単なシェルスクリプトを作成し、crontab から 15 分ごとに実行して、システム状態を Web ルートの HTML ファイルに出力している
  • 状態ページには uname -auptime のような情報が表示される
  • 完全な状態ページは blog.infected.systems/status で確認できる

運用上の制約と電力使用量

  • 全体の構成は予想よりはるかにうまく動作し、インストールも簡単だった
  • NetBSD を再起動すると、NetBSD アプリだけが再起動するのではなく、Wii コンソール全体が再起動して Wii Menu に戻る
  • カーネルパッチやシステムアップグレード後は、Wiimote とセンサーバーが運用インフラの必須構成要素になる
  • UPS 監視ベースのテストでは、Wii はアイドル時にホームラボ全体の消費電力へ約 18W を追加した
  • 計算上の月間電力使用量は約 13.2kWh である
  • 英国の電気料金基準では月額約 £3.47 と計算され、一部クラウド事業者の VPS より安い
  • 長い週末のあいだの楽しい実験で、引き続きうまく動くならしばらく維持するつもりだ
  • 人為的な制約を加えたデプロイ環境では学びが多いという理由で、この種の実験に関心がある

2026 年 2 月更新

2件のコメント

 
ifmkl 2025-04-22

使っていないAndroidスマホにDebianを入れてWebサーバーを動かしていた頃を思い出しますね

 
ndrgrd 2025-04-22

なぜCaddyとlighttpdを同時に使うのかと不思議に思いましたが、静的ファイルだけをWiiで処理し、残りは別のマシンのCaddyで処理する形のようですね。