amd64ゲストを稼働させたままTCP経由で2つのホスト間で移動させることが可能になり、最終的な転送フェーズでの停止時間はわずか138〜171ミリ秒です。bhyveハイパーバイザにおけるライブ移行のこの最初の動作状態により、この技術は抽象的な概念からFreeBSD 15.1上でのテスト可能な実装へと移行しました。このプロジェクトは、ホストメンテナンスや負荷分散などのエンタープライズグレードの仮想化機能に必要な基礎インフラを提供することを目的としています。

FreeBSDのbhyveハイパーバイザを使用した仮想マシンのライブ移行を示すスクリーンショット。
FreeBSD bhyve環境内での仮想マシンのライブ移行のデモンストレーション。gyptazy.com

この画像は、記事で説明されているライブ移行プロトタイプの正常な実行を例示しています。

プリコピー移行メカニズム

移行プロセスは、ソースホストが占有されたゲストメモリを宛先へ送信するプリコピーフェーズから始まります。システムは前回のスキャン以降に変更されたページのビットマップを繰り返し取得し、それらの「ダーティ」ページのみを送信して宛先を最新の状態に保ちます。

残りのダーティセットが設定されたダウンタイム目標を満たすほど小さくなると、bhyveはゲストとそのデバイスを一時停止します。その後、最終的なダーティページと、vCPU、カーネル状態、およびエミュレートされたデバイスの既存のスナップショット状態を送信します。

宛先はVMのジオメトリを検証し、状態を復元します。宛先が準備完了を確認した後にのみ、ソースは「GO」コミットポイントを送信し、その時点でソースゲストは正式に引き継がれます。

「目標は意図的に実用的なものです。ライブ移行を抽象的な概念として議論するのではなく、実際の実装をテスト、議論、改善できるようにすることです。」

— FreeBSD bhyve Live Migration: Moving VMs Between Hosts

現在の機能と検証

プロトタイプにはマルチvCPUプロトコルサポートが含まれており、移行のハンドシェイクが正しいvCPU数を保持し、すべてのプロセッサが同期して一時停止および再開されることを保証します。また、ゲストおよびマップされたエミュレーションの書き込みを検証するメモリ整合性チェックも備えています。

デバイスの一時停止および復元パスをテストするために、開発者はファイルを繰り返し書き込み、fsyncするゲスト側のワークロードを実装しました。これは、コールドリブート後のチェックサムを確認することで、移行中にデータが失われなかったことを検証しました。

システムは、宛先への到達不能やプリコピーフェーズ中に宛先が消失する場合を含む、さまざまな失敗モードを処理します。これらのケースでは、データ損失を防ぐためにソースが一時停止したゲストを再開するように設計されています。

ロードマップとエンジニアリングの障害

プロトタイプは有望な結果を示していますが、コードをFreeBSDにアップストリームする前に、いくつかのエンジニアリング要件を満たす必要があります。これには、ビット検査中に書き込みが失われないことを保証するためのカーネル側のダーティページアルゴリズムの強化や、完全な互換性契約の定義が含まれます。

安定したプロダクションバージョンには、現在のTCP輸送には欠けている認証と暗号化を備えた堅牢な輸送プロトコルが必要になります。さらに、プロジェクトは共有ストレージのための特定の整合性とフェンシングの仮定を定義する必要があります。

現在の範囲はamd64アーキテクチャに限定されており、実験的なスナップショットサポートに依存しています。今後の作業では、圧縮やゼロページ省略などのパフォーマンス機能を追加する前に、コミットおよびデバイス側の副作用の境界を洗練することに焦点を当てます。