KVM

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

KVMKernel-based Virtual Machine 、は Linux カーネルに組み込まれた ハイパーバイザ です。その目的は Xen に似ていますがより簡単に動作させることができます。エミュレーションを使うネイティブの QEMU とは異なり、KVM はカーネルモジュールを介して CPU 拡張機能 (HVM) を用いた QEMU の特別な動作モードです。

KVM を使用することで、修正を加えずに GNU/Linux や Windows などのオペレーティングシステムが動作する仮想マシンを複数動かすことができます (詳しくは Guest Support Status を参照してください)。それぞれの仮想マシンには専用の仮想化されたハードウェアが使われます: ネットワークカード、ディスク、グラフィックカードなど。

KVM と Xen, VMware, QEMU の違いについては KVM FAQ で説明されています。

この記事では KVM をバックエンドに使うエミュレータに共通の機能は扱いません。そのような情報は各々の該当する記事を参照してください。

KVM サポートの確認

ハードウェアのサポート

KVM を使うには仮想マシンのホストのプロセッサが仮想化をサポートしている必要があります (Intel のプロセッサでは VT-x、AMD のプロセッサでは AMD-V という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:

$ LC_ALL=C.UTF-8 lscpu | grep Virtualization

次を実行することでも確認できます:

$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo

いずれのコマンドを実行しても何も表示されない場合、あなたのプロセッサはハードウェア仮想化をサポートしていないため、KVM を使用することはできません

ノート: BIOS の方で仮想化サポートを有効にする必要があるときもあります。過去 10 年以内に製造された AMD および Intel のすべての x86_64 プロセッサは仮想化をサポートしています。プロセッサが仮想化をサポートしていないように見える場合、ほぼ確実に BIOS で無効になっているだけです。

カーネルのサポート

Arch Linux のカーネルは KVM をサポートするために必要な カーネルモジュール を提供しています。

  • 必要なモジュール (kvm と、kvm_amd または kvm_intel のいずれか) がカーネルに含まれているかどうかは、次のコマンドで確認できます:
$ zgrep CONFIG_KVM= /proc/config.gz

この設定が y または m の場合のみ、モジュールは利用可能です。

  • 続いて、以下のコマンドでカーネルモジュールが自動的に読み込まれているかを確認します:
$ lsmod | grep kvm
kvm_intel             245760  0
kvmgt                  28672  0
mdev                   20480  2 kvmgt,vfio_mdev
vfio                   32768  3 kvmgt,vfio_mdev,vfio_iommu_type1
kvm                   737280  2 kvmgt,kvm_intel
irqbypass              16384  1 kvm

このコマンドが何も出力しない場合、モジュールを手動で読み込む必要があります。詳細は カーネルモジュール#手動でモジュールを扱う を参照してください。

ヒント: kvm_intel または kvm_amdmodprobe に失敗するが、kvm の読み込みには成功し、かつ lscpu の出力がハードウェア仮想化のサポートを示している場合は、BIOS の設定を確認してください。特にノートパソコンベンダーは、これらの CPU 拡張機能をデフォルトで無効にしていることがあります。ハードウェアが非対応なのか、BIOS で無効にされているだけなのかを判断するには、modprobe に失敗した直後の dmesg の出力を確認してください。

Virtio を使った準仮想化

準仮想化は、ゲストがホストマシン上のデバイスを使用するための、高速かつ効率的な通信手段を提供します。KVM は Virtio API をハイパーバイザーとゲスト間のレイヤーとして使うことで準仮想化デバイスを仮想マシンに提供します。

すべての Virtio デバイスは 2 つの構成要素を持ちます: ホストのデバイスとゲストのドライバーです。

カーネルの対応状況

VIRTIO モジュールがカーネルに組み込まれているかを確認するには、仮想マシン内で 次のコマンドを実行します:

$ zgrep VIRTIO /proc/config.gz

続いて、以下のコマンドでカーネルモジュールが自動的に読み込まれているか確認します:

$ lsmod | grep virtio

上記のコマンドが何も出力しない場合は、カーネルモジュールを手動で読み込む 必要があります。

準仮想化デバイスの一覧

  • ネットワークデバイス (virtio-net)
  • ブロックデバイス (virtio-blk)
  • コントローラデバイス (virtio-scsi)
  • シリアルデバイス (virtio-serial)
  • バルーンデバイス (virtio-balloon)

KVM の使い方

次の記事を参照してください: QEMU

ヒントとテクニック

ノート: 一般的な小技やヒントは QEMU#ヒントとテクニックQEMU/トラブルシューティングを参照してください。

ネストされた仮想化

ネストされた仮想化を使うことで、元の仮想マシンやネットワークに修正を加えることなく、既存の仮想マシンを別のハイパーバイザや他のクラウド上で動作させることができるようになります。

ホスト側で、kvm_intel の nested 機能を有効にしてください:

ノート: AMD の場合も同様に設定できます。その際は intelamd に置き換えてください。
# modprobe -r kvm_intel
# modprobe kvm_intel nested=1

永続化させるには (カーネルモジュール#モジュールオプションを設定するを参照):

/etc/modprobe.d/kvm_intel.conf
options kvm_intel nested=1

機能が有効になっているか確認:

$ cat /sys/module/kvm_intel/parameters/nested
Y

全ての CPU の機能をゲスト環境に転送するために"ホストパススルー"モードを有効化:

  1. QEMU を使用する場合、次のコマンドでゲスト VM を実行してください: qemu-system-x86_64 -enable-kvm -cpu host
  2. virt-manager を使用する場合、CPU モデルを host-passthrough に変更してください。
  3. virsh を使用する場合、virsh edit vm-name を使って CPU 行を <cpu mode='host-passthrough' check='partial'/> に変更してください。

VM を起動したら vmx フラグが存在するか確認:

$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo

ヒュージページの有効化

ヒュージページを有効にすることで仮想マシンのパフォーマンスを向上させることができます。 最新の Arch Linux と KVM ならおそらく必要条件はすべて満たされているはずです。/dev/hugepages ディレクトリが存在しているかどうかチェックしてください。ディレクトリが存在しなかったら、作成してください。 このディレクトリを利用するには適切なパーミッションが必要です。デフォルトでは root の UID および GID で 0755 ですが、ここでは kvm グループのメンバーであればヒュージページにアクセスできるようにします。

/etc/fstab に以下を追加:

/etc/fstab
hugetlbfs       /dev/hugepages  hugetlbfs       mode=01770,gid=kvm        0 0

gid=kvm の代わりに GID 番号を直接指定しても構いませんが、その番号は kvm グループと一致している必要があります。1770 のモードは、グループ内の誰でもファイルの作成は可能ですが、他のメンバーのファイルの削除やリネームはできないようにします。/dev/hugepages が正しくマウントされていることを確認してください:

# umount /dev/hugepages
# mount /dev/hugepages
$ mount | grep huge
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)

それから必要なヒュージページの数を計算します。ヒュージページの大きさを確認するには:

$ grep Hugepagesize /proc/meminfo

通常は 2048 kB ≙ 2 MB です。仮想マシンを 1024 MB で動作させたい場合、1024 / 2 = 512 となり少し追加して 550 まで丸めることができます。必要とするヒュージページをマシンに設定:

# sysctl -w vm.nr_hugepages=550

十分な空きメモリがあれば以下のように表示されるはずです:

$ grep HugePages_Total /proc/meminfo
HugesPages_Total:  550

数字がさらに小さい場合、アプリケーションを閉じるか少ないメモリで仮想マシンを開始してください (number_of_pages x 2):

$ qemu-system-x86_64 -enable-kvm -m 1024 -mem-path /dev/hugepages -hda <disk_image> [...]

そして -mem-path パラメータを使うことでヒュージページが利用されます。

仮想マシンの実行中に、使われているヒュージページを確認するには:

$ grep HugePages /proc/meminfo 
HugePages_Total:     550
HugePages_Free:       48
HugePages_Rsvd:        6
HugePages_Surp:        0

問題がないようでしたらデフォルトでヒュージページを有効にすることができます。以下を /etc/sysctl.d/40-hugepage.conf に追加してください:

/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = 550

参照:

セキュアブート

KVM において Secure Boot を有効にするには、いくつかの要件を満たす必要があります:

  1. セキュアブートをサポートする UEFI を使用する必要があります。
  2. その UEFI にキーが登録されている必要があります。
ノート: Arch Linux は、Fedora のようなディストリビューションとは異なり、現時点でセキュアブートキーを提供していません。Arch Linux をセキュアブートで起動したい場合は、自分で署名キーを作成し、以下の手順に従った上でカーネルに署名する必要があります。詳しくは Unified_Extensible_Firmware_Interface/セキュアブート を参照してください。

セキュアブート対応の UEFI を有効にするには、edk2-ovmf をインストールし、仮想マシンにセキュアブート対応の UEFI を使用させます。libvirt を使用している場合、仮想マシンの XML 設定に以下を追加します:

<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
</os>

次に、いくつかのキーを登録する必要があります。この例では、Microsoft および Red Hat のセキュアブートキーを登録します。virt-firmware をインストールし、以下のコマンドを実行します。vm_name は対象の仮想マシンの名前に置き換えてください。

$ virt-fw-vars --input /usr/share/edk2/x64/OVMF_VARS.4m.fd --output /var/lib/libvirt/qemu/nvram/vm_name_SECURE_VARS.fd --secure-boot --enroll-redhat

その後、仮想マシンの libvirt XML 設定を編集し、新しく作成された VARS ファイルを指定します。

<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
  <nvram template="/usr/share/edk2/x64/OVMF_VARS.4m.fd">/var/lib/libvirt/qemu/nvram/{vm-name}_SECURE_VARS.fd</nvram>
</os>

これでセキュアブートが自動的に有効になるはずです。UEFI ブートロゴが表示されたときに F2 を押して仮想マシンの BIOS に入り、セキュアブートが有効になっているか確認できます。

参照

翻訳ステータス: このページは en:QEMU の翻訳バージョンです。最後の翻訳日は 2025-07-26 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。