Virt-ManagerとはIBM傘下のRedHatが開発しているQEMUとKVM(Kernel-based Virtual Machine)を利用した仮想マシンマネージャです。システムの構成によってネイティブに近いパフォーマンスを発揮することもあります。QEMU上でWindowsを動かしてゲームをしている人もいるようです。QEMUは様々アーキテクチャで動作でき、Android SDKにも使われていたり信頼性と高速性が高いエミュレータです。
QEMUはほぼすべてのGNU/Linuxで使えるので使わない手はありません。
Vir-Managerの仕組み
Virt-Managerの仕組みをざっくりと図にすると以下のようなものになります。KVMの仮想CPU支援機能を使いつつ、QEMUが残りのネットワークやグラフィックデバイスなどをエミュレートさせます。あとはVirt-managerがLibvirtというライブラリ(API)を使ってGUIを表示し人間が操作するという感じです。

いろんなサイトを読みましたが自分の理解ではこんな感じです。QEMUの一部がLinuxカーネルに取り入れられた結果KVMになったなどの経緯があり、古いサイトだとそのあたりがわからないのでかなり混乱しました。
ちなみにVirtualBoxは2007年リリース当初はQEMUの仮想ハードウェアを利用していました。
Virt-ManagerとVirtualBoxの比較
VirtualBoxもVirt-Manager同様KVMを用いたCPUの仮想支援機能を使えますがVRAMの利用可能容量が厳しく制限されており、GPUパススルーなどは行なえません。ネットワーク速度も遅いです。
よくVirtualBoxと引き合いに出されるVMware Playerは大量のVRAMを扱えますがNVIDIAと提携しているため、AMD GPUが使えないという致命的な問題もあります。
Virt-Managerの導入法
QEMUが中々広まらないのは多少の設定が必要なのとターミナルがメインな操作方法だからでしよう。しかし、近年グラフィックUIを有したツールも進化してきているので利便性は高くなっています。
ここではArch LinuxにQEMUとGUIツールである「Virtual Machine Manager」の導入方法を解説していきます。現代のほとんどのディストリビューションが利用しているSystemdを前提とした記事です。
躓いてしまった場合はArchWikiを参照することをおすすめします。必要となるパッケージがコロコロ変わってしまうようなので最新情報を見た方が良いでしよう。
CPUの仮想化支援機能の有無をチェック
AMDやIntel製のCPUには仮想化をハードウェアレベルで支援するための拡張機能があります。この機能はそれぞれAMD CPUではSVM、Intel CPUではVT-Xと呼ばれています。KVMを利用する上で必須な機能であり、サポートしているCPUを使う必要があります。
近年ほとんどのCPUでこの仮想化機能は搭載されています。ですが、AMD BulldozerやIntel Sandybridge以前の古いCPUは対応していないのでKVMは利用できません。大半の場合、この支援機能はデフォルトで無効になっています。
以下確認用のコマンドです。
$ LC_ALL=C lscpu | grep Virtualization
Virtualization: AMD-V
上記のようにAMD-VかIntel-VTなどと表示されればハードウェア支援機能が有効になっています。何も表示されていなければBIOSで設定変更が必要です。
必要なパッケージを確認
こちらArch Linuxで必要と思われるパッケージ一覧です。
libvirt | 仮想化エンジンをコントロールするためのAPI |
qemu | 仮想マシンエミュレーター |
iptables-nft | Linuxカーネルネットワークのパケットを制御するツール |
dnsmasq | 軽量なDNSサーバとDHCPサーバ |
edk2-ovmf | 仮想マシンのためのファームウェア(x86_64,i686)、仮想マシンがUEFIを利用している場合必要。 |
最新のArchWikiではAURにあるebtables
よりも同様のイーサネットフィルタリング機能を有する公式パッケージにあるiptables-nft
を推奨しています。
他のディストリビューションは利用しているパッケージ・サービスが大きく異なることがあるので事前に調べる必要があります。
QEMUとVirtual Machine Managerのインストール
QEMU本体と管理しやすいようGUIフロントエンドのインストールを行います。
・Pacmanパッケージマネージャ(Arch系)
$ sudo pacman -S virt-manager qemu libvirt edk2-ovmf dnsmasq iptables-nft
・APTパッケージマネージャ(Debian系)
$ sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon virt-manager
Libvitサービスの設定
LibvirtはKVMやXenなどのハイパーバイザに仮想マシンの制御を簡単に行えるよう制御を抽象化したAPIライブラリです。このサービスが開始しているかどうか確認を行い、有効化されてなければ設定を行います。
設定していなければこのようなエラーが表示されます。
Unable to connect to libvirt qemu:///system.
ソケットの '/var/run/libvirt/virtqemud-sock' への接続に失敗しました: そのようなファイルやディレクトリはありません
Libvirtのスタータスを確認
まずはSystemdでLibvirtサービスがどのような状態なのかを確認します。
$ sudo systemctl status libvirtd.service
○ libvirtd.service - Virtualization daemon
Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; disabled; vendor>
Active: inactive (dead)
TriggeredBy: ○ libvirtd-admin.socket
○ libvirtd.socket
○ libvirtd-ro.socket
Docs: man:libvirtd(8)
https://libvirt.org
このシステムでは inactive (dead)
となっているのでサービスを有効化&開始する必要があります。
Libvirtdサービスを開始・有効化
$ sudo systemctl start libvirtd.service
Libvirtdサービスをシステム起動時から有効化します。
$ sudo systemctl enable libvirtd.service
認証機能を設定する
root権限を利用せずにLibvirtを利用するにはKVMの設定を行う必要があります。更に副効果としてLibvirtのネットワーク機能を利用することができるようになります。
$ sudoedit /etc/libvirt/libvirtd.conf
unix_sock_group = 'libvirt'
...
unix_sock_rw_perms = '0770'
一番簡単な方法は自分のユーザIDを libvirt
グループに追加することです。libvirt
グループに登録されたメンバーはRWソケットにパスワードの入力なくアクセスできます。
$ sudo gpasswd -a nemo libvirt
QEMU側の設定
QEMUにローカルドライブにアクセスする権限を与えます。
$ sudoedit /etc/libvirt/qemu.conf
下記の2行をアンコメントし、username
に自身のユーザ名を入れます。
user = username
...
group = username
仮想ネットワークデバイス・エラーの対処法
Arch Wikiに沿ってすべての設定を行いましたが、ゲスト仮想マシンを立ち上げようとしたら下記のようなエラーが表示されました。
仮想マシンの開始中にエラーが発生しました: 要求された操作は有効ではありません: network 'default' is not active
QEMUをLinuxにインストールすると default
NATネットワークがLibvirtdによって自動的に生成されます。このネットワークは仮想マシンの仮想NIC(ネットワークインターフェイスカード) 同士をつなげる役割を担っています。設定は /etc/libvirt/qemu/networks/default.xml
内に格納されています。
上記のエラー表示はこの default
ネットワークが何かしらの理由で無効になってしまっていることを示します。ネットワークを使う設定になっている場合はその仮想マシンは起動しません。
設定方法
Libvirtを管理するためのコマンドvirsh
を使います。存在するすべての仮想ネットワークデバイスを表示します。
$ sudo virsh net-list --all
$ sudo virsh net-list --all
名前 状態 自動起動 永続
------------------------------------------------
default 停止状態 いいえ (no) はい (yes)
ご丁寧に日本語化されています。自動起動が「いいえ(no)」になっているので自動起動させます。
$ sudo virsh net-autostart default
これでLibvirtdサービスを再起動すれば自動的にdefault
ネットワークが起動します。
Libvirtd の再起動
Libvirtdサービスを再起動して導入完了です。
sudo systemctl restart libvirtd.service
Virtual Machine Managerを起動しましよう。

次の記事でVirt-Managerの使い方を解説していきたいと思います。
おわり
コメント