ぶていのログでぶログ

思い出したが吉日

余ったラズパイで作る自宅サーバ向けリモートKVM

自宅サーバを運用していると突発的なリブートや設定ミスによるアクセス不能などなどが起こり、そのたびにリモートKVMが欲しくなる…。 しかし、リモートKVMは主にエンタープライズ向けで対応した筐体や装置が高額でなかなか手が出づらい…。 そこでどこのご家庭にもある余ったラズパイとPiKVMを使って安価にリモートKVMを作ろうというのがこの記事の趣旨。

PiKVMとは

PiKVMは、Raspberry Pi(ラズパイ)を用いて遠隔地から物理的なコンピュータにキーボード、ビデオ、マウス(KVM)スイッチとしてアクセス可能にするオープンソースプロジェクトである。

この記事を書いている現在(2024/03/24)では、DIY PiKVM V1~v4の4つのバージョンがある。 V3とV4はラズパイ内蔵の完成品になっていて、これらのバージョンを自作することはできない?ので今回の選択肢からは外す。 V1とV2の違いは対応しているラズパイで、ラズパイ2と3、ZeroWに対応しているのがV1で、ラズパイ4とZeroWに対応しているのがV2となっている。 各バージョンの詳しい違いについては、公式リポジトリのREADMEに書いてあるのでそちらを参照してほしい。

pikvm/pikvm: Open and inexpensive DIY IP-KVM based on Raspberry Pi

今回はラズパイ4を使うので、PiKVM V2を使うことにする。

必要な機材

ラズパイ以外に必要な機材があるのでまずはそれを入手する必要がある。

  • ①USB HDMIキャプチャデバイス(2000円くらい)
  • ②HDMIケーブル(800円くらい)
  • ③USBカメラアダプタ(800円くらい)
  • ④USB Type-A オス-オスケーブル(500円くらい)

各機材について詳しく説明する。

①USB HDMIキャプチャデバイス

ラズパイに自宅サーバの画面を取り込むために必要。 PiKVM公式では、TC358743チップを積んだHDMI-CSIブリッジを奨励されていて、これを使うとH.264ビデオへのエンコーディングや解像度の自動検出、低遅延などが実現できるようだ。 スイッチサイエンスなら4200円くらい。

Raspberry Pi用 HDMI-CSI 変換アダプターボードwww.switch-science.com

しかし、安価なUSB HDMIキャプチャデバイスで代替することもできる。 自宅サーバのリモートKVMであれば低遅延である必要もないのでUSB HDMIキャプチャデバイスで十分であろう。 HDMIキャプチャデバイスはLinuxで動けばどれを買ってもいいと思うが、私はAmazonで数量限定タイムセールで1500円くらいで売っていた↓を買った。

https://www.amazon.co.jp/dp/B08LNVN7D6

②HDMIケーブル

特筆することはなし。 強いて言えば、家電量販店で買うとハイエンドのケーブルしか売ってなくてめちゃくちゃ高い。 ダイソーだと300円で売っていてこれで十分かもしれないが、1.5mはちと長いか?

③USBカメラアダプタ

正式名称がわからないのだが、USBカメラアダプタ、Y字ケーブル、Y-splitter cabeあたりのワードで検索できるケーブル。 具体的には、ケーブルが二股に分かれていて片方が電源取り用で片方がデータ転送用になっている。 iPad用などで売られており電源を取りつつ、USBデバイスが使えるみたいな売り込みがされている。

なぜこれが必要かというと、リモートKVMを構成するには自宅サーバのキーボード/マウスとしてラズパイを認識させる必要があるのだが、そうなるとラズパイをUSBホストとして構成する必要があり、ラズパイの電源ポートを使用して自宅サーバと接続することになる。 電源ポートを使うということはラズパイの電源が自宅サーバからの供給のみになり、自宅サーバがシャットダウンされるとラズパイも落ちてしまいリモートKVMとしてはイマイチな感じになる。

# ケーブル一本で済むがラズパイの電源が自宅サーバ依存になる
[ラズパイ]---[自宅サーバ]

# USBカメラアダプタをつかって電源を別から取りつつ自宅サーバにつなぐ
[ラズパイ] ---(USBカメラアダプタ)---[データ側のコネクタ]---[自宅サーバ]
                             +------[電源側のコネクタ]---[USB電源アダプタ]

つまり、USBカメラアダプタをラズパイの電源ポートに刺し電源を取りつつ、自宅サーバと接続できるようにするためにつかうのである。 必須ではないがあったほうがよい。

ちなみにこのケーブルはニッチ過ぎてあまり種類が売っておらず、そしてラズパイ4を使う場合はUSB Type-Cに対応のみになるため選択肢がせばまる。 また、いくつかの製品を試してみたが、ケーブルなどの相性問題があるのか期待した動作をせず*1、いくつか無駄にしてしまったものがある。。 最終的に私は↓で落ち着いたが、環境によっては正しく動作しないかもしれないので参考程度に…

④USB Type-A オス-オスケーブル

規格違反なのに何故か売っているケーブル。 でも、売ってなかったらこの構成にできなかったのでありがたい…。 ③USBカメラアダプタと自宅サーバを接続するために使用する。 USB Type-Cで二股側が両方USB Type-Cになっているケーブルは売っていない*2ので必要になってくる。 なお、③USBカメラアダプタを使わず直結する場合はもちろん不要になる。

準備

機材の準備ができたらケーブルを接続する前に一旦PiKVMのOSイメージをSDカードに書き込み、起動確認をしておくと良いと思う。 PiKVMの書き込みは特殊なことは不要で、Raspberry Pi OSの書き込みと同じ手順で書き込めばよい。 イメージファイルは以下のページからDownloadできる。 今回はDIY PiKVM V2 PlatformのFor HDMI-USB dongleを選べばよい。

docs.pikvm.org

SDカードに書き込めたら起動し、SSHやWebUIにアクセスできるか確認するとよい。 SSHやWebUIの初期パスワードは以下のページに記載されている。

docs.pikvm.org

自宅サーバと接続

PiKVMへのログイン確認ができたら一旦電源を落とし、自宅サーバとの接続を行う。 接続は以下のようにおこなう。

[ラズパイ] ---[①USB HDMIキャプチャデバイス] --(②HDMIケーブル)-- [自宅サーバ]
  |                                                                      |
(③USBカメラアダプタ)                                                    |
  |                                                                      |
  +--[データ側コネクタ]-----(④USB Type-A オス-オス)---------------------+
  |
  +--[電源側コネクタ]-------[USB電源アダプタ]

①USB HDMIキャプチャデバイスをラズパイのUSB2.0ポートの下側に刺す。 ポート指定なのはそのポートでないと自動認識されないためである。 写真ではUSB3.0ポートの下側に刺している…そのため設定変更が必要になる(後述)。

①USB HDMIキャプチャデバイスと自宅サーバのHDMIポートを②HDMIケールで接続する。

③USBカメラアダプタをラスパイの電源ポートに接続する。 USBカメラアダプタを使わない場合は、USB Type-Cケーブルをラズパイの電源ポートに接続し自宅サーバのUSB Type-Cポートに接続する。

④USB Type-A オス-オスを使って③USBカメラケーブルのデータ転送側のポートと自宅サーバのUSBポートを接続する。 自宅サーバのマザーボードの仕様によっては起動時に使えないUSBポートがある*3ので、うまくいかない場合はポートを変えてみる。

動作検証

接続できたらPiKVMと自宅サーバを起動する。 うまく行けばWebUIのリモートKVMで画面が表示されたり、キーボード操作ができるはず…!

設定変更

ここからはPiKVMのソフトウェア部分の設定変更について書く。 PiKVMは基本的にファイルシステムはRead-Onlyになっている。 これは、ROに保つことで突発的な電源断によるファイルシステムの破損を防ぐためである*4 そのため、設定変更するためには一旦ファイルシステムをRead-Write modeにする必要がある。

# Read-Write modeへ移行
[root@pikvm ~]# rw

(設定変更する)

# Read-Only modeに戻る
[root@pikvm ~]# ro

パスワード変更

sshするためのパスワードはpasswdコマンドを使って変更できる。 また、WebUIのパスワードはkvm-htpasswdコマンドで変更できる。 それ以外に公式ドキュメントには2FAの設定方法についても記載されているので、必要であれば参照にしてほしい。

docs.pikvm.org

WiFiの設定

systemdとwpa_supplicantを使ってWiFiを利用することができる。 これについては私は使っていないので公式ドキュメントを参照にしてほしい。

docs.pikvm.org

①USB HDMIキャプチャボードのUSBポートを変更する

①USB HDMIキャプチャボードの接続するUSBポートは指定されていると書いた。 しかし設定変更をすることで別のUSBポートにすることができる。 …というか私がはじめてセットアップしたときにポートが固定されていることに気が付かず、写真のとおりにUSB3.0ポートに刺していてつながらね~っとなっていて設定変更して対応していたのだった(ドキュメントをちゃんと読め)。

PiKVMでは中核となるkvmdというプロセスが動いている。 このプロセスの起動オプションには --device=/dev/kvmd-video が指定されている。 この /dev/kvmd-video がUSB HDMIキャプチャボードのデバイスパスなのだが、udev ruleには以下のように定義されている。

[root@pikvm ~]# cat /etc/udev/rules.d/99-kvmd.rules
# https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name
# https://wiki.archlinux.org/index.php/Udev#Setting_static_device_names
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", PROGRAM="/usr/bin/kvmd-udev-hdmiusb-check rpi4 %b", ATTR{index}=="0", GROUP="kvmd", SYMLINK+="kvmd-video"

/usr/bin/kvmd-udev-hdmiusb-check の実装を見ると1-1.4:1.0というポートのときのみexit 0しているようだった。

        "rpi4")
                case "$model" in
                        "Raspberry Pi 4 Model B Rev 1.1" | "Raspberry Pi 4 Model B Rev 1.2" | "Raspberry Pi 4 Model B Rev 1.4")
                                if [ "$port" == "1-1.4:1.0" ]; then exit 0; else exit 1; fi;;
                        *) exit 0;;
                esac;;

なので、指定されたポート以外に刺しても反応しないのはこのせいなのであった…。 結論としては、/dev/kvmd-video を使わず、直接 kvmdに/dev/video[0-9]を見せればよい。 kvmdの起動オプションを変えるには /etc/kvmd/override.d/kvmd.yaml を作ればよい。

[root@pikvm ~]# rw
[root@pikvm ~]# vim /etc/kvmd/override.d/kvmd.yaml
[root@pikvm ~]# cat /etc/kvmd/override.d/kvmd.yaml
kvmd:
    streamer:
        cmd:
            - /usr/bin/ustreamer
            - --device=/dev/video0
            - --persistent
            - --format=mjpeg
            - --resolution={resolution}
            - --desired-fps={desired_fps}
            - --drop-same-frames=30
            - --last-as-blank=0
            - --unix={unix}
            - --unix-rm
            - --unix-mode=0660
            - --exit-on-parent-death
            - --process-name-prefix={process_name_prefix}
            - --notify-parent
            - --no-log-colors
            - --sink=kvmd::ustreamer::jpeg
            - --sink-mode=0660
[root@pikvm ~]# ro
[root@pikvm ~]# systemctl restart kvmd

高度な使い方

私はWebUIでしか使っていないのだが、より高度な使い方が公式ドキュメントで紹介されている。 ここでは個人的に気になった機能についてピックアップする。

ATX電源の制御

ラズパイのGPIOを使って自宅サーバの電源の制御ができる。 私が自宅サーバに使っているミニPCではATX電源の制御用のピンがないのでこの機能は使っていない…使いたかった… この機能を使う場合は公式ドキュメントのHardware Setupなどを参照してほしい。

docs.pikvm.org

IPMI&Redfish機能

なんとIPMIとRedfishに対応している!!すごい!!! しかし、できることはATX電源の制御(設定していれば)とSerial over LANだけで、私はあまり活用できないので有効化していない。

docs.pikvm.org

おわりに

余ったラズパイとPiKVMをつかって自宅サーバ向けのリモートKVMを安価に作成することができた。 それなりに長い時間運用しているが、結構安定しているのでよくできているなぁっと関心している。 もし自宅に余ったラズパイがあったらPiKVMをいれてみるのはいかがだろうか。

*1:データ転送用のケーブルから電源供給してしまって正しく動作しないとか、USB PDアダプタとの相性なのかそもそも電源が取れないとか…

*2:規格的にUSB Type-Cをスプリットするのが厳しいのだと思う

*3:私の場合はフロントポートが使えなかったので背面に接続している

*4:https://docs.pikvm.org/faq/?h=read+only#first-steps のI can't edit any file on PiKVM. Why is the system in read-only mode?を参照のこと。なお強く非奨励だが無効化もできるようだ。