目次
文書の過去の版を表示しています。
KVM (Kernel-based Virtual Machine) - 仮想化
仮想化支援機構(Intel-VT、AMD-V)の確認
qemu-kvm のインストール
kvm が有効になっていることの確認
NetworkManager によるブリッジの設定(nmcli)
CentOS minimal インストール(ゲストOS)
Fedora minimal インストール(ゲストOS)
Tunedのセットアップ
virsh による仮想マシンの操作
virt-install による仮想マシンの作成
qemu-img による仮想ディスクの操作
libguestfs-tools による仮想ディスクの操作
QEMU で Android x86 8.1-r1 を動かす
Native PC 用 DietPi を UEFI セキュアブートの KVM で動かす
仮想マシンマネージャー (virt-manager)
仮想マシンの作成
インストールメディアを拾ってくる
ここでは以下の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ツールからだと形式の指定ができないので、予めコマンドでイメージを作成しておく。
仮想マシンマネージャーによる操作
- 仮想マシンマネージャー起動時に、管理者認証を行って QEMU/KVM に接続する🤤
XML 編集の有効化
初期設定では XML 編集は無効化されている🤔
⚠XML 編集が ’設定' で無効化されています。なお、有効化する際には注意して取り扱ってください。🤤
仮想マシンマネージャー (virt-manager) の XML 編集を有効化するには…🤤
- virt-manager を起動する。
- メニューから [編集] - [Preferences] をクリックして「設定」画面を開く。
仮想マシンをコピーして同一KVMホスト上で動かす場合
仮想マシンのリストを確認する。
$ sudo virsh list --all Id 名前 状態 ---------------------------------------------------- - centos-vm-base シャットオフ - green-vm-base シャットオフ
コピーしたい仮想マシンの xml をダンプする。
$ sudo virsh dumpxml green-vm-base
<sxh xml collapse:true> <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> </sxh> 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 を直す。 <sxh xml collapse:true> <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> </sxh> 新しい仮想マシン用に仮想ディスクをコピーする。
$ 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 シャットオフ
仮想マシンを異なるKVMホストへ移動する場合
仮想マシンのリストを確認する。
$ 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 が起動されました
qcow2 のマウント
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 で 指定可能な NIC モデル
$ 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
QEMU で Pidora, OpenWRT, DD-WRT を動かす
$ 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 の拡張
仮想マシンを定義する際に「サポートされない設定: 予期しない機能 'vmport'」が発生する
新しい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>
仮想マシンを定義する際に「XML エラー: ファイル '/dev/urandom' がサポートされた乱数ソースではありません」が発生する
新しい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>
参考文献
Bug 579579 – virt-manager: provide better feedback if we can determine why policykit failed
KVM仮想マシンの名前変更と移動 - yuu_nkjm blog(2011-12-04)
qcow2ファイルをマウント | やってみようよ!
Linux で疎なファイル(sparse file)を使う
Linux:sparse fileのファイルサイズと実際に使っている領域の大きさはどう調べるのか。 - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモ
Raw vs Qcow2 Disk Images in QEMU/KVM - TechPiezo
14Linuxの「sort」コマンドの便利な例-パート1
付録
KVMの中で飼いならします🤤
結論: どちらもユースケースによりけりで利点がある🤔スパースにすると仮想ディスクのトリムの必要が無くなるけど、qemu-imgの機能でやった方がキメ細かい機能で便利な気がしますし、仮想ディスクはraw形式にしないと大幅パフォーマンス向上はしないから利便性重視にしよう🤤
lsコマンドでは見ている構造体メンバーが実装てきに違うからスパースファイルの実用量が分からない😅諦めてduで見ましょう🤤
findコマンドでスパースファイルを見分けられますけど、-printfオプションの解説ってなにか良いの存在していないかなぁ🤔# find . -type f -printf "%S\t%p\n" | gawk '$1 < 1.0 {print}'