Linux環境で仮想マシンを運用する際に検討するのが KVM (Kernel-based Virtual Machine) です。
KVMは、Linuxカーネルをタイプ1ハイパーバイザー(ベアメタルに近い形で動作するハイパーバイザー)へと変貌させるオープンソースの仮想化技術です。VirtualBoxやVMware Workstation Playerなどのタイプ2ハイパーバイザーと比較して、ホストOSのリソースを最大限に引き出せる高いパフォーマンスと、極めて低いオーバーヘッドが最大の魅力です。
Ubuntu DesktopではGUIで直感的に操作できる「仮想マシンマネージャー」や、コマンドラインで高度な制御が可能な「virsh」など、エコシステムが成熟しています。
本記事では、Ubuntu Desktopをベースに、KVMのインストールから仮想マシンの作成、そして運用のためのネットワーク初期設定まで解説します。
1. 前提条件の確認(仮想化支援機能のチェック)
まず、CPUがハードウェア仮想化をサポートしているか、および有効になっているかを確認します。
※仮想化支援機能(Intel: vmx, AMD: svm)の確認(0以上ならOK)
egrep -c '(vmx|svm)' /proc/cpuinfo
kvm-ok コマンドでの確認も行います。("KVM acceleration can be used" と出ればOK)
sudo apt update
sudo apt install -y cpu-checker
kvm-ok
※以下の出力が返ってくればOK
KVM acceleration can be used
2. KVMおよび関連パッケージのインストール
仮想化に必要なハイパーバイザー本体、管理ツール、およびGUIクライアント(virt-manager)をインストールします。以下の5つのコンポーネントがインストールされます。
- qemu-kvm(KVMとQEMU)
- libvirt-daemon-system
- libvirt-clients
- bridge-utils
- virt-manager
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
※ エラーが出た場合は、末尾の「トラブルシューティング」を参照してください。
3. ユーザー権限の設定
毎回 sudo をつけずに一般ユーザーで仮想マシンを管理できるよう、現在のユーザーを libvirt および kvm グループに追加します。
sudo adduser $USER libvirt
sudo adduser $USER kvm
※ グループの変更を反映させるため、ここで一度OSを再起動するか、ログアウトして再ログインしてください。
4. ブリッジネットワークの構築(Netplanを使用)
ホストマシンの物理NIC(ネットワークインターフェース)をブリッジ(br0)に紐付けます。
Ubuntu DesktopではNetplanがネットワークを管理しているため、nmcliで変更を加えてもNetplanに上書きされてしまいます。Netplanの設定ファイルを直接編集する方法を使います。
Hyper-V上で動かしている場合の事前確認
このUbuntuがHyper-VのVM上で動いている場合、ブリッジはそのままでは機能しません。Hyper-VはデフォルトでVMのNICを「自分のMACアドレスのトラフィックのみ通過」させる設定になっており、br0(eth0と異なるMACアドレスを持つ)のDHCPリクエストが破棄されます。
Windowsホスト側のPowerShellで以下を実行し、対象VMのMAC spoofingを有効にしてください(VMは停止した状態で実行)。Set-VMNetworkAdapter -VMName "VMの名前" -MacAddressSpoofing On
① 現在の物理NIC名を確認する
ip a
※ ここでは物理NIC名が eth0 であると仮定して進めます。環境に合わせて読み替えてください。
② 既存のNetplan設定ファイルを確認する
ls /etc/netplan/
既存の設定ファイル名を確認します(例:01-network-manager-all.yaml など)。
③ ブリッジの設定ファイルを作成する
sudo nano /etc/netplan/01-network-manager-all.yaml
以下の内容を入力します(eth0 の部分は実際のNIC名に合わせて変更してください)。
network:
version: 2
ethernets:
eth0:
dhcp4: false
bridges:
br0:
interfaces: [eth0]
dhcp4: true
※ 固定IPにしたい場合は、dhcp4: true の代わりに以下のように設定します。
dhcp4: false
addresses: [192.168.x.x/24]
routes:
- to: default
via: 192.168.x.1
nameservers:
addresses: [8.8.8.8]
④ パーミッションの設定
sudo chmod 600 /etc/netplan/01-network-manager-all.yaml
⑤ 設定の適用
sudo netplan apply
作業中、数秒間ネットワークが切断されます。設定後、ip a で br0 にIPアドレスが割り当てられていることを確認します。
5. Virt-Managerでのブリッジネットワーク割り当て
OS上でブリッジが作成できたら、それをKVM(libvirt)に認識させます。
アクティビティ画面などから 「仮想マシンマネージャー (virt-manager)」 を起動します。
上部メニューの 「編集」 > 「接続の詳細」 をクリックします。
「仮想ネットワーク」 タブを開きます。
(※デフォルトで「default」というNATネットワークが存在しますが、今回はこれは使用しません)
新規仮想マシンを作成するウィザードの最後の画面(「インストールの開始」の直前)で、「ネットワークの選択」 を開きます。
プルダウンから 「ホストデバイス br0 : macvtap」 ではなく、「共有された物理デバイス」 または 「ブリッジの名前を指定」 を選び、デバイス名に
br0を入力します。
これで、作成された仮想マシンはホストマシンと同じルーターからIPアドレス(DHCP)を直接取得し、外部ネットワークとシームレスに通信できるようになります。
トラブルシューティング
qemu-kvm が仮想パッケージとして扱われる場合
手順2のインストールコマンド実行時に以下のようなエラーが出ることがあります。
パッケージ qemu-kvm は、以下によって提供される仮想パッケージです:
qemu-system-x86-hwe 1:10.2.1+ds-1ubuntu4 (= 1:10.2.1+ds-1ubuntu4)
qemu-system-x86 1:10.2.1+ds-1ubuntu3 (= 1:10.2.1+ds-1ubuntu3)
インストールするには、明示的にいずれかを選択する必要があります。
Error: パッケージ 'qemu-kvm' にはインストール候補がありません
原因
qemu-kvm が実体のある単一のパッケージではなく、「仮想パッケージ(Virtual Package)」として扱われているためです。仮想パッケージとは、特定の機能を提供する複数のパッケージをまとめた「総称」のようなものです。今回のケースでは、qemu-kvm という機能を提供する実際のパッケージとして以下の2つがリポジトリに存在しています。
qemu-system-x86-hweqemu-system-x86
APT は「どちらのパッケージをインストールすればよいか自動で判断できない」ため、インストールの進行を止めてユーザーに明示的な選択を求めています。
解決方法
コマンド内の qemu-kvm を、実体のあるパッケージ名に置き換えて実行してください。
通常はこちら(標準版)をおすすめします:
sudo apt install -y qemu-system-x86 libvirt-daemon-system libvirt-clients bridge-utils virt-manager
最新のハードウェア機能を利用したい場合(HWE版):
sudo apt install -y qemu-system-x86-hwe libvirt-daemon-system libvirt-clients bridge-utils virt-manager
| パッケージ | 説明 |
|---|---|
qemu-system-x86 |
標準的なQEMUのシステムエミュレータ。一般的な用途であれば問題なく動作します。 |
qemu-system-x86-hwe |
比較的新しいCPUの命令セットや最新のハードウェア仮想化機能に最適化されたバージョン(HWE: Hardware Enablement)。最新のPC環境でパフォーマンスを最大限引き出したい場合に選択します。 |
どちらかをインストールすれば、従来通り virt-manager などを通じてKVMを利用した仮想マシンの構築が可能になります。
br0 にIPアドレスが割り当てられない(Hyper-V環境)
br0 が UP になっているのにIPv4アドレスが取得できない場合、Hyper-VのMAC spoofing制限が原因の可能性があります。
Hyper-Vは、VMのNICを通過するトラフィックをそのNICのMACアドレスに限定します。br0は eth0 とは異なるMACアドレスを持つため、DHCPリクエストがHyper-V側で破棄されます。
解決方法
WindowsホストのPowerShellでVMを停止した状態で以下を実行します:
Set-VMNetworkAdapter -VMName "VMの名前" -MacAddressSpoofing On
VM起動後に ip a で br0 にIPアドレスが割り当てられていることを確認してください。