最近、Arch LinuxへのQEMU / KVM導入に苦戦しています。とりあえず備忘録として残しておきます。
QEMU / KVMとは?
KVM(Kernel-based Virtual Machine)は、Linuxカーネルに組み込まれている仮想化技術です。
Linuxカーネル自体をハイパーバイザとして利用し、仮想マシンを効率的に、少ないオーバーヘッドで実行することができます。
KVMを利用するためにはQEMUというソフトウェアを利用します。
QEMUはエミュレータです。
Virtual Box等と違い異なるアーキテクチャのエミュレートも可能ですが、QEMU自体のエミュレート速度は早くはありません。(→色々なものをソフトウェア的にエミューレートしてるから?)
要はKVMに足りない機能を補うためにQEMUを用いる、という事らしいです
メリットはなに?
KVMを用いた時点でVirtual Boxとかよりは高速だと思うのですが、それよりも凄いKVMの圧倒的なメリットは「ホストマシンに複数のGPUがある場合、余っているGPUをゲストマシンにパススルーできる」という点でしょう。仮想マシンでもほぼネイティブ性能でGPUを動作させることができます。
まあ、私は複数GPUが乗ってるマシンを持ってないので今のところ意味ないですが、、、
導入
sudo pacman -S qemu-full qemu-img libvirt virt-install virt-manager virt-viewer edk2-ovmf dnsmasq swtpm libosinfo tuned ntfs-3g
パッケージについて解説します。
qemu-full: QEMUのフルバージョンで、仮想化を行うために必要です。
qemu-img: QEMUイメージの管理に必要なツールです。
libvirt: 仮想化管理のためのAPIとデーモンで、仮想マシンの管理に必須です。
virt-install: コマンドラインから新しい仮想マシンを作成するためのツールです。
virt-manager: GUIを使用して仮想マシンを管理するためのツールです。
virt-viewer: 仮想マシンのコンソールに接続するためのツールです。
edk2-ovmf: UEFIファームウェアを提供し、特定の環境での仮想マシンに必要ですが、すべてのセットアップで必須ではありません。
dnsmasq: DHCPおよびDNSサービスを提供しますが、仮想マシンのネットワーク設定に必要な場合のみです。
swtpm: ソフトウェアTPMエミュレーターで、セキュリティ機能が必要な場合に使用します。
libosinfo: ゲストOSの情報を管理するためのライブラリで、特定の機能を使用する場合にのみ必要です。
tuned: システムのパフォーマンスを最適化するためのツールですが、仮想化の基本機能には影響しません。
ntfs-3g: LinuxでNTFSを読み書きするときに必要になります。
monolithic daemonを有効にする
sudo systemctl enable libvirtd.service
有効にするには再起動が必要です。
ホスト仮想化の検証
sudo virt-host-validate qemu
WARNは無視しても大丈夫、らしい
標準ユーザーでKVMを使えるようにする
sudo vim /etc/libvirt/libvirtd.conf
以下の二行をコメントアウトします;
unix_sock_group = "libvirt"
unix_sock_rw_perms = "0770"
ユーザーアカウントをlibvirtグループに追加します。
sudo usermod -a -G libvirt $(whoami)
newgrp libvirt
設定できたらシステムを再起動しましょう。
Windowsゲスト用のドライバ
ディスク、ネットワーク、グラフィックにvirtioドライバを適用すると速くなります。
ただ、Virt-Managerの設定からデバイスをvirtioに変更するとWindowsのインストーラーからストレージが見えなくなったりするため、インストールの過程でひと工夫必要です。→参考文献
virtioのドライバをFedoraのリポジトリから持ってきます。(virtio-win.iso)
ゲストOSとファイル共有をする
QEMUのゲストマシンとファイル共有するのはめんどくさいです。
sambaとかを使う方法もありますが、仮想マシンをネットから遮断したい場合などに使えません。
私が個人的に編み出したファイルの共有法は以下のとおりです。
QEMUの仮想ディスクイメージファイル(.qcow2)を/mntにマウントします。
(ゲストOSのディスクフォーマットがNTFSでも使うことができます。)
ゲストOSのディスクのルートにshare等の名前でディレクトリを作っておくとよいでしょう。
カーネルモジュールの読み込み
sudo modprobe nbd
マウント
sudo qemu-nbd -c /dev/nbd0 -f qcow2 /var/lib/libvirt/images/Windows11.qcow2
sudo mount /dev/nbd0p3 /mnt
(注:nbd0p3なのはこの場合3つ目のパーティションにWindowsが入っていたからです。「sudo gdisk -l /dev/nbd0」で中のパーティションを確認できます。)
アンマウント
cd ~
sudo umount /mnt
sudo qemu-nbd -d /dev/nbd0
アンマウントされたことを確認
(オプションなしでmountコマンドを実行すると現在マウントされているディレクトリが確認できます。)
mount
また、これらを簡単に実行できるようにシェルスクリプトなんかを作っておくと便利です。
参考文献
https://computingforgeeks.com/install-kvm-qemu-virt-manager-arch-manjar/
https://gist.github.com/tatumroaquin/c6464e1ccaef40fd098a4f31db61ab22
https://qiita.com/naoyoshinori/items/6f7647a2e2f4b563b6b9