オフィスに置いたMac miniをラズパイで遠隔操作できるようにした話

この記事は、[KLab Engineer Advent Calendar 2021](https://qiita.com/advent-calendar/2021/klab) の23日目の記事です。

# はじめに

私が勤めているKLab株式会社では、iOSアプリ用のビルドサーバとしてMac ProやMac miniなどのMacを会社のオフィスに複数設置し運用しています。

KLab株式会社では2020年4月より感染症対策のため原則在宅勤務へと移行しましたが、ビルドサーバであるMacはオフィスに残されたままとなっています。
オフィスに残されたMacの管理はsshとVNCを用いて行っていますが、カーネルパニックが生じるなどして再起動した場合には起動中に遠隔操作が不可能な状態で操作待ちになるという問題があり、クラッシュした際は出社し直接操作して起動していました。

このような事態は頻繁に起きるわけではありません。
しかし、Macを起動するためだけに出社をするのは面倒なので、クラッシュ後も遠隔で復旧できるようにしたいと考えますよね？
そこで、Raspberry Piを使ってMac miniを外部から遠隔操作できるようにしました。

![Mac miniの上に載るRaspberry Pi 4 Model Bの図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321966/225e66ee-aeee-f88b-58c0-46f6d5f76e7d.jpeg)

## KVM over IPによる遠隔操作

KVMとは Keyboard Video Mouse の略です。KVMをIPネットワーク経由で利用できるようにする仕組みを、KVM over IP、IP-KVMやRemote KVMなどと呼んだりします。

KVM over IPは、いわゆるPCサーバではBMC (Baseboard Management Controller) に組み込まれていたり、企業向けのデスクトップPCでもチップセットに組み込まれている場合があり、これらのマシンはOS非依存で遠隔操作することができます。

しかし、最近のMacにはKVM over IPに該当する機能は搭載されていません。

一般にMacを遠隔操作しようとする場合、sshやVNCを使用すると思います。
しかし、sshやVNCはmacOS上で動くサービスにより提供されているため、macOSが起動していない状態では利用できません。
OS非依存で遠隔操作をすることはMac単体では出来ないため、外部デバイスにより遠隔操作を行うことにします。

外部デバイスによるKVM over IPを実現するハードウェアは、既製品では安価なものでも10万円弱と少々値が張ります。
そこで、ご家庭や社内に転がっているRaspberry Piを使って既製品より安価に自作してみたいと思います。

# 構成

## ハードウェア
主なハードウェアの構成は次の図のようになっています。
![ハードウェア構成図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321966/ef2e525f-df42-0ce7-a4a5-27024208f7bc.png)
Mac miniの電源を入れるには電源ボタンを押す必要があります。
そこで、Mac miniにサーボモータを取り付け、Raspberry Piからサーボモータを動かすことで電源ボタンを押し、Mac miniの電源を入れられるようにしました。

### 部品一覧
今回組み立てた際に使用した部品の一覧を以下に記載します。合計金額は14,847円でした。
ご興味のある方は、ぜひご自分でも組み立ててみてください。

| 購入先 | 購入物 | 参考価格 |
| --- | --- | ---: |
| Amazon.co.jp | [ヒートシンク一体型ケース (Raspberry Pi 4 Model B用)](https://www.amazon.co.jp/dp/B07X47L6DD) | ¥2,960 |
| Amazon.co.jp | [USB A-A延長ケーブル 15cm](https://www.amazon.co.jp/dp/B000E5CYW8) | ¥375 |
| Amazon.co.jp | [USB 給電アダプタ (5V 2A 電源付き)](https://www.amazon.co.jp/dp/B01FVV7TSI) | ¥2,027 |
| Amazon.co.jp | [USB A-Cケーブル 30cm L字コネクタ](https://www.amazon.co.jp/dp/B097PJLG39) | ¥1,073 |
| Amazon.co.jp | [HDMIケーブル 0.7m](https://www.amazon.co.jp/dp/B00HQY7U1K) | ¥698 |
| Amazon.co.jp | [クッションゴム 22個入り](https://www.amazon.co.jp/dp/B00V5MQQ5A) <br>(Mac miniの電源ボタンへ貼り付け、サーボで押しやすくするために使用) | ¥364 |
| 秋月電子通商 | [[M-14806] FEETECHサーボ FS90](https://akizukidenshi.com/catalog/g/gM-14806/) <br> (SG-90はノイズが出るため代替不可) | ¥360 |
| 秋月電子通商 | [[C-12439] コネクタ用ハウジング 2×10 (20P)](https://akizukidenshi.com/catalog/g/gC-12439/) | ¥30 |
| 秋月電子通商 | [[M-14839] Raspberry Pi4 Model B 2GB](https://akizukidenshi.com/catalog/g/gM-14839/) (4GB, 8GBモデルも可) | ¥5,200 |
| 秋月電子通商 | [[S-15844] KIOXIA EXCERIA  microSDHC 32GB](https://akizukidenshi.com/catalog/g/gS-15844/) (16GB以上必須) | ¥780 |
| サウンドハウス | [HDMIビデオキャプチャー USB2.0接続](https://www.soundhouse.co.jp/products/detail/item/280483/) | ¥980 |
(参考価格は2021年10月頃に調査した際の価格です。)


## ソフトウェア

ソフトウェアには[PiKVM](https://pikvm.org/)を使用しました。

PiKVMは、Raspberry Piを使って安価なKVM over IPを作るプロジェクト、およびその成果物のソフトウェアです。
Arch LinuxをベースとしたOSのイメージが公開されており、microSDに書き込んでRaspberry Piを起動するだけでKVMとして利用できます。

Raspberry Piを長期運用する場合に気になる点として、microSDの書き込み寿命があります。
PiKVMではReadonly rootfsがデフォルトで有効になっており、書き込み寿命を気にする必要がありません。

### Mac UEFIのUSB HIDドライバにおける互換性の問題

このまま「ラズパイにPiKVMをインストールしたよ！」だけで記事が終わってしまいそうですが、実はここにたどり着くまでに大きな問題が一つありました。

実は去年の10月頃にも、社内でRaspberry Piを使ったKVM over IPを自作しようという試みがありました。
しかし、Macを再起動した際にRaspberry Piによる仮想USBキーボードが認識されず、ログイン操作ができないという問題が生じていました。

この問題は、Macの設定と接続されたUSBキーボードの組み合わせで生じます。

FileVaultが有効な場合、macOSが起動する前にUEFIファームウェア上でパスワード入力画面が表示されます。
ここでOUT Endpointを有するUSBキーボードを接続していると、MacのUEFIファームウェアに内蔵されたUSB HIDドライバがUSBキーボードを認識できず、パスワードを入力できなくなります。

Raspberry PiをKVM over IPとして使う場合、キーボードとマウスのエミュレーションは[Linux USB HID gadget driver](https://www.kernel.org/doc/html/latest/usb/gadget_hid.html)を使って実装されます。
このLinux USB HID gadget driverはデフォルトでIN EndpointとOUT Endpointを一つずつ生成するため、Mac UEFIのデバイスドライバの問題により認識されなくなっていました。

この問題への対策としてカーネルパッチを書こうと思ったのですが、自分で書くまでもなく[OUT Endpointを省略するオプションを追加するパッチ](https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-5.15.y&id=d7428bc26fc767942c38d74b80299bcd4f01e7cb)がmainlineに取り込まれており、2021年10月31日にリリースされたLinux 5.15より利用可能になっていました。
追加されたオプションを利用することで、Raspberry Piによる仮想USBキーボードをMacのUEFI上で認識させることができます。

なお、このパッチはPiKVMの開発者であるMaxim Devaev氏が書いたもので、PiKVMにはLinux 5.15のリリース前から修正パッチが取り込まれていたようです。

# おわりに

試験導入と称してPiKVMをインストールしたRaspberry Piを1台用意し、今年の11月からオフィスにあるMac miniへ取り付けて運用を開始しました。
これでmacOSがクラッシュしてもリモートで復旧できるようになり、不意の出社をせずに済みますね！