linux:qemu-kvm

KVM (Kernel-based Virtual Machine) - 仮想化

[アクティビティ] - [アプリケーション] - [仮想マシンマネージャー] を起動する。
virt-manager icon 001

 ここでは以下のURLよりCentOSを拾ってきます。

http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/

仮想マシンのディスクイメージは /var/lib/libvirt/images に作成する。
イメージを qcow2 形式で作成する事で、割り当てサイズではなく実際に使用されたサイズになるイメージを作成する。(ディスク容量を節約できる)

$ sudo qemu-img create -f qcow2 /var/lib/libvirt/images/Sv256GB.qcow2 256G
Formatting '/var/lib/libvirt/images/Sv256GB.qcow2', fmt=qcow2 size=274877906944 cluster_size=65536 lazy_refcounts=off refcount_bits=16

※GUIツールからだと形式の指定ができないので、予めコマンドでイメージを作成しておく。

  1. 仮想マシンマネージャー起動時に、管理者認証を行って QEMU/KVM に接続する🤤
  2. ホスト (QEMU/KVM - qemu:///system) を選択して [新しい仮想マシンの作成] ボタンをクリックする😍

初期設定では XML 編集は無効化されている🤔

⚠XML 編集が ’設定' で無効化されています。なお、有効化する際には注意して取り扱ってください。🤤

virt-manager 015


仮想マシンマネージャー (virt-manager) の XML 編集を有効化するには…🤤

  1. virt-manager を起動する。
  2. メニューから [編集] - [Preferences] をクリックして「設定」画面を開く。
  3. 「設定」画面の [XML 編集を有効にする] をオンにして、[閉じる] をクリックする。

    virt-manager 017

  4. 任意の仮想マシンをダブルクリックして、[XML] タブで XML を編集できることを確認する。

    virt-manager 018

仮想マシンのリストを確認する。

$ sudo virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     centos-vm-base                 シャットオフ
 -     green-vm-base                  シャットオフ

コピーしたい仮想マシンの xml をダンプする。

$ sudo virsh dumpxml green-vm-base

<domain type='kvm'>
  <name>green-vm-base</name>
  <uuid>95f2b79c-2795-d442-5290-97afc7d37242</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-1.4'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qed'/>
      <source file='/var/lib/libvirt/images/green-vm-base.qed'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='bridge'>
      <mac address='52:54:00:18:24:a0'/>
      <source bridge='br0'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
uuidgen コマンドで新しい uuid を生成する。

$ uuidgen
d3492379-bacd-45cc-8b17-77b7ed3d6e50

新しい仮想マシンの xml ファイルを作成する。

$ sudo vi /etc/libvirt/qemu/green-web.xml

新しい仮想マシンの xml ファイルの name, uuid, devices-disk-source, devices-interface-mac address を直す。

<domain type='kvm'>
  <name>green-web</name>
  <uuid>d3492379-bacd-45cc-8b17-77b7ed3d6e50</uuid>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>2097152</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-1.4'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qed'/>
      <source file='/var/lib/libvirt/images/green-web.qed'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='bridge'>
      <mac address='52:54:00:18:24:a1'/>
      <source bridge='br0'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes' listen='0.0.0.0'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
新しい仮想マシン用に仮想ディスクをコピーする。

$ sudo cp /var/lib/libvirt/images/green-vm-base.qed /var/lib/libvirt/images/green-web.qed

KVMホストに反映させる。

$ sudo virsh define /etc/libvirt/qemu/green-web.xml

KVMホストへの反映を確認する。

$ sudo virsh list --all
 Id    名前                         状態
----------------------------------------------------
 -     centos-vm-base                 シャットオフ
 -     green-vm-base                  シャットオフ
 -     green-web                      シャットオフ

仮想マシンのリストを確認する。

$ sudo virsh list --all
 Id   名前            状態
-----------------------------------
 -    black-dc       シャットオフ  
 -    black-ltsp     シャットオフ  
 -    black-mps      シャットオフ  
 -    black-ns       シャットオフ  
 -    black-vps001   シャットオフ

KVMホスト間で仮想マシンの xml 定義ファイルを転送する。

$ sudo rsync -avz -e "ssh -p10022" /etc/libvirt/qemu/black-vps001.xml root@green-sv:/etc/libvirt/qemu/black-vps001.xml
sending incremental file list

sent 55 bytes  received 12 bytes  4.62 bytes/sec
total size is 4,530  speedup is 67.61

KVMホスト間で仮想マシンの仮想ディスクファイルを転送する。

$ sudo rsync -avP -e "ssh -p10022" /var/lib/libvirt/images/black-vps001_512GB.qcow2 root@green-sv:/var/lib/libvirt/images/black-vps001_512GB.qcow2
sending incremental file list
black-vps001_512GB.qcow2
528,853,696,512 100%   19.45MB/s    7:12:04 (xfr#1, to-chk=0/1)

sent 528,982,811,289 bytes  received 35 bytes  20,367,034.80 bytes/sec
total size is 528,853,696,512  speedup is 1.00

-P または –progress で転送状況を表示する。

移動先KVMホストで仮想マシンを定義する。

$ ssh root@green-sv virsh define /etc/libvirt/qemu/black-vps001.xml
ドメイン black-vps001 が /etc/libvirt/qemu/black-vps001.xml から定義されました

移動先KVMホストで仮想マシンのリストを確認する。

$ ssh root@green-sv virsh list --all
 Id    名前                     状態
---------------------------------------------
 -     black-vps001            シャットオフ
 -     green-dc                シャットオフ
 -     green-edubuntu14-ltsp   シャットオフ
 -     green-nas               シャットオフ
 -     green-ns                シャットオフ
 -     green-mps               シャットオフ

移動先KVMホストで仮想マシンを実行する。

$ ssh root@green-sv virsh start black-vps001
ドメイン black-vps001 が起動されました

Network Block Device のカーネルモジュールをロードする。

$ sudo modprobe nbd

qemu-nbd コマンドを使用して qcow2 をディスクとして接続する。

$ sudo qemu-nbd --connect=/dev/nbd0 vm_hdd_image.qcow2

この時点で fdisk を使ってディスク情報を表示する事が出来る。

$ sudo fdisk -l /dev/nbd0
ディスク /dev/nbd0: 256 GiB, 274877906944 バイト, 536870912 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x000a8247

デバイス    起動 開始位置   終了位置     セクタ  サイズ Id タイプ
/dev/nbd0p1 *     2048   1026047   1024000   500M 83 Linux
/dev/nbd0p2    1026048   5253119   4227072     2G 82 Linux スワップ / Solaris
/dev/nbd0p3    5253120 536870911 531617792 253.5G 83 Linux

ディスクをマウントする。

$ sudo mount -t ext4 /dev/nbd0p1 /mnt

ディスクをアンマウントする。

$ sudo umount /mnt

qcow2 ディスクを切断する。

$ sudo qemu-nbd --disconnect /dev/nbd0
/dev/nbd0 disconnected
$ qemu-system-x86_64 -net nic,model=?
qemu: Supported NIC models: e1000,e1000-82544gc,e1000-82545em,e1000e,i82550,i82551,i82557a,i82557b,i82557c,i82558a,i82558b,i82559a,i82559b,i82559c,i82559er,i82562,i82801,ne2k_pci,pcnet,pvrdma,rocker,rtl8139,virtio-net-pci,vmxnet3
$ qemu-system-i386 -net nic,model=?
qemu: Supported NIC models: e1000,e1000-82544gc,e1000-82545em,e1000e,i82550,i82551,i82557a,i82557b,i82557c,i82558a,i82558b,i82559a,i82559b,i82559c,i82559er,i82562,i82801,ne2k_pci,pcnet,pvrdma,rocker,rtl8139,virtio-net-pci,vmxnet3
$ sudo dnf install qemu-system-arm qemu-system-mips qemu-kvm-tools 

仮想マシンが勝手に「一時停止中」になる場合は物理ディスク容量を確認する。

$ sudo virsh list --all
 Id   Name              State         
--------------------------------------
 1    black-dc          一時停止中
 2    black-ns          一時停止中
 3    fedora-vps001     一時停止中
 -    edubuntu14-ltsp   シャットオフ
 -    windows-mps       シャットオフ

物理ディスク容量の確認(/ の使用%が 100%)である。

$ df -BG -T
ファイルシス   タイプ   1G-ブロック  使用  使用可  使用% マウント位置
devtmpfs     devtmpfs       3G    0G     3G    0% /dev
tmpfs        tmpfs          3G    0G     3G    0% /dev/shm
tmpfs        tmpfs          3G    1G     3G    1% /run
tmpfs        tmpfs          3G    0G     3G    0% /sys/fs/cgroup
/dev/sda2    btrfs       1022G 1022G     0G  100% /
tmpfs        tmpfs          3G    1G     3G    1% /tmp
/dev/sda1    ext4           1G    1G     1G   21% /boot
tmpfs        tmpfs          1G    0G     1G    0% /run/user/1000

物理ディスクを大容量な物に交換するか容量を拡張する。
ディスク管理関連 - linux-swap の移動
ディスク管理関連 - btrfs の拡張

新しいKVMホストから古いKVMホストに仮想マシンを移動した時に以下のエラーが発生する。

$ ssh root@green-sv virsh define /etc/libvirt/qemu/black-vps001.xml
エラー: /etc/libvirt/qemu/black-vps001.xml からのドメイン定義に失敗しました
エラー: サポートされない設定: 予期しない機能 'vmport'

<features> の <vmport state='off'/> を <pae/> に修正する。
変更前

  <features>
    <acpi/>
    <apic/>
    <vmport state='off'/>
  </features>

変更後

  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>

新しいKVMホストから古いKVMホストに仮想マシンを移動した時に以下のエラーが発生する。

$ ssh root@green-sv virsh define /etc/libvirt/qemu/black-vps001.xml
エラー: /etc/libvirt/qemu/black-vps001.xml からのドメイン定義に失敗しました
エラー: XML エラー: ファイル '/dev/urandom' がサポートされた乱数ソースではありません

<devices> の <rng> の部分を丸ごと削除する。

    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </rng>

新しいKVMホストから古いKVMホストに仮想マシンを移動した時に以下のエラーが発生する。

$ ssh root@green-sv virsh start black-vps001
エラー: ドメイン black-vps001 の起動に失敗しました
エラー: 内部エラー: モニターに接続中にプロセスが終了しました: 2019-01-21T23:12:44.253599Z qemu-system-x86_64: -ms: Unsupported machine type
Use -machine help to list supported machines!

<os> の <type arch='x86_64' machine='pc-i440fx-3.0'> を <type arch='x86_64' machine='pc-i440fx-1.4'> に修正する。
修正前

  <os>
    <type arch='x86_64' machine='pc-i440fx-3.0'>hvm</type>
  </os>

修正後

  <os>
    <type arch='x86_64' machine='pc-i440fx-1.4'>hvm</type>
    <boot dev='hd'/>
  </os>

以下のエラーが発生する場合はポリシーファイルを修正する。

仮想マシンマネージャーの接続障害

Unable to open a connection to the libvirt management daemon.

Libvirt URI is: qemu:///system

Verify that:
 - The 'libvirtd' daemon has been started

詳細

Unable to open a connection to the libvirt management daemon.

Libvirt URI is: qemu:///system

Verify that:
 - The 'libvirtd' daemon has been started


authentication failed: authentication failed

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/connection.py", line 1146, in _open_thread
    self.vmm = self._try_open()
  File "/usr/share/virt-manager/virtManager/connection.py", line 1130, in _try_open
    flags)
  File "/usr/lib64/python2.6/site-packages/libvirt.py", line 102, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: authentication failed: authentication failed

ポリシーファイルの修正

$ sudo vi /usr/share/polkit-1/actions/org.libvirt.unix.policy
<policyconfig>
    ...
    <action id="org.libvirt.unix.manage">
      ...
      <defaults>
        <!-- <allow_any>no</allow_any>
        <allow_inactive>no</allow_inactive> -->
        <allow_any>auth_admin</allow_any>
        <allow_inactive>auth_admin</allow_inactive>
      </defaults>
    </action>
</policyconfig>

ポリシーファイルを修正すると認証を行うことでホストに接続できるようになる。

  • linux/qemu-kvm.txt
  • 最終更新: 2022/09/25 04:32
  • by ともやん