
キッカケは先日実施したWi-Fiルーターの置き換えに伴う各機器のWLAN接続先変更。
ヘッドレス運用している機器(主にラズパイ)をネットワーク未接続の状況で操作するには外部ディスプレイ/キーボード/ポインティングデバイスの追加が必要になる。
いずれも常用しないため普段は仕舞い込んでいて、引っ張り出して接続する手間が少々面倒。(横着?)
また、今後新調した際にも初期セットアップ時には同様の手間が掛かる。
対象機器のディスプレイ/キーボード/ポインティングに相当するデバイスを既存のPCからエミュレートする仕組みが有ればいい。
リモートKVM(ネットワーク経由であればKVM over IPやIP-KVMなど)と呼ばれるものが該当する。
調べてみると、市販品(安価な民生用~高価な業務用)の他にラズパイなどのワンボードマイコンを使用した物など色々有る。
サーバ監視などの常用ではなく、今回のような設定変更やPCの初期セットアップなど一時的で短時間、且つ、高解像度表示や動画再生などの負荷が高い処理を要求しない操作が殆どのため、処理能力(高解像度や高速描画)はさほど必要ではないし、対象機器がネットワークに接続出来るようになればSSHやVNCでの操作が主になる。
また、手軽に使えるようになるべくコンパクトで、ホストPCとの接続はWLAN、バッテリー運用が可能なら更に良し。
そして、組み上げる過程も楽しみたい。
というわけで、Raspberry Pi Zero 2 Wを使用する「PiKVM DIY v2」を製作することにした。
使用するモジュールや組立時の大まかなレイアウトなどは、下記のリンク先(PiKVM v2用ケースの公開データ)を参考にさせていただいた。
ハードウェア
使用部材
モジュール、ケーブル

ラズパイ本体とUPS HAT以外は、国内では見当たらない・取り扱いが有っても高価なためAliExpressで購入した。
●左上:Raspberry Pi Zero 2 W
GPIOの1番ピン~6番ピンのみ使用するため、ピンヘッダ未実装のモデルを選択し6ピン分のみ実装する。
※フル状態(40ピン全て)のピンヘッダを実装するとHDMI-CSIアダプタボードと干渉してしまう。
使用するmicroSDはClass10で16GB以上の容量が必要。
●左下:UPS HAT (C)
ラズパイ Zero(無印、2)の下に装着し、ポゴピンでGPIO端子(1番ピン~6番ピン:ピンヘッダを実装したハンダ付け面)に接続するためGPIO端子を塞がない。
I2C経由でバッテリー情報(電圧/電流/電力/残量%)を取得出来る。
使用バッテリーは一般的な803040Pサイズで大容量の物も使用可、コネクタ接続のため交換は容易。
UPS HATのメーカー(Waveshare)のWikiページがかなり充実しているのでご紹介。
Raspberry Pi各モデルや多種多様な関連製品(モジュール、拡張ユニット、各種キット、ロボット、アクセサリ)について大変詳しく解説されている。
●中上:HDMI-CSIアダプタボード(C779)
国内でも入手が容易な改良版のC790も使用出来るが、先ずは公開データの構成に従って組んでみる。
また、C790は固定ネジ穴の位置がC779と異なるためケースの変更が必要になる。
●中下:I2C Pi OLED(0.91インチ、GPIOピン接続)
ラズパイのGPIO(ピンヘッダの1番ピン~6番ピン)に直接コネクタ接続するタイプ。
●右:カメラケーブル(Raspberry Pi Zero用、8cm長)
組み立てた際に長すぎず短すぎずの絶妙な長さ。
スタンドオフ、ネジ、シム

四種のモジュールを一部互い違いに積み重ねるため、様々な長さのスタンドオフとシム(ワッシャー)を組み合わせて高さを調整した。
3Dプリンタを使えば任意サイズのスペーサーを作成出来るが、ラズパイ本体とUPS HATは反発力が有るポゴピンで接続する関係で強く結合する必要が有り、他のモジュールもコネクタの抜き差しで掛かる負荷を考慮して、しっかりネジ留め固定できる金属製部材を使用した。
ちなみに、データ公開されているケースはケース内部の凹凸と、併せてプリントするスペーサーで組み上げる構造になっている。
ケース(自作)

大まかな構造や各モジュールのレイアウトなど公開データを参考にして設計し3Dプリントで作成した。(STFデータの改変は経験皆無のため、初めから新規に設計。)
ベースとカバーの噛み合わせやスタンドオフとのネジ留め時の密接具合、各ポートの開口サイズや位置合わせ、OLED用開口部の造形などは現物合わせで微調整と試作を行った。
3Dプリンターを導入したことで、既存のケースを加工するのと比べてサイズやデザインの自由度が大いに上がり、構造や造形などにも凝れるようになった。
組み立て
各モジュールの構成






外観







サイズは幅80×高さ42×奥行き44mm/117g。
ソフトウェア
OSディスク作成(microSDへの書き込み)
OSイメージファイルの入手やOSディスクの作成手順については公式ドキュメント(下記リンク先)を参照。
今回はWindows上のRaspberry Pi Imagerを使用して作成した。
OSイメージファイル:DIY PiKVM V2 Platform ⇒ Raspberry Pi Zero 2 W ⇒ For HDMI-CSI bridge
Wi-Fiルーターへの接続設定(SSID、パスワード)
作成したOSディスク内の「pikvm.txt」ファイルに下記の記述を追加する。
※言うまでもなく、「mynet」と「p@s$$w0rd」は実際に使用するものに置き換える。
WIFI_ESSID='mynet' WIFI_PASSWD='p@s$$w0rd'
・OS作成後に未だ起動していない場合は、同ファイル内に下記の一文が有るので、直下に上記二行を追記する。
FIRST_BOOT=1
・OS作成後に既に起動した場合は、「pikvm.txt」ファイル自体が無いため(初回起動時の初期設定後に自動削除される)、新規にファイルを作成して「WIFI_ESSID」と「WIFI_PASSWD」の行のみを記述する。
※「FIRST_BOOT=1」は記述しない。
トラブル遭遇と解決
OSディスクはWindowsPC(Raspberry Pi Imager)で作成したので、そのまま標準のテキストエディタで「pikvm.txt」ファイルを編集したが、ラズパイにセットして起動してもWi-Fiルーターに接続出来ていないようで、Wi-Fiルーターからも接続デバイスとして認識されない。
(OLED有効化前のため情報は未表示。)
外付けディスプレイを繋いで起動状況を確認してみると、一応シーケンスは動いているもののPiKVMシステムは起動せず。
また、シーケンス表示の中に一瞬「FAILED」の赤文字が見えた。
スクロールが速くて内容が読み取れなかったためiPhoneで動画撮影し、該当箇所で停止⇒拡大表示して確認すると、起動設定(boot option)に関するエラー。
もしかして、「pikvm.txt」ファイルに問題が有るのでは?(Windowsのテキストエディタで編集したのが影響している?)…と考えて、念の為OSディスクの作成からやり直し、「pikvm.txt」ファイルはuConsole(Raspberry Pi CM4/Linux)で編集した。
尚、「pikvm.txt」ファイルは起動成功後に設定を反映したら自動削除されるはずが、エラーが出た時はしっかり残っていた。
再度ラズパイにセットして起動したところ、今度はエラー無くPiKVMシステムが起動し、Wi-Fiルーターへの接続も成功。
I2C OLEDの有効化
PiKVMのタイトル表示内にも有る通り、システムファイルは全て読み出し専用として保護されているため、各種設定ファイルに追記や変更をする際には「rw」コマンドで書き込み可にする必要が有る。 編集後は「ro」コマンドで読み出し専用に戻しておく。 その他、コマンドを実行した際に書き込み不可のエラーが出る場合も上記と同様の処置を行う。
以降はSSH接続して操作する。
SSHログイン時に使用するコンソール・アカウントの初期設定は「root / root」。
※OLED有効化前のため、接続先のIPアドレスは検索ツールやWi-Fiルーターの接続デバイス一覧などで確認する。
OSディスク内の「/boot/config.txt」ファイルの最下行に下記の記述を追加する。
dtparam=i2c_arm=on
OSディスク内の「/etc/modules-load.d/kvmd.conf」ファイルの最下行に下記の記述を追加する。
i2c-dev
下記のコマンドを実行する。
systemctl enable --now kvmd-oled kvmd-oled-reboot kvmd-oled-shutdown
この際に下記のエラーが表示される場合が有るが、OLED(I2C)は再起動後に有効化されるため、本エラーは無視して構わない。
Job for kvmd-oled-reboot.service failed because a fatal signal was delivered to the control process. See "systemctl status kvmd-oled-reboot.service" and "journalctl -xeu kvmd-oled-reboot.service" for details. Job for kvmd-oled-shutdown.service failed because a fatal signal was delivered to the control process. See "systemctl status kvmd-oled-shutdown.service" and "journalctl -xeu kvmd-oled-shutdown.service" for details.
パスワード(コンソール、ウェブ)の変更
コンソールとウェブへのログイン・パスワードを初期設定から変更する。
●コンソール・パスワード変更(コンソール・アカウントの初期設定:root / root)
下記のコマンドを実行する。
passwd
●ウェブ・パスワード変更(ウェブ・アカウントの初期設定:admin / admin)
下記のコマンドを実行する。
kvmd-htpasswd set admin
タイムゾーンの変更
初期設定ではUTCになっているため、下記のコマンドを実行して日本時間に変更する。
timedatectl set-timezone Asia/Tokyo
システムのアップデート
下記のコマンドを実行してPiKVMシステムをアップデートする。
pikvm-update
「pikvm-update」コマンドが認識されない場合は下記のコマンドを実行する。
rw pacman -Syy pacman -S pikvm-os-updater pikvm-update
再起動
再起動し、OLEDに各種情報が表示されることを確認する。
reboot
OLED表示




情報表示は数秒間隔で①と②が切り替わる。
もし変更が可能ならUPS HATのバッテリー残量も表示したい。
Web UI

起動後、OLEDに表示されるIPアドレスへWebブラウザからアクセスするとログイン画面が開く。
UsernameとPasswordにはウェブ・アカウントを入力する。(「2FA code」は入力不要。)

ログインするとメニュー画面が表示される。
・KVM…ターゲットをリモート操作するKVMモード
・Terminal…PiKVM自身を操作するターミナルモード
・Logout…PiKVMからログアウト
KVMモード

ターゲット(他PC)より先にPiKVMを起動しておけば、ターゲットの起動時点からの画面情報が表示される。(ラズパイの場合は正方形の虹色模様も。)
単に表示と操作をエミュレートするだけではなく様々な機能が有り、表示と操作についても細かい設定が可能。
ターミナルモード

コンソール操作の際に使用。
SSH接続と比べて若干の制約が有る。
試用

簡単に、ラズパイ4のWLAN接続設定の変更をリモート操作で行ってみた。
PiKVMはホストとWLANで接続し、UPS HATでバッテリー動作が可能なので、接続はかなりシンプルになる。
WLAN接続設定の変更後にWebサイトを開いたりテキスト入力をしてみた感じでは、画面表示やキー入力に対するレスポンスが特に遅いという感じはしない。

uConsoleと組み合わせればコンパクトで手軽なツールになる…と早速試してみたけれど、流石にこの画面表示は厳しい。
表示やキー操作に対するレスポンスへの不満は無いので、ターゲット側の画面解像度を適正にすれば十分実用になると期待大。