仮想マシンは、データと仮想マシンを定義するオペレーティングシステムファイルから 構成されています。仮想マシンは VM ホストサーバ 内で動作し、制御されます。この章では、 仮想マシンのインストールについて一般的な手順を説明しています。
仮想マシンを作成する前に、下記の内容にご注意ください:
自動インストールファイル (AutoYaST, NetWare® レスポンスファイル, RedHat Kickstart など) を利用してインストールしたい場合、ホストマシン側のサーバ内で 該当のファイルを、ホストマシンのサーバ上にダウンロードしておくか、もしくは ネットワークファイルシステム経由でアクセスできるようにしておく必要があります。
スパースイメージファイル (表示上の容量ではなく、実際に使用している部分の容量で 領域を確保するタイプのファイル) を作成する場合は、作成するパーティションに 十分な容量があるかどうか、よくご確認ください。ゲスト側のシステムではホスト側の ディスク領域を確認したりすることはありませんので、ホスト側のパーティションに 容量不足が発生すると、ゲスト側では書き込みエラーとして報告され、ゲストシステム 側で保存していたデータを失ってしまうことになります。
NetWare および OES Linux 仮想マシンを作成する場合は、作成するそれぞれの 仮想マシンに対して固定の IP アドレスが必要となります。
Open Enterprise Server (OES) 2 Linux をインストールしようとしている場合は、 OES 2 Linux ソフトウエアのネットワークインストールソースが必要となります。
さらなる要件については、各オペレーティングシステムのインストール関連のマニュアルを お読みください。
virt-manager や vm-install など、
libvirt
ベースのツールでは仮想マシンを
設定したり管理したりするのに便利なインターフェイスを提供しています。これらは
いずれも qemu-kvm に対するラッパー (ラッピングするもの)
として動作します。ただし、 libvirt
ベースのツールを全く使用せず、 qemu-kvm を直接使用する
ことも可能です。
qemu-kvm で作成した仮想マシンは、
|
下記の例では、 qemu-kvm を使用することで 例4.1「vm-install を使用したコマンドラインからの対話型セットアップ」 での例と同じ パラメータで仮想マシンを設定します。コマンドについての詳しい説明は、関連する マニュアルページをお読みください。
仮想化された環境下で動作させたいシステムについて、そのイメージを作成していない 場合は、インストールメディアからイメージを作成する必要があります。このような 場合は、ハードディスクイメージを作成し、インストールメディアやメディアそれ自身の イメージを用意する必要があります。
まずは qemu-img でハードディスクを作成します。
qemu-img create -f raw /images/sles11/hda 8G
サブコマンド | |
| |
イメージファイルのフルパスを指定しています。 | |
イメージのサイズ、ここでは 8 GB を指定しています。イメージはスパースファイルと 呼ばれる形で作成され、ディスク内にデータが蓄えられていくたびに実容量が拡大して いく形になっています。ここで指定するサイズは、イメージファイルの最大サイズを 指定しています。 |
1 つ以上のハードディスクイメージを作成したら、 qemu-kvm を利用して仮想マシンの設定を行ない、インストールシステムを起動します。
qemu-kvm -name "sles11" -M pc-0.12 -m 768 \ -smp 2 -boot d \ -drive file=/images/sles11/hda,if=virtio,index=0,media=disk,format=raw \ -drive file=/isos/SLES-11-SP1-DVD-x86_64-GM-DVD1.iso,index=1,media=cdrom \ -net nic,model=virtio,macaddr=52:54:00:05:11:11 \ -vga cirrus -balloon virtio
ウインドウキャプションに表示されるほか、 VNC サーバの名前としても使用される 仮想マシン名です。名前はシステム内で唯一のものでなければなりません。 | |
マシンの種類 (qemu-kvm | |
仮想マシンに割り当てる最大メモリ量を指定しています。 | |
2 プロセッサの SMP システムであることを指定しています。 | |
起動順序を指定しています。指定できる値はそれぞれ、 | |
最初の ( | |
2 番目の ( | |
擬似仮想化 ( | |
グラフィックカードを指定しています。 | |
動的にメモリ量を変更できるようにするため、擬似仮想化バルーンデバイスを設定
しています (最大メモリ量については |
ゲスト側のオペレーティングシステムのインストールが終わったら、 CD-ROM デバイスの 指定を行なう必要はなくなり、簡単にシステムを起動できるようになります:
qemu-kvm -name "sles11" -M pc-0.12 -m 768 \ -smp 2 -boot c \ -drive file=/images/sles11/hda,if=virtio,index=0,media=disk,format=raw \ -net nic,model=virtio,macaddr=52:54:00:05:11:11 \ -vga cirrus -balloon virtio
前の章 (11.1項 「qemu-kvm を利用した基本インストール」) では、 ハードディスクのイメージを作成するのに qemu-img コマンドを 使用してきましたが、本コマンドは汎用的なディスクイメージ操作にも使用することが できます。この章では、ディスクイメージを柔軟に管理する際に便利な、各種の qemu-img サブコマンドを紹介しています。
qemu-img は (zypper のように) サブコマンドを使用します。各サブコマンドは異なる種類のオプションを認識する 仕組みになっていて、それらのうちのいくつかは複数のサブコマンドで使用できる 汎用オプション、それ以外はサブコマンド内で独自のものになっています。 利用可能なオプションを確認するには、 qemu-img のマニュアルページ (man 1 qemu-img) をご覧ください。 qemu-img は一般に、下記のような書式で記述します:
qemu-img サブコマンド [オプション]
サブコマンドには下記のようなものがあります:
create
ファイルシステム上に新しいディスクイメージを作成します。
check
既存のディスクイメージにエラーがないかどうか、確認を行ないます。
convert
既存のディスクイメージを、異なる形式に変換します。
info
指定したディスクイメージに関する情報を表示します。
snapshot
既存のディスクイメージに対するスナップショットを管理します。
commit
既存のディスクイメージに対して、変更点を適用します。
rebase
既存のイメージから、新しいベースイメージを作成します。
resize
既存のイメージのサイズを増やしたり、減らしたりします。
この章では、ディスクイメージの作成方法や状態の確認のほか、ディスクイメージの 形式を一方から他方に変換する手順、および特定のディスクイメージについて 詳細な情報を取得する手順について説明しています。
VM ゲスト 側のオペレーティングシステムで使用する新しいディスクイメージを 作成するには、 qemu-img create コマンドを使用します。 下記のような書式で実行します:
qemu-img create -f 種類 -o オプション ファイル名 サイズ
作成するイメージの種類を指定します。対応しているイメージの種類を
表示するには、 qemu-img | |
イメージの種類に対して追加のオプションをコマンドラインで指定することができます。
このようなオプションは | |
作成するディスクイメージのパスを指定します。 | |
作成するディスクイメージのサイズを指定します
( |
たとえば sles11sp1.raw
という新しいディスクイメージを、
/images
ディレクトリ以下に最大 4 GB として作成する場合、
下記のようなコマンドになります:
tux@venus:~> qemu-img create -f raw -o size=4G /images/sles11sp1.raw Formatting '/images/sles11sp1.raw', fmt=raw size=4294967296 tux@venus:~> ls -l /images/sles11sp1.raw -rw-r--r-- 1 tux users 4294967296 Nov 15 15:56 /images/sles11sp1.raw tux@venus:~> qemu-img info /images/sles11sp1.raw image: /images/sles11sp1.raw file format: raw virtual size: 4.0G (4294967296 bytes) disk size: 0
上記のとおり、新しく作成したイメージの 見た目 (virtual) 上のサイズは 4 GB ですが、実際にディスク領域を占有しているサイズ (disk size) は 0 になっています。これは、まだ何もデータが書き込まれていない ためです。
ディスクのイメージ形式を変換するには、 qemu-img convert
コマンドを使用します。 QEMU でサポートしているイメージ形式について、一覧を
取得するには、 qemu-img -h
を実行し、
出力の最後の行をお読みください。コマンドは下記のように記述します:
qemu-img convert -c -f 入力種類 -O 出力種類 -o オプション 入力ファイル名 出力ファイル名
目的のディスクイメージに対して、圧縮機能を適用します。
| |
変換元のディスクイメージの形式を指定します。多くの場合自動検出が行なわれる ため、省略が可能です。 | |
変換先のディスクイメージの形式を指定します。 | |
変換先のイメージ形式に対して、オプションを指定する項目です。
| |
変換元のディスクイメージファイルを指定します。 | |
変換先のディスクイメージファイルを指定します。 |
tux@venus:~> qemu-img convert -O vmdk /images/sles11sp1.raw \ /images/sles11sp1.vmdk tux@venus:~> ls -l /images/ -rw-r--r-- 1 tux users 4294967296 16. lis 10.50 sles11sp1.raw -rw-r--r-- 1 tux users 2574450688 16. lis 14.18 sles11sp1.vmdk
選択した変換先のイメージ形式について、これに対応するオプションの一覧を表示
するには、下記のコマンドを入力します (なお vmdk
をお使いの
イメージ形式に合わせてください):
tux@venus:~> qemu-img convert -O vmdk /images/sles11sp1.raw \ /images/sles11sp1.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
既存のディスクイメージについて、エラーがないかどうかを確認するには、 qemu-img check コマンドを使用します。なお、全ての ディスクイメージの形式で、この機能に対応しているというわけではないことに ご注意ください。下記のような書式で実行します:
qemu-img check -f 形式 ファイル名
何もエラーが検出されない場合、コマンドは何も出力を返しません。それ以外の 場合は、エラーの種類とエラー数がそれぞれ表示されます。
tux@venus:~> qemu-img check -f qcow2 /images/sles11sp1.qcow2 ERROR: invalid cluster offset=0x2af0000 [...] ERROR: invalid cluster offset=0x34ab0000 378 errors were found on the image.
新しいイメージを作成する場合は、イメージを作成する前に、その最大サイズを指定 しなければなりません (詳しくは 11.2.2.1項 「qemu-img create」 をお読みください) 。また、 VM ゲスト をインストールし実行したあとで、初期 設定したサイズでは不足し、さらなる領域を割り当てる必要が発生する場合があります。
既存のディスクイメージのサイズを 2 ギガバイトだけ拡張するには、下記の手順を 行ないます:
qemu-img resize /images/sles11sp1.raw +2GB
サイズ変更は |
これにより、ディスク内には最後のパーティション以降に 2 ギガバイトほどの 空き領域が生まれます。あとは既存のパーティションのサイズ変更を行なったり、 新しいパーティションを追加したりすることができます。
仮想マシンのスナップショットとは、 VM ゲスト が実行中の状態について、それを 保存するための機能です。スナップショットにはプロセッサ (CPU) の状態のほか、 メモリ (RAM) やデバイス、全ての書き込み可能なディスクについての情報が 含まれます。
スナップショットは、お使いの仮想マシンを特定の状態で保存しておきたい場合に便利な 機能です。たとえば仮想サーバ内でネットワークサービスを設定したような場合、その 状態で仮想マシンをすぐ開始して、その時点の状態に戻したいような場合が考えられます。 それ以外にも、仮想マシンの電源を落としたタイミングでスナップショットを作成して それをバックアップとし、 VM ゲスト に対して実験的な作業を行なう前の準備とする 場合にも便利なものです。この章では、特に後者のような場合を想定して説明しています。 前者については 第13章 QEMU モニタを利用した仮想マシンの管理 で説明しています。
スナップショットを使用するには、お使いの VM ゲスト に少なくとも 1 台以上の
書き込み可能なハードディスクイメージが、 qcow2
形式で必要です。
このデバイスは通常、 1 台目の仮想ハードディスクとして使用します。
仮想マシンのスナップショットは savevm
コマンドで作成する
もので、これは対話的な QEMU モニタから実行することができます。また、それぞれの
スナップショットには 'タグ' を設定することができ、スナップショットの識別が
簡単に行なえるようになっています。 QEMU モニタについて、詳しくは
第13章 QEMU モニタを利用した仮想マシンの管理 をお読みください。
qcow2
ディスクイメージにスナップショットを保存すると、
qemu-img snapshot コマンドで内容を確認することができます。
仮想マシンが動作している間は、 qemu-img snapshot コマンドで 仮想マシンのスナップショットを作成したり削除したりすることは行なわないでください。 これを行なってしまうと、仮想マシンの状態を保持しているディスクイメージが 壊れてしまう場合があります。 |
ディスクイメージ
で指定するディスクイメージ内に保存されている
全てのスナップショットを表示するには、 qemu-img snapshot -l
ディスクイメージ
を使用します。
こちらのコマンドは、 VM ゲスト が動作中でも実行できます。
tux@venus:~> qemu-img snapshot -l /images/sles11sp1.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 booting 4.4M 2010-11-22 10:51:10 00:00:20.476 2 booted 184M 2010-11-22 10:53:03 00:02:05.394 3 logged_in 273M 2010-11-22 11:00:25 00:04:34.843 4 ff_and_term_running 372M 2010-11-22 11:12:27 00:08:44.965
電源の切られた仮想マシンについて、このスナップショットを作成するには、
qemu-img snapshot -c スナップショット名
ディスクイメージ
を実行します。
tux@venus:~> qemu-img snapshot -c backup_snapshot /images/sles11sp1.qcow2
tux@venus:~> qemu-img snapshot -l /images/sles11sp1.qcow2 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 booting 4.4M 2010-11-22 10:51:10 00:00:20.476 2 booted 184M 2010-11-22 10:53:03 00:02:05.394 3 logged_in 273M 2010-11-22 11:00:25 00:04:34.843 4 ff_and_term_running 372M 2010-11-22 11:12:27 00:08:44.965 5 backup_snapshot 0 2010-11-22 14:14:00 00:00:00.000
VM ゲスト で復元したいような状況が発生し、保存したスナップショット (下記の 例では 5 番のスナップショット) に戻したい場合は、 VM ゲスト の電源を切って から下記のコマンドを実行します:
tux@venus:~> qemu-img snapshot -a 5 /images/sles11sp1.qcow2
実行完了後、 qemu-kvm で仮想マシンを起動すると、 5 番のスナップショットの状態に戻ることができます。
qemu-img snapshot -c コマンドは、 QEMU モニタの
|
仮想マシンのスナップショットのうち、古いものや不要なものを削除したい場合は、
qemu-img snapshot -d スナップショット ID
ディスクイメージ
コマンドを実行します。
このコマンドを実行すると、 qcow2
のディスクイメージ内で
スナップショット用に確保されていたディスク領域が開放されます:
tux@venus:~> qemu-img snapshot -d 2 /images/sles11sp1.qcow2
実際の活用例を考えてみます: あなたはサーバの管理者で、数多くの仮想化された オペレーティングシステムを実行し、管理しているものとします。これらのうちの あるグループは、ある特定のディストリビューションをベースにした構成で、その他の グループはプラットフォームやディストリビューションが異なる (そしておそらくは Unix 以外の) オペレーティングシステムをベースにした構成であるものとします。 さらに複雑なことに、それぞれの仮想化されたゲストシステムは、それぞれの部署や 配置環境に合わせて同じディストリビューションを異なる設定で使用しているものと します。一方はファイルサーバとして異なる設定を、他方は Web サーバなどの サービスを提供していて、いずれも SUSE Linux Enterprise Server 11 SP1 をベースにしているものとします。
QEMU では 「ベース」 と呼ばれるディスクイメージを作成することが できます。これは仮想マシンの雛型として利用できるもので、これらのベースイメージを 利用することで、オペレーティングシステムを何回もインストールしたりすることなく、 手間を省くことができるようになっています。
まずは通常の手順でディスクイメージを作成し、目的となるシステムをインストール します。それぞれ詳しくは 11.1項 「qemu-kvm を利用した基本インストール」 と 11.2.2項 「ディスクイメージの作成や変換、チェック」 をお読みください。 その後、ここまでで作成したイメージを元に、新しいイメージを構築します。ベース となるイメージは '支援' ファイルとも呼ばれ、必要な '派生' イメージをここから 作成し、ベースイメージを再作成するような手間を省いて派生イメージを直接起動できる 仕組みになっています。また、複数の派生イメージが 1 つのベースイメージを参照すること もできます。そのため、ベースイメージを変更してしまうと、依存関係に問題が発生 することになるので、 QEMU では派生イメージにのみ変更点を書き込み、ベース イメージは読み込み専用としてアクセスします。
ベースイメージは新規にインストールした (必要であればユーザ登録済みの) オペレーティングシステムを利用し、一切の修正や追加のアプリケーションを適用 またはインストール/削除していない状態であることをお勧めします。ベースイメージに 対して作成した派生イメージで、必要な最新の修正をインストールしておくのが便利です。
ベースイメージに対しては |
たとえば /images/sles11sp1_base.raw
ファイルが、
新規インストールしたイメージを含むベースイメージとします。
tux@venus:~> qemu-img info /images/sles11sp1_base.raw image: /images/sles11sp1_base.raw file format: raw virtual size: 4.0G (4294967296 bytes) disk size: 2.4G
イメージの予約済みサイズは 4 GB で、実際のサイズは 2.4 GB です。
また、形式は raw
になっています。
この /images/sles11sp1_base.raw
ファイルから
派生イメージを作成するには、下記のように実行します:
tux@venus:~> qemu-img create -f qcow2 /images/sles11sp1_derived.qcow2 \ -o backing_file=/images/sles11sp1_base.raw Formatting '/images/sles11sp1_derived.qcow2', fmt=qcow2 size=4294967296 \ backing_file='/images/sles11sp1_base.raw' encryption=off cluster_size=0
作成された派生イメージの情報は、下記のようになります:
tux@venus:~> qemu-img info /images/sles11sp1_derived.qcow2 image: /images/sles11sp1_derived.qcow2 file format: qcow2 virtual size: 4.0G (4294967296 bytes) disk size: 140K cluster_size: 65536 backing file: /images/sles11sp1_base.raw \ (actual path: /images/sles11sp1_base.raw)
派生イメージが予約するサイズはベースイメージのものと同じ (4 GB) ですが、実際の サイズは 140 KB しかありません。これは派生イメージ側で行なわれた変更点だけが 派生イメージに書き込まれるためです。あとは派生イメージ側で仮想マシンを起動して、 必要であれば登録を行なったり、最新の修正をインストールしたりしてください。また、 不要なソフトウエアパッケージをアンインストールしたり、必要なものをインストール したりすることもできます。その後 VM ゲスト をシャットダウンして、再度派生 イメージを確認すると、下記のようになります:
tux@venus:~> qemu-img info /images/sles11sp1_derived.qcow2 image: /images/sles11sp1_derived.qcow2 file format: qcow2 virtual size: 4.0G (4294967296 bytes) disk size: 1.1G cluster_size: 65536 backing file: /images/sles11sp1_base.raw \ (actual path: /images/sles11sp1_base.raw)
disk size
の欄が 1.1 GB まで増えています。これは
ベースイメージと比較し、ファイルシステム上に施された変更点が書き込まれている
ためです。
いったん派生イメージを修正する (修正の適用やアプリケーションのインストール、 環境設定の変更など) を行なうと、派生イメージのサイズはそれなりのサイズに なってしまいます。場合によっては、そこから既存のベースイメージと派生イメージを 利用した '合成' イメージを作成したい場合が考えられます。たとえば最初の ベースイメージを新規にインストールしたシステムとして作成し、そこから セキュリティの修正や更新をインストールした状態を追加のベースイメージとしたり したい場合が考えられます。あとは後者のほうのベースイメージを雛型にして 派生イメージを作成したりすることができます。後者のほうのベースイメージは、 前者のベースイメージとは独立した存在となります。派生イメージから新しい ベースイメージを作成する作業を、 '再ベース' と呼びます:
tux@venus:~> qemu-img convert /images/sles11sp1_derived.qcow2 \ -O raw /images/sles11sp1_base2.raw
このコマンドでは、新しいベースイメージ /images/sles11sp1_base2.raw
を、 raw
形式で作成します。
tux@venus:~> qemu-img info /images/sles11sp1_base2.raw image: /images/sles11sp1_base2.raw file format: raw virtual size: 4.0G (4294967296 bytes) disk size: 2.8G
新しいイメージは元々のベースイメージと比較して 0.4 GB ほど大きくなっています。 また、このファイルには backing file (ベースイメージ) の表示がありませんので、 このイメージファイルをベースにして、新しい派生イメージを作成することができます。 これにより、お使いの環境に合わせて洗練された仮想ディスクイメージの構造を作成する ことができるため、作業の手間を大幅に省くことができます。
作業上の都合によっては、仮想ディスクイメージをホストシステム側でマウントした ほうが便利な場合があります。たとえば VM ホストサーバ 側にネットワークサポートが 存在しない場合、マウント作業は VM ゲスト とファイルの転送を行なう唯一の手段と なります。
Linux システムでは、 'ループバック' デバイスを利用することで
raw
形式のディスクイメージ内のパーティションをマウントする
ことができます。最初の例は少し複雑ですが詳しい説明が、もう 1 つの例は簡単で
わかりやすい方式です:
手順11.1 パーティションオフセットを計算してディスクイメージをマウントする方法
まずは loop (ループ) デバイスを設定し、 マウントしたいパーティションを含むディスクイメージを指定します。
tux@venus:~> losetup /dev/loop0 /images/sles11sp1_base.raw
次にマウントしたいパーティションの セクタサイズ と セクタ番号 を確認します。
tux@venus:~> fdisk -lu /dev/loop0 Disk /dev/loop0: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors Units = sectors of 1 * 512 = 512 bytes Disk identifier: 0x000ceca8 Device Boot Start End Blocks Id System /dev/loop0p1 63 1542239 771088+ 82 Linux swap /dev/loop0p2 * 1542240 8385929 3421845 83 Linux
下記のようにしてパーティションのオフセット値を計算します:
セクタサイズ * 開始セクタ番号 = 512 * 1542240 = 789626880
ループデバイスを削除し、計算結果のオフセット値を指定して、パーティションを 用意しておいたディレクトリにマウントします。
tux@venus:~> losetup -d /dev/loop0 tux@venus:~> mount -o loop,offset=789626880 \ /images/sles11sp1_base.raw /mnt/sles11sp1/ tux@venus:~> ls -l /mnt/sles11sp1/ 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
マウントできたパーティションに対して、ファイルをコピーしたりします。 作業が終わったらマウントを解除します。
tux@venus:~> cp /etc/X11/xorg.conf /mnt/sles11sp1/root/tmp tux@venus:~> ls -l /mnt/sles11sp1/root/tmp tux@venus:~> umount /mnt/sles11sp1/
手順11.2 kpartx を利用したディスクイメージのマウント
まずは loop (ループ) デバイスを設定し、 マウントしたいパーティションを含むディスクイメージを指定します。
tux@venus:~> losetup /dev/loop0 /images/sles11sp1_base.raw
ディスクイメージのパーティション情報から、デバイスマップを作成します。
tux@venus:~> kpartx -a /dev/loop0
事前に用意しておいたディレクトリに、ディスクイメージ内のパーティションを マウントします。
tux@venus:~> mount /dev/mapper/loop0p1 /mnt/p1
なお、 loop0p1
の項目には、マウントしたいパーティションの
番号を指定してください。たとえば loop0p3
と指定すると、
ディスクイメージ内の 3 番目のパーティションをマウントすることになります。
あとは必要に応じてマウントされたパーティションに対してファイルやディレクトリの コピーや移動を行ないます。作業が終わったらマウントを解除し、ループデバイスを 削除します。
tux@venus:~> umount /mnt/p1
tux@venus:~> losetup -d /dev/loop0
仮想マシンが実行中の場合は、それらのイメージに対して |