OpenStack のスナップショット機能により、実行中のインスタンスから新しいイメージを作成できます。これは、基本イメージをアップグレードしたり、公開イメージを取得してローカル向けにカスタマイズしたりする場合に非常に便利です。CLI を利用して、実行中のインスタンスのスナップショットを取得し、イメージを作成する方法:
$ nova image-create <instance name or uuid> <name of new image>
「イメージ & スナップショット」のページでは、内容が以下のように分類されているので、ダッシュボードのスナップショットのインターフェースは紛らわしいです。
イメージ
インスタンスのスナップショット
ボリュームのスナップショット
しかしながら、インスタンスのスナップショットはイメージです。Glance に直接アップロードしたイメージと、スナップショットにより作成したイメージとの唯一の違いは、スナップショットにより作成されたイメージが glance データベースにおいて追加のプロパティを持つことです。これらのプロパティは image_properties テーブルで確認でき、次の項目を含みます。
名前 | 値 |
---|---|
image_type |
スナップショット |
instance_uuid |
<スナップショットされたインスタンスの UUID> |
base_image_ref |
<スナップショットされたインスタンスの元イメージの UUID> |
image_location |
スナップショット |
Sébastien Han さんの OpenStack: Perform Consistent Snapshots ブログエントリー (http://www.sebastien-han.fr/blog/2012/12/10/openstack-perform-consistent-snapshots/) からのコンテンツです。
スナップショットは、ファイルシステムの状態をキャプチャーしますが、メモリーの状態をキャプチャーしません。そのため、スナップショットに期待するデータが含まれることを確実にするために、次のことを確実にする必要があります。
実行中のプログラムがコンテンツをディスクに書き込んだこと
ファイルシステムが「ダーティー」バッファーを持たないこと: 「ダーティー」バッファーがあるとは、プログラムがディスクに書き込むためにコマンドを発行しましたが、オペレーティングシステムがまだ書き込みを完了していないことです。
(データベースのような) 重要なサービスがコンテンツをディスクに書き込んだことを保証するために、それらのアプリケーションのドキュメントを読んで、コンテンツをディスクに同期させるためにどのコマンドを発行する必要があるかを調べることを推奨します。ディスクに同期させるための方法がはっきり分からない場合、最も安全な方法は単にこれらの実行中のサービスを通常通り停止することです。
「ダーティー」バッファーの問題を解決するために、スナップショットの前に sync コマンドを使用することを推奨します。
# sync
sync
を実行することにより、ダーティーバッファー (変更されたが、ディスクに書き込まれていないバッファー済みブロック) をディスクに書き込みます。
ファイルシステムが一貫性を持つことを保証するためには、単に sync
を実行するだけでは不十分です。fsfreeze
ツールを使用することを推奨します。これは、ファイルシステムに対する新規アクセスを停止し、スナップショットに適した安定したイメージをディスクに作成します。fsfreeze は ext3, ext4 および XFS を含むいくつかのファイルシステムをサポートします。仮想マシンのインスタンスが Ubuntu において実行されていれば、fsfreeze を取得するために util-linux パッケージをインストールします。
# apt-get install util-linux
お使いのオペレーティングシステムに利用可能なバージョンの fsfreeze がなければ、代わりに xfs_freeze を使用できます。これは Ubuntu の xfsprogs パッケージにおいて利用可能です。「xfs」という名前にもかかわらず、xfs_freeze は Linux カーネル 2.6.29 またはそれ以降を使用していれば ext3 や ext4 においても動作します。それは 2.6.29 において開始された仮想ファイルシステム (VFS) レベルで動作するためです。xfs_freeze は fsfreeze と同じ名前のコマンドライン引数をサポートします。
永続ブロックストレージのスナップショットを取得したい例を検討します。ゲストオペレーティングシステムにより /dev/vdb として認識され、/mnt にマウントされているとします。fsfreeze コマンドが 2 つの引数を受け取ります。
-f: システムをフリーズします
-u: システムを解凍 (フリーズ解除) します
スナップショットの準備においてボリュームをフリーズするには、インスタンスの中で root として次のとおり実行します。
# fsfreeze -f /mnt
fsfreeze コマンドを実行する前に、ファイルシステムをマウントする必要があります。
「fsfreeze -f」コマンドが発行された場合、ファイルシステム内で進行中のすべてのトランザクションが完了することが認められます。新規書き込みのシステムコールは停止されます。そして、ファイルシステムを変更する他のコールは停止されます。最も重要なこととしては、すべてのダーティーデータ、メタデータ、およびログ情報がディスクに書き込まれることです。
ボリュームがフリーズ状態になったら、ボリュームの読み書き命令が止まってしまうので、ボリュームの読み書きを行わないようにしてください。オペレーティングシステムがすべての I/O 操作を停止し、すべての I/O 試行がファイルシステムがフリーズ解除されるまで遅延させられます。
fsfreeze コマンドを発行すると、スナップショットを実行しても安全です。たとえば、インスタンスが mon-instance という名前で、mon-snapshot という名前のイメージにスナップショットを取得したければ、以下のとおり実行します。
$ nova image-create mon-instance mon-snapshot
スナップショットの作成が終わったら、インスタンスの中で root として以下のコマンドを用いて、ファイルシステムをフリーズ解除できます。
# fsfreeze -u /mnt
ルートファイルシステムをバックアップしたければ、プロンプトがフリーズしてしますので、上のコマンドを単純に実行できません。代わりに、インスタンスの中で root として以下の 1 行を実行します。
# fsfreeze -f / && sleep 30 && fsfreeze -u /