4.7. QEMU ゲストエージェントの概要

Red Hat Enterprise Linux 6.4 では、QEMU Guest Agent (QEMU GA) が Linux のゲスト仮想マシンを破損から保護していました。スナップショット要求の発行やディスクのバックアップ用コピー作成の前には、管理スタック (libvirt) が virtio-serial ポートを介して guest-fsfreeze-freeze QMP コマンドを QEMU GA に送信し、このコマンドによりゲストエージェントは FIFREEZE ioctl() カーネル関数を用いて仮想マシンの全ファイルシステムを凍結していました。この ioctl() 関数は、ゲスト仮想マシンの Linux カーネルにより実装されています。この関数によってゲスト仮想マシンのカーネル内のファイルシステムキャッシュがフラッシュされ、ファイルシステムが一貫性のある状態となり、そのファイルシステムに対するユーザースペーススレッドの書き込みアクセスが拒否されます。
処理が正常に終了したことを QEMU GA が報告した場合のみ、libvirt によりスナップショットの作成が続行されます。完了時には、libvirt が virtio-serial ポートを介して guest-fsfreeze-thaw QMP コマンドを QEMU GA に送信します。このコマンドは、FITHAW ioctl() を発行するように QEMU GA に指示します。これにより、以前に書き込みアクセスを拒否されたユーザースペーススレッドのブロックが解除され、通常の処理が再開されます。このプロセスでは、仮想ディスクのスナップショットの作成時に、アプリケーションレベルのデータで一貫した状態が確保されませんでした。これが顕著に見られたのは、スナップショットから復元したファイルシステムにおいて、fsck ユーティリティーが問題を検出しなかったにも拘らず、各種アプリケーションがスナップショットの作成時点から処理を開始できず、ユーザースペースの処理によりディスク上のファイルへ内部バッファーの書き込みが行われなかった場合などです。
Red Hat Enterprise Linux 6.5 では、ファイルとアプリケーションレベルの両方での同期 (フラッシング) が確実に行われます。ゲストのシステム管理者は、アプリケーション固有の凍結/解凍フックスクリプトを記述してインストールすることができます。ファイルシステムを凍結する前には、QEMU GA がメインフックスクリプト (QEMU GA パッケージに同梱) を起動します。メインフックスクリプトは次に、ゲストシステムの管理者が用意した個々のアプリケーション固有のスクリプトを呼び出し、それによってゲスト仮想マシンのアプリケーションがすべて一時的に非アクティブ化されます。これらのアクションはすべて、モードが「freeze」に変わってから実行されます。
ファイルシステムが凍結される直前には、ゲストシステムの管理者のスクリプトにより、データベースおよびその他のファイルシステムアプリケーションは作業バッファーを仮想ディスクにフラッシュして、それ以降のクライアント接続の受け入れを停止します。アプリケーションは次にデータファイルを一貫性のある状態にし、再アクティブ化された (または新たに起動された) アプリケーションインスタンスで (バックアップから仮想ディスクを復元した後に) プロセスの再開が可能となります。すべてのスクリプトが実行されて、それぞれのアプリケーションが非アクティブ化され、メインフックスクリプトが返されると、QEMU GA はファイルシステムの凍結を続行し、管理スタックがスナップショットを作成します。これらの処理がすべて完了した後には、スナップショットが作成されていることが確認され、ファイルシステムが書き込み要求に対するサービスを再開します。このプロセスは解凍と呼ばれます。
解凍は凍結の逆の順序で処理されます。 QEMU GA は、libvirt から指示を受けて、ゲスト仮想マシンのファイルシステムを解凍します。次に (メインスクリプトを使って) 個別のフックスクリプトを起動して、凍結プロセス中に非アクティブ化されていたアプリケーションを再開または再起動します。