Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
コンテンツコンテンツ
仮想化ガイド
  1. 前書き
  2. I 概要
    1. 1 仮想化技術
    2. 2 仮想化シナリオ
    3. 3 Xen 仮想化の紹介
    4. 4 KVM 仮想化の紹介
    5. 5 仮想化ツール
    6. 6 仮想化コンポーネントのインストール
  3. II libvirt を利用した仮想マシンの管理
    1. 7 libvirt デーモン
    2. 8 VM ホストサーバ の準備
    3. 9 ゲストのインストール
    4. 10 基本的な VM ゲスト の管理
    5. 11 接続と認可
    6. 12 高度なストレージ設定
    7. 13 仮想マシンマネージャ を利用した仮想マシンの設定
    8. 14 virsh を利用した仮想マシンの設定
    9. 15 Xen から KVM への移行ガイド
  4. III 全ハイパーバイザ共通の機能
    1. 16 ディスクのキャッシュモード
    2. 17 VM ゲスト の時刻設定
    3. 18 libguestfs
    4. 19 QEMU ゲストエージェント
    5. 20 ソフトウエア TPM エミュレータ
    6. 21 VM ゲスト に対するクラッシュダンプの作成
  5. IV Xen を利用した仮想マシンの管理
    1. 22 仮想マシンホストの設定
    2. 23 仮想ネットワーク
    3. 24 仮想環境の管理
    4. 25 Xen 内でのブロックデバイス
    5. 26 仮想化: オプション設定
    6. 27 管理作業
    7. 28 XenStore: ドメイン間で共有される設定データベース
    8. 29 Xen の高可用性仮想化ホストとしての使用
    9. 30 Xen: 準仮想化 (PV) ゲストから完全仮想化 (FV/HVM) ゲストへの変換
  6. V QEMU を利用した仮想マシンの管理
    1. 31 QEMU の概要
    2. 32 KVM VM ホストサーバ の構築
    3. 33 ゲストのインストール
    4. 34 qemu-system-ARCH を利用した仮想マシンの実行
    5. 35 QEMU モニタを利用した仮想マシンの管理
  7. VI トラブルシューティング
    1. 36 内蔵ヘルプとパッケージのドキュメンテーション
    2. 37 システム情報とログの収集
  8. 用語集
  9. A NVIDIA カードに対する GPU パススルー の設定
  10. B GNU ライセンス
ナビゲーション
適用先 openSUSE Leap 15.6

33 ゲストのインストール Edit source

virt-managervirt-install など、 libvirt ベースのツールを利用することで、仮想マシンの構築から管理までを便利に行うことができます。実態としては、これらは qemu-system-ARCH コマンドのラッパーとして動作していますが、 libvirt ベースのツールを使用せずに qemu-system-ARCH を直接使用することもできます。

警告
警告: qemu-system-ARCH と libvirt の関係性について

qemu-system-ARCH で作成した 仮想マシン は、 libvirt ベースのツールから参照することはできません。

33.1 qemu-system-ARCH を利用した基本的なインストール Edit source

下記の例では、 SUSE Linux Enterprise Server 11 をインストールした仮想マシンを作成します。各コマンドに対する詳細に名説明については、それぞれのマニュアルページをお読みください。

仮想環境内で使用するシステムのイメージを作成していない場合は、まずインストールメディアでイメージを作成します。この場合、ハードディスクイメージを新規に作成して、インストールメディアのイメージを取得するか、インストールメディアそれ自身を用意します。

まずは qemu-img でハードディスクを作成します。

> qemu-img create1 -f raw2 /images/sles/hda3 8G4

1

create を指定することで、 qemu-img に対して新しいイメージを作成するよう指示しています。

2

-f パラメータでディスク形式を指定しています。

3

イメージファイルのフルパスを指定しています。

4

イメージのサイズ (この場合は 8 GB) を指定しています。イメージは スパースイメージファイル として作成され、ディスクにデータが書き込まれていくことで実際のサイズが増えていく形態になります。ここで指定したサイズは、イメージファイルの最大サイズを指定していることになります。

少なくとも 1 台のハードディスクを作成したら、あとは qemu-system-ARCH を実行して仮想マシンを起動し、インストールシステムを開始します:

# qemu-system-x86_64 -name "sles"1-machine accel=kvm -M pc2 -m 7683 \
-smp 24 -boot d5 \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw6 \
-drive file=/isos/SLE-15-SP6-Online-ARCH-GM-media1.iso,index=1,media=cdrom7 \
-net nic,model=virtio,macaddr=52:54:00:05:11:118 -net user \
-vga cirrus9 -balloon virtio10

1

ウインドウのタイトル部や VNC サーバに接続した際に表示される仮想マシンの名前を指定しています。この名前は他の仮想マシンと重複していてはなりません。

2

マシンの種類を指定します。設定可能な値の一覧を表示するには、 qemu-system-ARCH -M ? と入力して実行してください。なお pc を指定すると、既定値である Standard PC (標準 PC) を指定したものとみなされます。

3

仮想マシンに対して割り当てる最大メモリ量を指定しています。

4

2 台のプロセッサが搭載された SMP システムであることを指定しています。

5

起動の順序を指定しています。設定可能な値は a , b (フロッピィディスク 1 台目および 2 台目), c (1 台目のハードディスク), d (1 台目の CD-ROM), n から p まで (ネットワークアダプタの 1 枚目から 3 枚目によるネットワーク起動) のいずれかです。既定値は c です。

6

1 台目 ( index=0 ) のハードディスクを定義しています。ここでは、準仮想化 ( if=virtio ) ドライブとして提供し、 raw 形式を使用する設定が書かれています。

7

2 台目 ( index=1 ) のドライブは CD-ROM として動作するイメージドライブであることを指定しています。

8

準仮想化 ( model=virtio ) ネットワークアダプタを、 MAC アドレス 52:54:00:05:11:11 で定義しています。なお、 MAC アドレスの重複が発生しないように設定してください。重複が発生すると、通信ができなくなってしまいます。

9

グラフィックカードを指定しています。 none を指定すると、グラフィックカードが無効化されます。

10

準仮想化型のバルーンデバイスを定義し、メモリ量を動的に変更できるように設定しています (ただし -m で指定したサイズは超えないものとします) 。

ゲスト側のオペレーティングシステムのインストールが完了したら、あとは CD-ROM ドライブ無しで仮想マシンを起動することができます:

# qemu-system-x86_64 -name "sles" -machine type=pc,accel=kvm -m 768 \
-smp 2 -boot c \
-drive file=/images/sles/hda,if=virtio,index=0,media=disk,format=raw \
-net nic,model=virtio,macaddr=52:54:00:05:11:11 \
-vga cirrus -balloon virtio

33.2 qemu-img を利用したディスクイメージの管理 Edit source

上記の章 (33.1項 「qemu-system-ARCH を利用した基本的なインストール」) では qemu-img コマンドを利用してハードディスクのイメージを作成してきましたが、このコマンドは一般的なディスク操作にも使用することができます。本章では、ディスクイメージをより柔軟に管理するための qemu-img のサブコマンドについて紹介しています。

33.2.1 qemu-img の実行に関する一般的な情報 Edit source

qemu-imgzypper と同様に、サブコマンドを指定してさまざまな処理を行います。それぞれのサブコマンドにはそれぞれのオプションが用意されています。オプションによっては一般的なもののほか、サブコマンド特有のものも存在しています。オプションの一覧について、詳しくはマニュアルページ ( man 1 qemu-img ) をお読みください。また、 qemu-img は、下記のような書式で実行します:

> qemu-img サブコマンド [オプション]

また、下記のようなサブコマンドに対応しています:

create

ファイルシステム内に新しいディスクイメージを作成します。

check

既存のディスクイメージ内にエラーがないかどうかをチェックします。

compare

2 つのイメージファイル内に同じ内容が含まれているかどうかを確認します。

map

イメージファイル名とそのファイルチェインのメタデータをダンプ出力します。

amend

指定したイメージファイルに対して、イメージ形式固有のオプションを修正します。

convert

既存のディスクイメージを異なる形式に変換して新しいディスクイメージを作成します。

info

ディスクイメージに関する情報を表示します。

snapshot

既存のディスクイメージに対するスナップショットを管理します。

commit

既存のディスクイメージに対する変更を適用します。

rebase

既存のイメージを利用して新しいベースイメージを作成します。

resize

既存のディスクイメージのサイズを拡張/縮小します。

33.2.2 ディスクイメージの作成/変換/検査 Edit source

本章では、ディスクイメージの作成方法や状態の確認方法、ディスクイメージ形式の変換方法、そしてディスクイメージの詳細情報の取得方法について説明しています。

33.2.2.1 qemu-img create Edit source

qemu-img create は VM ゲスト のオペレーティングシステム向けに新しいディスクイメージを作成するコマンドです。このコマンドは下記のような書式で実行します:

> qemu-img create -f fmt1 -o options2 fname3 size4

1

作成するイメージの形式を指定します。サポートされている形式は、 raw , qcow2 の 2 種類です。

2

イメージ形式によっては、コマンドラインに追加のオプションを指定することができるものもあります。この追加のオプションは -o オプションで指定します。 raw イメージ形式の場合は size オプションにのみ対応しています。そのため、コマンドの末尾でサイズを指定する代わりに、 -o size=8G のように指定してサイズを設定することもできます。

3

作成すべきディスクイメージファイルのフルパスを指定します。

4

作成するディスクイメージのサイズを指定します (-o size=<イメージサイズ> オプションを指定しなかった場合) 。サイズ指定では、それぞれ下記の単位接尾辞を使用することができます: K (キロバイト), M (メガバイト), G (ギガバイト), T (テラバイト)

たとえば新しいディスクイメージ sles.raw/images ディレクトリ内に作成し、最大サイズを 4 GB として設定したい場合は、下記のコマンドを入力して実行します:

> qemu-img create -f raw -o size=4G /images/sles.raw
Formatting '/images/sles.raw', fmt=raw size=4294967296

> ls -l /images/sles.raw
-rw-r--r-- 1 tux users 4294967296 Nov 15 15:56 /images/sles.raw

> qemu-img info /images/sles.raw
image: /images/sles11.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 0

上記の通り、新しく作成したイメージの 仮想的な サイズは 4 GB ですが、実際のサイズは 0 バイトになっています。これは、イメージに対してまだ何もデータを書き込んでいないためです。

ヒント
ヒント: btrfs ファイルシステム内での VM ゲスト イメージについて

btrfs ファイルシステム内にディスクイメージを作成する必要がある場合、 btrfs に搭載されたコピーオンライト機能によって、性能劣化が発生する場合があります。この場合に備えて、 nocow=on オプションを指定してイメージを作成することができます:

> qemu-img create -o nocow=on test.img 8G

なお、コピーオンライト機能を使用したい (たとえばスナップショットの作成や仮想マシン間を跨いだ共有など) 場合は、 nocow オプションを指定せずに実行してください。

33.2.2.2 qemu-img convert Edit source

qemu-img convert はディスクイメージを他の形式に変換するためのコマンドです。 QEMU でサポートされるイメージ形式の一覧を表示したい場合は、 qemu-img -h と入力して実行し、出力の末尾のほうをご覧ください。このコマンドは下記のような書式になっています:

> qemu-img convert -c1 -f fmt2 -O out_fmt3 -o options4 fname5 out_fname6

1

作成するディスクイメージを圧縮するための指定です。 qcow および qcow2 形式のみで指定することができます。

2

元となるディスクイメージの形式を指定します。通常は自動検出されるため、省略してもかまいません。

3

作成するディスクイメージの形式を指定します。

4

作成するディスクイメージ形式に対する追加のオプションを指定します。 -o ? とオプションを入力して実行すると、指定したディスクイメージ形式で利用できるオプションの一覧を表示することができます。

5

変換元となるディスクイメージのパスを指定します。

6

変換先のディスクイメージのパスを指定します。

> qemu-img convert -O vmdk /images/sles.raw \
/images/sles.vmdk

> ls -l /images/
-rw-r--r-- 1 tux users 4294967296 16. lis 10.50 sles.raw
-rw-r--r-- 1 tux users 2574450688 16. lis 14.18 sles.vmdk

選択したイメージ形式で利用可能なオプションの一覧を表示するには、下記のようなコマンドを入力して実行します (下記の vmdk を使用したい形式に置き換えて実行してください):

> qemu-img convert -O vmdk /images/sles.raw \
/images/sles.vmdk -o ?
Supported options:
size             Virtual disk size
backing_file     File name of a base image
compat6          VMDK version 6 image
subformat        VMDK flat extent format, can be one of {monolithicSparse \
    (default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat}
scsi             SCSI image

33.2.2.3 qemu-img check Edit source

qemu-img check コマンドは、既存のディスクイメージ内にエラーが無いかどうかを調査します。なお、ディスクイメージ形式によっては、この機能に対応していないものもあります。このコマンドは下記のような書式で実行します:

> qemu-img check -f fmt1 fname2

1

元となるディスクイメージの形式を指定します。通常は自動検出されるため、省略してもかまいません。

2

確認を行うディスクイメージのパスを指定します。

何もエラーが検出されない場合、コマンドは何も出力を行いません。それ以外の場合、それぞれのエラーと発生したエラーの数が表示されます。

> qemu-img check -f qcow2 /images/sles.qcow2
ERROR: invalid cluster offset=0x2af0000
[...]
ERROR: invalid cluster offset=0x34ab0000
378 errors were found on the image.

33.2.2.4 既存のディスクイメージのサイズ拡張 Edit source

新しいイメージを作成する場合、イメージを作成する前に最大サイズを指定しなければなりません (詳しくは 33.2.2.1項 「qemu-img create」 をお読みください) 。ですが、 VM ゲスト をインストールしてしばらく使用していると、最初に指定したサイズでは容量が不足してしまうことがあります。このような場合は、容量を増やして対応することができます。

既存のディスクイメージを 2 GB だけ拡張したい場合は、たとえば下記のように入力して実行します:

> qemu-img resize /images/sles.raw +2GB
注記
注記

ディスクイメージサイズの変更を行うには、ディスクイメージの形式が raw , qcow2 のいずれかでなければなりません。それ以外の形式になっているイメージのサイズを変更したい場合は、 qemu-img convert でサイズ変更可能な形式に変換してから実施してください。

これでイメージファイルの末尾には 2 GB の空き領域が現れることになります。あとは既存のパーティションをサイズ変更するか、もしくは新しくパーティションを作成することで、その領域を使用できるようになります。

33.2.2.5 qcow2 ファイル形式向けの高度なオプション Edit source

qcow2 は QEMU で使用されるメインのディスクイメージ形式です。サイズを必要に応じて拡張する機能が用意されているほか、仮想マシン側で実際に必要とされているサイズのみを割り当てる機能があります。

qcow2 形式のファイルは固定のサイズを 1 つの単位としてまとめられています。これらの単位は クラスタ と呼ばれます。ゲスト側からの見た目での仮想ディスクは、このクラスタのサイズごとに区切られているものとして提供されます。 QEMU の既定では、クラスタのサイズは 64 kB に設定されていますが、新しいイメージを作成する際に異なるサイズを設定することもできます:

> qemu-img create -f qcow2 -o cluster_size=128K virt_disk.qcow2 4G

qcow2 形式のイメージには、 L1, L2 テーブルと呼ばれる、 2 階層のテーブルセットが含まれています。 L1 テーブルはディスクイメージごとに 1 つしか存在しませんが、 L2 テーブルはイメージファイルの大きさに合わせて多数のものが存在しています。

仮想ディスクへの読み込みや書き込みが発生すると、 QEMU は対応する L2 テーブルを読み込んで、必要なデータの場所を検出します。それぞれの I/O 操作に対応したテーブルの読み込み処理にはシステムのリソース消費が伴いますので、 QEMU ではディスクアクセスの速度を向上させるため、メモリ内に L2 テーブルのキャッシュを保持するようになっています。

33.2.2.5.1 適切なキャッシュサイズの選択 Edit source

キャッシュサイズは割り当て済みの領域の量にあわせて決まります。 L2 キャッシュは下記の仮想ディスクサイズの計算式が出発点となります:

ディスクサイズ = L2_キャッシュのサイズ * クラスタサイズ / 8

既定のクラスタサイズである 64 kB であれば、上記の式は下記のようになります:

ディスクサイズ = L2_キャッシュのサイズ * 8192

このことから、既定のクラスタサイズであるとすると、ディスク領域をマッピングするためのキャッシュは、下記のようになります:

L2_キャッシュのサイズ = ディスクサイズ_(GB) * 131072

QEMU では、既定で L2 テーブルのキャッシュが 1 MB (1048576 バイト) に設定されています。上記の数式に当てはめると、 1 MB のキャッシュはディスクサイズで 8 GB (1048576 / 131072) 分になります。つまり、作成する仮想ディスクのサイズが 8 GB までであれば、 L2 テーブルのキャッシュサイズは十分であることになります。それより大きいディスクの場合は、 L2 テーブルのキャッシュサイズを増やすことによって、ディスクの速度を上げることができます。

33.2.2.5.2 キャッシュサイズの設定 Edit source

キャッシュサイズの指定を行うには、 QEMU のコマンドラインに対して -drive オプションを指定します。それ以外の方法としては、 QMP との通信を行っている場合、 blockdev-add コマンドを使用することもできます。 QMP に関する詳細は、 35.11項 「QMP - QEMU マシンプロトコル」 をお読みください。

それぞれ下記のオプションを指定することで、仮想化ゲストのキャッシュサイズを設定することができます:

l2-cache-size

L2 テーブルキャッシュの最大サイズを指定します。

refcount-cache-size

refcount ブロックキャッシュの最大サイズを指定します。 refcount に関する詳細については、 https://raw.githubusercontent.com/qemu/qemu/master/docs/qcow2-cache.txt をお読みください。

cache-size

両方のキャッシュサイズの合計最大サイズを指定します。

上記のオプションを指定する場合は、下記に注意してください:

  • L2 および refcount ブロックのキャッシュサイズは、クラスタサイズの倍数である必要があります。

  • いずれかのオプションのみを指定した場合、 QEMU は指定しなかったほうのオプションを自動調整します。具体的には、 L2 キャッシュが refcount キャッシュよりも 4 倍大きくなるようにします。

refcount キャッシュは L2 キャッシュほど頻繁に使用されるものではありませんので、下記のように比較的小さな値にしておくことができます:

# qemu-system-ARCH [...] \
 -drive file=disk_image.qcow2,l2-cache-size=4194304,refcount-cache-size=262144
33.2.2.5.3 メモリ使用率の削減 Edit source

キャッシュサイズを大きくすると、それだけメモリの使用量も増えてしまいます。それぞれの qcow2 ファイルには個別の L2 キャッシュが存在する仕組みであるため、多数の巨大なディスクイメージを使用していると、かなりの量のメモリを使用する結果になってしまいます。メモリの消費は、ゲストの構築作業内でバッキングファイル ( 33.2.4項 「ディスクイメージの効率的な使用」 ) を使用したり、スナップショット (see 33.2.3項 「qemu-img を利用した仮想マシンのスナップショット管理」 ) を作成したりすることで、より大きくなってしまいます。

このような理由から、 QEMU では cache-clean-interval という設定が提供されています。これは全てのキャッシュ項目に対する設定で、指定した秒数以上アクセスのない項目があった場合、それらをメモリから削除するための設定です。

下記の例では、 10 分間アクセスの無かった全てのキャッシュ項目を削除することになります:

# qemu-system-ARCH [...] -drive file=hd.qcow2,cache-clean-interval=600

このオプションを指定しない場合、既定値である 0 が適用され、この機能が無効化されます。

33.2.3 qemu-img を利用した仮想マシンのスナップショット管理 Edit source

仮想マシン のスナップショットは VM ゲスト の動作中に採取することのできるスナップショットです。スナップショットにはプロセッサ (CPU) やメモリ (RAM) のほか、デバイスや全ての書き込み可能なディスクに関する状態が含まれます。

スナップショット機能は、お使いの仮想マシンで特定の状態を保存したい場合に有用です。たとえば仮想化サーバ内でネットワークサービスを設定し、いつでもその時点に戻すことができて欲しいような場合などがあります。それ以外にも、何らかの実験的な作業を行って不安定になってしまう前に、仮想マシンをシャットダウンしてからバックアップを作成するようなことを行うこともできます。本章では後者について説明しています。前者については 第35章 「QEMU モニタを利用した仮想マシンの管理 で説明しています。

スナップショットを使用するには、お使いの VM ゲスト 内に少なくとも 1 つ以上の書き込み可能な qcow2 形式のディスクイメージが存在しなければなりません。このようなデバイスは通常、 1 台目の仮想ハードディスクであるはずです。

仮想マシン のスナップショットは、対話型の QEMU モニタ内で savevm コマンドを実行することで作成することができます。スナップショットを分かりやすくするために、 タグ を指定しておくこともできます。 QEMU モニタに関する詳細については、 第35章 「QEMU モニタを利用した仮想マシンの管理 をお読みください。

qcow2 ディスクイメージ内にスナップショットを保存したあとは、 qemu-img snapshot コマンドで内容を調査することができます。

警告
警告: VM ゲスト のシャットダウンについて

仮想マシンが動作している場合、 qemu-img snapshot コマンドで仮想マシンのスナップショットを作成したり、削除したりしてはなりません。動作中にこれらを実施してしまうと、仮想マシンの状態を持つディスクイメージが破壊されてしまう場合があります。

33.2.3.1 既存のスナップショット一覧の表示 Edit source

qemu-img snapshot -l ディスクイメージ のように入力して実行すると、 ディスクイメージ で指定したディスクイメージ内に保存されている全てのスナップショットを表示することができます。この一覧表示は、 VM ゲスト の動作中でも表示することができます。

> qemu-img snapshot -l /images/sles.qcow2
Snapshot list:
ID1       TAG2               VM SIZE3        DATE4          VM CLOCK5
1         booting                4.4M 2013-11-22 10:51:10   00:00:20.476
2         booted                 184M 2013-11-22 10:53:03   00:02:05.394
3         logged_in              273M 2013-11-22 11:00:25   00:04:34.843
4         ff_and_term_running    372M 2013-11-22 11:12:27   00:08:44.965

1

スナップショットの識別番号です。通常は自動的に割り当てられます。

2

スナップショットの説明 (タグ) です。識別用に用意されているものです。

3

スナップショットが占有するディスク領域です。なお、動作中のアプリケーションがメモリを多く使用していればいるほど、スナップショットのサイズが大きくなります。

4

スナップショットを作成した日時を表しています。

5

仮想マシンのクロック状態を表しています。

33.2.3.2 電源の入っていない仮想マシンに対するスナップショットの作成 Edit source

仮想マシンの電源が切れている状態で、現在の状態に対するスナップショットを作成するには、 qemu-img snapshot -c スナップショットのタイトル ディスクイメージ のように入力して実行します。

> qemu-img snapshot -c backup_snapshot /images/sles.qcow2
> qemu-img snapshot -l /images/sles.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         booting                4.4M 2013-11-22 10:51:10   00:00:20.476
2         booted                 184M 2013-11-22 10:53:03   00:02:05.394
3         logged_in              273M 2013-11-22 11:00:25   00:04:34.843
4         ff_and_term_running    372M 2013-11-22 11:12:27   00:08:44.965
5         backup_snapshot           0 2013-11-22 14:14:00   00:00:00.000

VM ゲスト 側で何らかの問題が発生し、保存されているスナップショットに戻す必要が生じた場合 (たとえば ID 5 に戻したい場合) 、 VM ゲスト の電源を落としてから下記のようなコマンドを実行します:

> qemu-img snapshot -a 5 /images/sles.qcow2

上記を実行したあとは、通常通り qemu-system-ARCH で仮想マシンを起動することで、スナップショット番号 5 の状態から起動を行うことができます。

注記
注記

なお、 qemu-img snapshot -c のコマンドは QEMU モニタ (詳しくは 第35章 「QEMU モニタを利用した仮想マシンの管理 をお読みください) の savevm コマンドとは関係がありません。たとえば QEMU モニタで savevm を実行して作成したスナップショットを、 qemu-img snapshot -a で適用するようなことはできません。

33.2.3.3 スナップショットの削除 Edit source

qemu-img snapshot -d スナップショット_ID ディスクイメージ のように入力して実行することで、仮想マシンに対する古いスナップショットや不要なスナップショットを削除することができます。これによりスナップショットが占有していた qcow2 ディスクイメージ内の領域が解放されることになります:

> qemu-img snapshot -d 2 /images/sles.qcow2

33.2.4 ディスクイメージの効率的な使用 Edit source

まずは下記のような状況を想像してみてください。あなたはサーバの管理者で、複数の仮想化オペレーティングシステムを動作させて管理を行っています。これらのシステムのうち、 1 つのグループは特定のディストリビューションをベースにしていますが、その他のグループは異なる (おそらくは Unix 以外の) プラットフォームを使用しています。さらに複雑なことに、それぞれの仮想ゲストシステムは同じディストリビューションをベースにしていますが、使用している部署や部門が異なるため、構成も異なっているような状態です。ファイルサーバについては Web サーバとは構成やサービスなどが異なっていますが、いずれも openSUSE をベースにしているものとします。

このような場合、 ベース となるディスクイメージを作成して対応するようなことができます。このベースイメージは、仮想マシンの雛形として使用することができますので、何度もオペレーティングシステムをインストールしたりする手間を省くことができます。

33.2.4.1 ベースイメージと派生イメージ Edit source

まずは通常の手順でディスクイメージを作成し、目的のシステムをインストールしてください。詳しくは 33.1項 「qemu-system-ARCH を利用した基本的なインストール」33.2.2項 「ディスクイメージの作成/変換/検査」 をお読みください。あとはそのイメージをベースイメージとして、新しいイメージファイルを作成するだけです。これで 派生 イメージを作成することができたことになります。なお、ベースイメージを利用して起動してはなりません。必ず派生イメージのほうを起動してください。また、 1 つのベースイメージから複数の派生イメージを作成することもできます。そのため、ベースイメージのほうを変更してしまうと、派生関係が壊れてしまうことになります。派生イメージを利用して起動を行うと、 QEMU は変更点を派生イメージのほうにのみ書き込むようになります。それに対して、ベースイメージは読み込み専用となります。

ベースイメージを作成する場合は、オペレーティングシステムを新規にインストールし (必要であれば登録作業などを行い) 、修正 (パッチ) などはインストールせず、アプリケーションについてもインストールや削除を行わないようにしておくことをお勧めします。必要であれば、そのベースイメージを元に、最新の修正を適用したもう 1 つのベースイメージを作成してもかまいません。

33.2.4.2 派生イメージの作成 Edit source

注記
注記

ベースイメージには raw 形式を使用することができますが、派生イメージには raw 形式を使用することができません。これは、 raw 形式は backing_file オプションに対応していないためです。下記の例では、派生イメージに qcow2 形式を使用します。

たとえば /images/sles_base.rawraw 形式のベースイメージであるとします。

> qemu-img info /images/sles_base.raw
image: /images/sles_base.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.4G

イメージの予約サイズは 4 GB で実サイズは 2.4 GB 、そして形式が raw であることがわかります。あとは /images/sles_base.raw ファイルに対する派生イメージを作成します:

> qemu-img create -f qcow2 /images/sles_derived.qcow2 \
-o backing_file=/images/sles_base.raw
Formatting '/images/sles_derived.qcow2', fmt=qcow2 size=4294967296 \
backing_file='/images/sles_base.raw' encryption=off cluster_size=0

派生イメージの詳細を確認します:

> qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 140K
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)

派生イメージの予約サイズはベースイメージと同じサイズ (4 GB) になっていますが、実サイズは 140 KB しかありません。これは、派生イメージにはベースイメージからの変更点のみを記録する仕組みであるためです。あとは派生イメージを利用して仮想マシンを起動し、必要に応じて登録などの処理を行い、最新の修正を適用してください。不要なパッケージを削除してもかまいませんし、必要な新しいパッケージをインストールしてもかまいません。あとは VM ゲスト をシャットダウンし、再度派生イメージの状態を確認してみます:

> qemu-img info /images/sles_derived.qcow2
image: /images/sles_derived.qcow2
file format: qcow2
virtual size: 4.0G (4294967296 bytes)
disk size: 1.1G
cluster_size: 65536
backing file: /images/sles_base.raw \
(actual path: /images/sles_base.raw)

上記の disk size の値にもあるとおり、この例では実サイズが 1.1 GB まで拡張しました。ここには、ベースイメージからのファイルシステム内の変更点が含まれています。

33.2.4.3 派生イメージの再ベース Edit source

派生イメージの修正 (修正の適用、必要なアプリケーションのインストール、各種の設定変更等々) を行うことで、必要な環境を構築することができます。ここからベースイメージをマージ (併合) することができるほか、新しいベースイメージを元に派生イメージを作り直すこともできます。

元のベースイメージ (例: /images/sles_base.raw ) には、新規にインストールしたシステムが含まれています。このベースイメージを雛形として、最新のセキュリティ更新などをインストールして、新しいベースイメージを作成することができます。新しいベースイメージからも派生イメージを作成して、必要なアプリケーションやサービスなどを動作させることができます。なお、新しいベースイメージは元のベースイメージから独立させることができます。このような新しいベースイメージの作成を、 再ベース と呼びます。

> qemu-img convert /images/sles_derived.qcow2 \
-O raw /images/sles_base2.raw

上記のコマンドを実行すると、 raw 形式で新しいベースイメージ /images/sles_base2.raw を作成することができます。

> qemu-img info /images/sles_base2.raw
image: /images/sles11_base2.raw
file format: raw
virtual size: 4.0G (4294967296 bytes)
disk size: 2.8G

新しいイメージは元のイメージに比べて 0.4 ギガバイトほど大きくなっています。このイメージファイルはベースイメージを使用していませんので、ここから新しい派生イメージを作成することができます。これにより、組織の要件にあわせ、より洗練された仮想ディスクイメージ階層を作成することで、時間と手間の両方を削減できるようになります。

33.2.4.4 VM ホストサーバ 側でのイメージのマウント Edit source

仮想ディスクイメージは、ホストシステム内でマウントすることもできます。なお、あらかじめ 第18章 「libguestfs を読むとともに、仮想マシンイメージにアクセスするための専用ツールを使用しておくことを強くお勧めします。ただし、どうしても手作業でこれを実施しなければならないような場合、本章をお読みのうえ作業を行ってください。

Linux システムでは、 raw 形式のディスクイメージであれば、ループバックデバイスを利用して内部のパーティションをマウントすることができます。最初の例は複雑ではありますがわかりやすいもの、 2 つ目の例は直感的なものになっています:

手順 33.1: パーティションオフセット値を指定したディスクイメージのマウント
  1. まずはマウントしたいディスクイメージに対して loop デバイスを割り当てます。

    > losetup /dev/loop0 /images/sles_base.raw
  2. セクタサイズ の項目を探し、マウントしたいパーティションの セクタ番号 の開始位置を判断します。

    > fdisk -lu /dev/loop0
    
    ディスク /dev/loop0: 4294 MB, 4294967296 バイト
    単位: セクタ (1 * 512 = 512 1バイト)
    セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
    I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
    ディスクラベルのタイプ: dos
    ディスク識別子: 0x000ceca8
    
    デバイス       起動   開始位置    終了位置     セクタ       Id  タイプ
    /dev/loop0p1              63     1542239      771088+  82  Linux スワップ / Solaris
    /dev/loop0p2   *     15422402    8385929     3421845   83  Linux

    1

    ディスクのセクタサイズを表しています。

    2

    パーティションのセクタ開始位置を表しています。

  3. 開始位置を計算します:

    セクタサイズ * 開始位置_(セクタ) = 512 * 1542240 = 789626880

  4. いったんループバックデバイスの割り当てを解除したあと、計算結果をもとに offset 値を指定して、特定のディレクトリにマウントします。

    > losetup -d /dev/loop0
    > mount -o loop,offset=789626880 \
    /images/sles_base.raw /mnt/sles/
    > ls -l /mnt/sles/
    total 112
    drwxr-xr-x   2 root root  4096 Nov 16 10:02 bin
    drwxr-xr-x   3 root root  4096 Nov 16 10:27 boot
    drwxr-xr-x   5 root root  4096 Nov 16 09:11 dev
    [...]
    drwxrwxrwt  14 root root  4096 Nov 24 09:50 tmp
    drwxr-xr-x  12 root root  4096 Nov 16 09:16 usr
    drwxr-xr-x  15 root root  4096 Nov 16 09:22 var
  5. あとはマウントしたパーティションに対して必要な作業を実施し、完了したらマウントを解除します。

    > cp /etc/X11/xorg.conf /mnt/sles/root/tmp
    > ls -l /mnt/sles/root/tmp
    > umount /mnt/sles/
警告
警告: 使用中のイメージに対して書き込みを行ってはならない件について

動作中の仮想マシンが使用するパーティションを 読み書き可能な モードでマウントしてはなりません。読み書き可能な状態でマウントしてしまうと、パーティションを破壊する結果になるほか、 VM ゲスト 全体を破壊する結果になってしまいます。

このページを印刷