BitVisor のリモート 開発用マシンを組むときの便利(?)情報

# はじめに
いつぶりか分からないほど久しぶりにブログを書く気がします。こんばんは。
この記事は BitVisor Advent Calendar 2022 の 25 日目の記事になります。

なんやかんやあって今年は BitVisor (ベースの何か) の開発のために結構マシンを組む機会が多かったので、たぶん覚えておいた方が便利だろうことを書き残そうと思います。書かないと忘れるので、はい。
今回は、マシンはワークステーションやサーバーっぽいもので、開発作業はリモートで行うことを想定した際に抑えた方がよいことを主に書きます。それ以外に BitVisor のこの機能を使うならこのデバイスの方がいいかも、的な内容も書いていますがその部分は割といい加減です、ｽﾐﾏｾﾝ。


# 想定構成
BitVisor を動かすマシンと (BitVisor 用マシン) と BitVisor 用マシンからの出力を動かしたり制御したりするためのマシン (以後開発用マシン) の 2 台構成を想定しています。
少なくとも開発用マシンはネットワーク越しにリモートから接続可能であることを想定しています。

# マシンのハードウェア構成
以後は BitVisor 用マシンのハードウェア構成のポイントを書き出します。

## CPU
### コア数
サーバー向けマシンの場合気にしておいた方がいいポイントはコア数を気
最近のサーバー向けマシンだとコア数が滅茶苦茶多いものもありますが、そのようなマシンでは BitVisor がメモリ管理用に確保するメモリ領域が多くなり、メモリ不足で動かなくなるということがありました。
今は改善されているかもしれませんが、コア数は少し気にしておいた方が良さそうです。
メモリ不足の場合は、`core/mm.c` にある `VMMSIZE_ALL` というマクロの値を増やしてみるとよいです。
参考記事
- https://qiita.com/hdk_2/items/77e88fc597511a77e35a
- https://qiita.com/deep_tkkn/items/0ecf479f80caab0f7236

### 機能
VT-x や AMD-v は必須だったり、2 段ページングがあった方がよかったりしますが、いまどきの CPU はだいたいこれらの機能は搭載されていると思うので、あまり気にしなくても良さそうです。
このあたりの機能の有無を気にするのは、Core 2 Duo とか Nehalem とかの世代の CPU かなという気がします (うろ覚えですが...

Intel CPU で Unsafe Nested Virtualization を利用した場合には、VMCS shadowing がある方がよいです。ただ、割とマニアックな機能扱いなのか、購入前にこの機能の有無を調べることは結構難しいです。
これも最近のそこそこのスペック以上の CPU (core i5 以上とか?) ならだいたい入っていそうです。
昔は i7 でも末尾が k (オーバークロックモデル) だと VMCS shadowing がないとかありましたが、最近はどうなんでしょうね?

## メモリ
メモリはたぶんあまり気にしなくて大丈夫だと思います。

## マザーボード
リモート開発の際に重要な点は、マザーボードに COM ポート用ピンヘッダーもしくは背面インターフェイスにシリアルインターフェイスがあるかどうかです。
最近のマザーボードには COM ポートが存在しないものもありますが、リモート開発をする場合にはシリアル出力は不可欠です COM ポートがないマザーボードは避けましょう。
COM 用ピンヘッダーがある場合は、以下のようなアダプタを用意し背面にシリアルインターフェイスを足しましょう。
https://www.startech.com/ja-jp/cables/plate9m16

また、BitVisor がそのマザーボードで動作するかは実際に動かしてみないとわからないところがあります。
理由は ACPI の周りがマザボによってまちまちで、ACPI 関係の処理がうまくいかない時が偶にあるからです。
BitVisor が動かないマザボを引いた時には、BitVisor ビルド時の make config で `CONFIG_ACPI_DSDT` を無効にすると、ACPI 関連の機能が一部無効になる代わりに動いたりするかもしれないです。

## グラフィック
グラフィックデバイス (GPU) なんか関係ないでしょ、と思うかもしれないですが時々関係します。
時々、というのがどういう時かというと、Legacy boot (BIOS boot) しようとするときです。
最近のマザーボードは BIOS boot 時にオンボードグラフィックが使えない (UEFI boot なら使える)、みたいな制約があるものもあり、このようなマシンで BIOS boot でセットアップしようとすると、画面出力が出せなくて詰む、ということがあります。安物でもいいので PCIe 接続の GPU を接続し、そこから画面出力するようにすると解決します。

また、BitVisor のグラフィックに関する機能を利用する場合には Intel 内臓グラフィックがよいと聞いたような気がします。

## デバイス
### ネットワーク
BitVisor のネットワーク関係の機能を利用しないのであれば、ネットワークデバイスはゲスト OS に対してパススルーになるので、特に気にせず好きなデバイスを使って大丈夫だと思います。

BitVisor でネットワーク関係の機能を利用したい場合は以下に準パススルードライバがありそうなデバイスにしておくとよさそうです。
https://sourceforge.net/p/bitvisor/code/ci/default/tree/drivers/net/
具体的には、Intel pro1000, RTL8169, Broadcom NetXtreme, Aquantia AQC107 あたりでしょうか。
実は一つ上のディレクトリに Intel x540 のドライバもあったりします。


### ストレージ
こちらも BitVisor のストレージに関する機能を利用しない場合は特に気にする必要ないと思います。

機能を利用する場合でも、一般的な PC で利用されるストレージデバイスであれば大丈夫だと思います。
具体的には、SATA や NVMe は大丈夫そうです。
RAID カードとか SAS とかは... どうなんでしょうか(調べてない)

# BIOS の設定
## 仮想化関係
Intel であれば vt-x、AMD であれば AMD-V が有効になっているか一応確認しておきましょう。だいたいデフォルトで有効だとは思いますが。
また、IOMMU 関係の機能を利用する場合はその関連機能の設定も調べておきましょう。

## BMC
これがあるなら絶対に使った方が便利です。
BMC が Web UI や CLI のツールで電源管理 (ON/OFF/Cycle) もできるし、シリアル出力や VGA 出力も見ることができます。
ただし、この機能は主にサーバー向けマシンでしか使えないので普通はだいたい使えません...
BitVisor 開発で必要な同等機能を実現するためには、以降の設定 + リブーター + シリアルケーブル接続などが良さそうです。

## 電源設定
通電時に自動でマシンが起動するように設定すると便利なことが多いです。特に、口述するリブーターと組み合わせる場合には必須の設定です。

## コンソールリダイレクト
サーバーやワークステーション向けのマザーボードだとこの機能が搭載されていたりします。
BIOS の出力などをシリアルに出してくれる機能になります。
有効しておくと、シリアル経由で BIOS 設定を変更できるようになるので使えるなら使いましょう。
BMC は搭載していないけどこの機能は搭載している、というマシンはちょいちょいありますので見てみるといいかもしれないです。

# BitVisor 用マシンに接続するもの
ネットワーク以外で接続するものを書きます。

## リブーター
例えば以下のような製品のことを指しています。
- https://www.meikyo.co.jp/product/
これは Web UI や CLI 越しにコンセントの ON/OFF を切り替えることができる製品です。
これを BitVisor 用マシンの電源に接続 + BIOS で通電時に起動する設定 とすることで、BMC が無くてもマシンを強制再起動することができます。
また、リブーターはネットワーク経由でアクセス可能な場所に接続することを忘れずに(開発用マシン経由でも可)

リブーター以外の選択肢として、Raspberry pi など GPIO が制御できてネットワークに接続可能なもの + 簡単な電子工作でも対応可能だったりします。
昔のスライドを参考にしていただければ。
https://www.slideshare.net/DeepTokikane/k-vm-slide-1

## USB-シリアルケーブル
マザーボードのところで書いたシリアルインターフェイスを開発用マシンと接続しましょう。
その際には、シリアル **クロス** ケーブル(メス-メス) とシリアル(オス)-USB の変換アダプタを組み合わせ、開発用マシンの USB に接続することが多いです。


# マシンセットアップ時に便利なグッズ
## HDMI キャプチャデバイス
最近のマシンはだいたい HDMI 出力であることが多いです。
また、サーバー的な用途マシンをセットアップ時だけディスプレイを持ってきて接続するのは結構手間です。
そこで、HDMI-->USB な HDMI キャプチャデバイスを持っておくと、手持ちのノート PC でマシンの HDMI 出力を見ることができ大変便利です。
この手のデバイスは USB 接続側からはカメラデバイスとして認識されるので、カメラ入力を確認できるアプリケーション (Windows だと「カメラ」というアプリがプリインストールされています)で確認できます。また、それらのアプリケーションで撮影したり録画したりすると、画面出力を記録に残すこともでき、何なら普通にディスプレイ繋ぐよりも便利です。

たまに VGA しか出力できないワークステーションやサーバーマシンもあったりするので、それ用に VGA のキャプチャデバイスもあるといいかもしれないですね(試したことないですが)

## キーボードマウス
以下のような、デバドラ不要かつタッチパッドもついている無線キーボードがあると、BIOS 設定などの時に楽かなと思います。
電池切れにはご注意を。
https://amzn.asia/d/hakAljp

# ソフトウェアの設定
基本的にブートローダーとゲスト OS の出力がシリアルに出せるようにしておく必要があります。
詳細は、以下を見ていただければ (slideshare 広告いっぱい出るようになったのでスライド移した方がいいなと思いつつ移せてないです...)
https://www.slideshare.net/DeepTokikane/k-vm-slide-1

# リモート開発環境構築時のポイントまとめ
押さえないといけない要件は 2 つ
- [ ] シリアル入出力をリモートからアクセス可能か?
- [ ] BitVisor 用マシンの電源制御をリモートからできるか?

普通のマシン構築以外で必要なものをまとめてみます。
- [ ] COM ポートピンヘッダー用アダプタ
- [ ] シリアルクロスケーブル (メス-メス)
- [ ] シリアル(メス)-USB ケーブル
- [ ] GPU (安いもので OK, BIOS ブート時のみ)
- [ ] リブーター

セットアップ時にあったらいいもの
- [ ] ビデオキャプチャ
- [ ] 無線キーボード

ハードウェアのセットアップが終わったらやること
- [ ] ブートローダーの設定 (シリアル出力の設定、表示時間の設定など)
- [ ] ゲスト OS の設定 (シリアル出力など)


# まとめ
今年は何度か上記のようなマシンを構築したので、その知見を忘れないために書き出してみました。
誰かの役に立てば幸いです。