KVMで仮想化を試してみる(中編)

やまもとやま
2026-03-27
2026-03-27

どうも、やまもとやまです。
前回はKVMの導入と簡単な操作を試してみました。
今回も引き続き、もう少し詳しく見ていきましょう

環境

前回利用したホストマシンの(198.51.100.10)に加え、追加でホストマシン(198.51.100.11)を準備します。
※構築設定は前回と同様なので省略します

仮想マシンの設定ファイル

前回作成した仮想マシンですが、VMの設定ファイルはどこにあるでしょうか?
デフォルトでは、ホストマシンの以下に作成されています。

/etc/libvirt/qemu/[仮想マシン名].xml

前回作成した仮想マシンの場合は、以下になりますね。

/etc/libvirt/qemu/al9test.xml

ファイルの中身を見てみましょう。

# cat /etc/libvirt/qemu/al9test.xml
<domain type='kvm'>
  <name>al9test</name>
  <uuid>8404ceab-ac68-460b-b993-0e3c8c43f943</uuid>
  <metadata>
    <libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
      <libosinfo:os id="http://almalinux.org/almalinux/9"/>
    </libosinfo:libosinfo>
  </metadata>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-rhel9.6.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough' check='none' migratable='on'/>
  <clock offset='utc'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <pm>
    <suspend-to-mem enabled='no'/>
    <suspend-to-disk enabled='no'/>
  </pm>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' discard='unmap'/>
      <source file='/var/lib/libvirt/images/al9test.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </disk>
※以下省略

メモリやディスクイメージ等、各種設定がxml形式で記載されているのが分かります。
ディスクイメージのファイルは設定内に記載の通り、以下にあるわけですね。

/var/lib/libvirt/images/al9test.qcow2

なお、前回のようにvirt-installコマンドでサイズ指定でディスクイメージを作成した場合、qcow2形式で作成されますが、スパース化された状態となります。
そのため、一見50GB使用しているように見えますが、実際のサイズはもっと小さく、イメージ内の利用が増えるにつれて増加します。
実際の使用量はlsコマンドにsオプションを付けると確認できます。

# ls -lh /var/lib/libvirt/images/al9test.qcow2
-rw------- 1 root root 51G Feb  6 14:01 /var/lib/libvirt/images/al9test.qcow2

# ls -lhs /var/lib/libvirt/images/al9test.qcow2
2.0G -rw------- 1 root root 51G Feb  6 14:01 /var/lib/libvirt/images/al9test.qcow2

イメージファイルの内容を確認したり操作する場合はqemu-imgコマンドが利用できます。
例えば、イメージ概要は以下のように表示できます。

# qemu-img info /var/lib/libvirt/images/al9test.qcow2
image: /var/lib/libvirt/images/al9test.qcow2
file format: qcow2
virtual size: 50 GiB (53687091200 bytes)
disk size: 2.03 GiB
cluster_size: 65536
Format specific information:
    compat: 1.1
    compression type: zlib
    lazy refcounts: true
    refcount bits: 16
    corrupt: false
    extended l2: false
Child node '/file':
    filename: /var/lib/libvirt/images/al9test.qcow2
    protocol type: file
    file length: 50 GiB (53695545344 bytes)
    disk size: 2.03 GiB

仮想マシンのマイグレーション

さて、では今回は前回作成した仮想マシンを別ホストにマイグレーションしてみようと思います。
移行先は追加のホストマシン(198.51.100.11)となります。
具体的な移行方法としては、以下でOKです。
※移行前ホストと移行後ホストのネットワーク設定等に大きな差異がない必要があります。
 またアーキテクチャに依存するため、機器やOS差異により移行ができない場合もあります。

  1. 移行元ホストで対象仮想マシンを停止する
  2. 仮想マシンの設定ファイルxmlおよびディスクイメージファイルを移行先ホストへコピーする
  3. 移行先ホストで仮想マシンを登録する
  4. 移行先ホストで仮想マシンを起動する

※移行後は、移行元ホストでは仮想マシンを削除あるいは起動できない状態にしましょう

実際に試してみます。
まずは仮想マシンの停止を実施しましょう。

# virsh shutdown al9test
Domain 'al9test' is being shutdown

# virsh list --all
 Id   Name        State
----------------------------
 -    al9test     shut off

停止が確認できたので、設定ファイルとディスクイメージをコピーします。

# rsync -av /etc/libvirt/qemu/al9test.xml 198.51.100.11:/etc/libvirt/qemu/al9test.xml
# rsync -av --sparse /var/lib/libvirt/images/al9test.qcow2 198.51.100.11:/var/lib/libvirt/images/al9test.qcow2

※rootでSSHできるようにしておきましょう。また実際に実行する際は移行先にファイルがないかのチェックも必要です

ディスクイメージはスパースファイルのため、rsyncする際もsparseオプションを付けましょう。
つけ忘れるとファイルの実サイズが仮想ディスクのサイズに拡張されてしまいます。。。
コピーが完了したら、移行先ホストで仮想マシンを登録します。
登録はvirsh defineコマンドで実行可能です。

# virsh define /etc/libvirt/qemu/al9test.xml

ただし、本来はdefineでの登録が必要なのですが、デフォルトディレクトリ(/etc/libvirt/qemu/)にxmlファイルを配置しているとlibvirtの再起動による再読み込み等で登録されることもあるようです。
そういう意味では、rsyncでは移行先ホストの別ディレクトリにコピーしておき、そちらを指定してdefineした方が安全かもしれませんね。

さて、登録が完了したので起動します。

# virsh list --all
 Id   Name      State
--------------------------
 -    al9test   shut off

# virsh start al9test
Domain 'al9test' started

# virsh list --all
 Id   Name      State
-------------------------
 1    al9test   running

無事起動しました。
簡単に動作も確認しますが問題なさそうです!

まとめ

KVMで作成した仮想マシンを、別ホストへマイグレーションすることができました。
ただし、今回試したのはオフライン(停止状態)でのマイグレーションになります。
次回はオンラインマイグレーションを試してみようと思います。

それではまた!