Linux : VirtualBoxを捨ててVirt-Managerを使う

Linux
この記事は約9分で読めます。

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を表示し人間が操作するという感じです。

Icon from flaticon https://www.flaticon.com/

いろんなサイトを読みましたが自分の理解ではこんな感じです。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を参照することをおすすめします。必要となるパッケージがコロコロ変わってしまうようなので最新情報を見た方が良いでしよう。

Arch Wiki – Virt-Manager

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-nftLinuxカーネルネットワークのパケットを制御するツール
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の使い方を解説していきたいと思います。

おわり

株式会社AQUA
¥2,050 (2023/03/22 11:55時点 | Amazon調べ)

コメント

タイトルとURLをコピーしました