先日virtioデバイスドライバを書いたので,Google Compute Engineで使ってみることにした。 上のスクリーンショットを見ると,きちんとDHCPからIPアドレスを取得できていることがわかる。 Web APIサーバもきちんと動いた。
独自OS on GCE
GCEのドキュメントには Building custom operating systems というGoogle側で用意していないOSを動かしたい人向けの情報が載っている。GCEでは以下の実行環境を提供している:
- x86_64 CPU。今のところGCEはArm等違うアーキテクチャのインスタンスは提供していない。
- virtio-net (legacy device)
- virtio-scsi (未検証だがたぶんlegacy device)
Reseaは修正の必要なくf1-microインスタンスで一発で動いてくれたので,エミュレータで動くならGCEでもすんなり動くものなんだろう。 ただし,ネットワーク周りにはいくつか落とし穴がある:
- GCEのvirtio-netデバイスはどうやら Legacy Device(virtioの古い仕様に従うデバイス)らしい。 Modern Deviceではないのは意外だが,Compute Engine Virtual NICというものを作っているようなので,virtioではなく独自路線に進んでいくのだろうか。
- ブロードキャストパケットは他のVMには流れない。そもそも許可していないらしいので,OSがきちんとパケットを送信できているかパケットキャプチャして確認できない。Packet Mirroringを使えばわかるのかも。
- DHCP DISCOVERのBROADCASTフラグが立っていないとDHCPサーバは返事をしない。
デプロイの流れ
GCEはISOファイルからの起動はサポートしていないので少し手間がかかる:
- 生(raw)のハードディスクイメージを作る。
- ハードディスクイメージをGoogle Cloud Storageへアップロード
- イメージを登録(
gcloud compute images create
) - ディスクを作成(
gcloud beta compute disks create
) - VMを作成(
gcloud beta compute instances create
)
デバッグ
シリアルポートの出力を gcloud compute instances get-serial-port-output
から見ることができるので便利。
後は勘で頑張る。
余談
GCEはKVMらしいので,QEMUで動くならGCEでも動いて当たり前だろうと思っていたらKVMは使っているがQEMUは使っていないらしい。セキュリティのために自分たちでハードウェアエミュレーション部分を作り直すというはかっこいいですね。