「KVM」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(行頭の空白の抜けを修正)
 
(4人の利用者による、間の11版が非表示)
1行目: 1行目:
[[Category:仮想化]]
+
[[Category:ハイパーバイザ]]
 
[[Category:カーネル]]
 
[[Category:カーネル]]
  +
[[es:KVM]]
 
[[en:KVM]]
 
[[en:KVM]]
[[it:KVM]]
+
[[ru:KVM]]
[[zh-CN:KVM]]
+
[[zh-hans:KVM]]
 
{{Related articles start}}
 
{{Related articles start}}
{{Related|QEMU}}
+
{{Related|:Category:ハイパーバイザ}}
 
{{Related|Libvirt}}
 
{{Related|Libvirt}}
{{Related|VirtualBox}}
 
{{Related|Xen}}
 
{{Related|VMware}}
 
 
{{Related articles end}}
 
{{Related articles end}}
'''KVM''' (Kernel-based Virtual Machine) は Linux カーネルに搭載さている[[Wikipedia:ja:ハイパーバイザ|ハイパーバイザ]]です。意図しているところは [[Xen|Xen]] 似ていますがもっとシンプルに動作ます。エミュレーションを使うネイティブの [[QEMU|QEMU]] と違って、KVM は仮想化のための CPU 拡張命令 ([[Wikipedia:Hardware-assisted virtualization|HVM]]) をカーネルモジュールを介して利する QEMU の特オペレーティングモードです。
+
'''KVM'''、[[Wikipedia:ja:Kernel-based_Virtual Machine|Kernel-based Virtual Machine]] は Linux カーネルに組み込ま[[Wikipedia:ja:ハイパーバイザ|ハイパーバイザ]] です。その目的は [[Xen]] 似ていますがより簡単に動作させることができます。エミュレーションを使うネイティブの [[QEMU]] とは異なり、KVM はカーネルモジュールを介して CPU 拡張機能 ([[Wikipedia:Hardware-assisted virtualization|HVM]]) を用いた QEMU の特動作モードです。
   
KVM を使用することで、修正を加えずに GNU/Linux や Windows などのオペレーティングシステムが動作する仮想マシンを複数動かすことができます (詳しくは [http://www.linux-kvm.org/page/Guest_Support_Status Guest Support Status] をさい)。それぞれの仮想マシンには専用の仮想化されたハードウェアが使われます: ネットワークカード、ディスク、グラフィックカードなど。
+
KVM を使用することで、修正を加えずに GNU/Linux や Windows などのオペレーティングシステムが動作する仮想マシンを複数動かすことができます (詳しくは [https://www.linux-kvm.org/page/Guest_Support_Status Guest Support Status] を参照しください)。それぞれの仮想マシンには専用の仮想化されたハードウェアが使われます: ネットワークカード、ディスク、グラフィックカードなど。
   
KVM と [[Xen|Xen]], [[VMware|VMware]], QEMU の違いについては [http://www.linux-kvm.org/page/FAQ#General_KVM_information KVM FAQ] で説明されています。
+
KVM と [[Xen]], [[VMware]], QEMU の違いについては [https://www.linux-kvm.org/page/FAQ#General_KVM_information KVM FAQ] で説明されています。
   
この記事では KVM をバックエンドに使うエミュレータに共通の機能は扱いません。そのような情報は各々の該当する記事をさい。
+
この記事では KVM をバックエンドに使うエミュレータに共通の機能は扱いません。そのような情報は各々の該当する記事を参照しください。
   
 
== KVM サポートの確認 ==
 
== KVM サポートの確認 ==
24行目: 22行目:
   
 
KVM を使うには仮想マシンのホストのプロセッサが仮想化をサポートしている必要があります (Intel のプロセッサでは VT-x、AMD のプロセッサでは AMD-V という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:
 
KVM を使うには仮想マシンのホストのプロセッサが仮想化をサポートしている必要があります (Intel のプロセッサでは VT-x、AMD のプロセッサでは AMD-V という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:
$ lscpu
 
   
  +
$ LC_ALL=C.UTF-8 lscpu | grep Virtualization
プロセッサが仮想化をサポートしていれば、それを示す行があるはずです。
 
   
 
次を実行することでも確認できます:
 
次を実行することでも確認できます:
$ grep -E "(vmx|svm|0xc0f)" --color=always /proc/cpuinfo
 
   
  +
$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo
このコマンドを実行しても何も表示されない場合、あなたのプロセッサはハードウェア仮想化をサポート'''していない'''ため、KVM を使用することは'''できません'''。
 
   
  +
いずれのコマンドを実行しても何も表示されない場合、あなたのプロセッサはハードウェア仮想化をサポート'''していない'''ため、KVM を使用することは'''できません'''。
{{Note|BIOS の方で仮想化サポートを有効にする必要があるときもあります。}}
 
  +
  +
{{Note|BIOS の方で仮想化サポートを有効にする必要があるときもあります。過去 10 年以内に製造された AMD および Intel のすべての x86_64 プロセッサは仮想化をサポートしています。プロセッサが仮想化をサポートしていないように見える場合、ほぼ確実に BIOS で無効になっているだけです。}}
   
 
=== カーネルのサポート ===
 
=== カーネルのサポート ===
Arch Linux のカーネルは KVM と VIRTIO をサポートする適切な[[カーネルモジュール]]を提供しています。
 
==== KVM モジュール ====
 
あなたの使っているカーネルで必要なカーネルモジュール ({{ic|kvm}} と、{{ic|kvm_amd}} か {{ic|kvm_intel}} のどちらか) が使えるようになっているかは次のコマンドで確認できます (カーネルが {{ic|CONFIG_IKCONFIG_PROC}} を有効にしてビルドされたことが前提です):
 
$ zgrep CONFIG_KVM /proc/config.gz
 
モジュールが {{ic|y}} か {{ic|m}} に設定されていない場合、そのモジュールは利用'''できない'''ことを意味します。
 
   
  +
Arch Linux のカーネルは KVM をサポートするために必要な [[カーネルモジュール]] を提供しています。
==準仮想化デバイス==
 
  +
ゲストがホストマシンのデバイスを使えるように、準仮想化は高速で効率的な通信手段を提供します。KVM はハイパーバイザーとゲスト間のレイヤーとして Virtio API を使って仮想マシンに準仮想化デバイスを提供します。
 
  +
* 必要なモジュール ({{ic|kvm}} と、{{ic|kvm_amd}} または {{ic|kvm_intel}} のいずれか) がカーネルに含まれているかどうかは、次のコマンドで確認できます:
  +
  +
$ zgrep CONFIG_KVM= /proc/config.gz
  +
  +
この設定が {{ic|y}} または {{ic|m}} の場合のみ、モジュールは利用可能です。
  +
  +
* 続いて、以下のコマンドでカーネルモジュールが自動的に読み込まれているかを確認します:
  +
  +
{{hc|$ 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
  +
}}
  +
  +
このコマンドが何も出力しない場合、モジュールを手動で読み込む必要があります。詳細は [[カーネルモジュール#手動でモジュールを扱う]] を参照してください。
  +
  +
{{Tip|{{ic|kvm_intel}} または {{ic|kvm_amd}} の {{ic|modprobe}} に失敗するが、{{ic|kvm}} の読み込みには成功し、かつ {{ic|lscpu}} の出力がハードウェア仮想化のサポートを示している場合は、BIOS の設定を確認してください。特にノートパソコンベンダーは、これらの CPU 拡張機能をデフォルトで無効にしていることがあります。ハードウェアが非対応なのか、BIOS で無効にされているだけなのかを判断するには、{{ic|modprobe}} に失敗した直後の [[dmesg]] の出力を確認してください。}}
  +
  +
== Virtio を使った準仮想化 ==
  +
  +
準仮想化は、ゲストがホストマシン上のデバイスを使用するための、高速かつ効率的な通信手段を提供します。KVM は '''Virtio''' API をハイパーバイザーとゲスト間のレイヤーとして使うことで準仮想化デバイスを仮想マシンに提供します。
  +
  +
すべての Virtio デバイスは 2 つの構成要素を持ちます: ホストのデバイスとゲストのドライバーです。
  +
  +
=== カーネルの対応状況 ===
   
  +
VIRTIO モジュールがカーネルに組み込まれているかを確認するには、'''仮想マシン内で''' 次のコマンドを実行します:
virtio デバイスは全て2つに分けることができます: ホストのデバイスとゲストのドライバーです。
 
   
  +
$ zgrep VIRTIO /proc/config.gz
=== VIRTIO モジュール ===
 
Virtio はネットワークやディスクデバイスドライバーの仮想化規格です。これによってゲストはネットワークやディスク操作の高いパフォーマンスを得ることが可能になり、準仮想化で役に立ちます。次のコマンドで必要なモジュールが使用可能か確認します:
 
$ zgrep CONFIG_VIRTIO /proc/config.gz
 
   
=== カーネルモジュールのロード ===
+
続いて、以下のコマンドでカーネルモジュールが自動的に読み込まれているか確認します:
   
まず、カーネルモジュールが自動でロードされているか確認してください。最新の [[udev|udev]] ではそうなっているはずです。
 
$ lsmod | grep kvm
 
 
$ lsmod | grep virtio
 
$ lsmod | grep virtio
   
上記のコマンドが何もメッセージを返さない場合、カーネルモジュールを[[カーネルモジュール#ロード|ロード]]する必要があります。
+
上記のコマンドが何も出力しない場合[[カーネルモジュール#手動でモジュールを扱う|カーネルモジュールを手動で読み込む]] 必要があります。
{{Tip|
 
If modprobing {{Ic|kvm_intel}} or {{Ic|kvm_amd}} fails but modprobing {{Ic|kvm}} succeeds, (and {{ic|lscpu}} claims that hardware acceleration is supported), check your BIOS settings. Some vendors (especially laptop vendors) disable these processor extensions by default. To determine whether there's no hardware support or there is but the extensions are disabled in BIOS, the output from {{Ic|dmesg}} after having failed to modprobe will tell.}}
 
   
 
=== 準仮想化デバイスの一覧 ===
 
=== 準仮想化デバイスの一覧 ===
70行目: 85行目:
   
 
== KVM の使い方 ==
 
== KVM の使い方 ==
次の記事を参照してください: [[QEMU|QEMU]]。
 
   
  +
次の記事を参照してください: [[QEMU]]。
== Tips and tricks ==
 
   
  +
== ヒントとテクニック ==
{{Note|一般的な小技やヒントは [[QEMU#Tips and tricks|QEMU#Tips and tricks]] や [[QEMU#トラブルシューティング|QEMU#トラブルシューティング]] を見て下さい。}}
 
   
  +
{{Note|一般的な小技やヒントは [[QEMU#ヒントとテクニック]] や [[QEMU/トラブルシューティング]]を参照してください。}}
=== 仮想化のネスト ===
 
   
  +
=== ネストされた仮想化 ===
Nested Virtualization を使うことで、元の仮想マシンやネットワークに修正を加えることなく、既存の仮想マシンを別のハイパーバイザーや他のクラウド上で動作させることができるようになります。
 
  +
  +
ネストされた仮想化を使うことで、元の仮想マシンやネットワークに修正を加えることなく、既存の仮想マシンを別のハイパーバイザや他のクラウド上で動作させることができるようになります。
   
 
ホスト側で、{{ic|kvm_intel}} の nested 機能を有効にしてください:
 
ホスト側で、{{ic|kvm_intel}} の nested 機能を有効にしてください:
  +
  +
{{Note|AMD の場合も同様に設定できます。その際は {{ic|intel}} を {{ic|amd}} に置き換えてください。}}
  +
 
# modprobe -r kvm_intel
 
# modprobe -r kvm_intel
 
# modprobe kvm_intel nested=1
 
# modprobe kvm_intel nested=1
   
 
永続化させるには ([[カーネルモジュール#モジュールオプションを設定する]]を参照):
 
永続化させるには ([[カーネルモジュール#モジュールオプションを設定する]]を参照):
  +
{{hc|/etc/modprobe.d/modprobe.conf|<nowiki>
 
  +
{{hc|/etc/modprobe.d/kvm_intel.conf|2=
 
options kvm_intel nested=1
 
options kvm_intel nested=1
  +
}}
</nowiki>}}
 
   
機能が有効になっているか確認:
+
機能が有効になっているか確認:
{{hc|<nowiki>$ systool -m kvm_intel -v | grep nested</nowiki>|<nowiki>
 
nested = "Y"
 
</nowiki>}}
 
   
  +
{{hc|$ cat /sys/module/kvm_intel/parameters/nested|2=
次のコマンドでゲスト VM を実行してください:
 
  +
Y
$ qemu-system-x86_64 -enable-kvm -cpu host
 
  +
}}
   
  +
全ての CPU の機能をゲスト環境に転送するために"ホストパススルー"モードを有効化:
VM を起動したら vmx フラグが存在するか確認:
 
$ grep -E "(vmx|svm)" /proc/cpuinfo
 
   
  +
# [[QEMU]] を使用する場合、次のコマンドでゲスト VM を実行してください: {{ic|qemu-system-x86_64 -enable-kvm -cpu host}}。
=== 手軽なネットワーク ===
 
  +
# ''virt-manager'' を使用する場合、CPU モデルを {{ic|host-passthrough}} に変更してください。
  +
# ''virsh'' を使用する場合、{{ic|virsh edit ''vm-name''}} を使って CPU 行を {{ic|1=<cpu mode='host-passthrough' check='partial'/>}} に変更してください。
   
  +
VM を起動したら {{ic|vmx}} フラグが存在するか確認:
ブリッジネットワークの設定は少し厄介です。実験目的で VM を使いたいのであれば、SSH トンネリングを使ってホストとゲストを接続するという方法があります。
 
   
  +
$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo
基本的な手順は以下の通りです:
 
* ホスト OS で SSH サーバーをセットアップ
 
* (任意) トンネリング用のユーザーを作成 (例: tunneluser)
 
* VM に SSH をインストール
 
* セットアップ認証
 
   
  +
=== ヒュージページの有効化 ===
SSH のセットアップについては [[SSH|SSH]] の記事、特に [[SSH#他のポートのフォワーディング|SSH#他のポートのフォワーディング]] を参照してください。
 
   
  +
<!-- 翻訳除外: {{Merge|QEMU|qemu-kvm no longer exists. After the above issue is cleared, I suggest merging this section into [[QEMU]].}} -->
When using the default user network stack, the host is reachable at address 10.0.2.2.
 
   
  +
ヒュージページを有効にすることで仮想マシンのパフォーマンスを向上させることができます。
If everything works and you can SSH into the host, simply add something like the following to your {{ic|/etc/rc.local}}
 
  +
最新の Arch Linux と KVM ならおそらく必要条件はすべて満たされているはずです。{{ic|/dev/hugepages}} ディレクトリが存在しているかどうかチェックしてください。ディレクトリが存在しなかったら、作成してください。
# Local SSH Server
 
  +
このディレクトリを利用するには適切なパーミッションが必要です。デフォルトでは root の UID および GID で 0755 ですが、ここでは kvm グループのメンバーであればヒュージページにアクセスできるようにします。
echo "Starting SSH tunnel"
 
sudo -u vmuser ssh tunneluser@10.0.2.2 -N -R 2213:127.0.0.1:22 -f
 
# Random remote port (e.g. from another VM)
 
echo "Starting random tunnel"
 
sudo -u vmuser ssh tunneluser@10.0.2.2 -N -L 2345:127.0.0.1:2345 -f
 
   
  +
{{ic|/etc/fstab}} に以下を追加:
In this example a tunnel is created to the SSH server of the VM and an arbitrary port of the host is pulled into the VM.
 
   
  +
{{hc|/etc/fstab|2=
This is a quite basic strategy to do networking with VMs. However, it is very robust and should be quite sufficient most of the time.
 
  +
hugetlbfs /dev/hugepages hugetlbfs mode=01770,gid=kvm 0 0
  +
}}
   
  +
{{ic|1=gid=kvm}} の代わりに GID 番号を直接指定しても構いませんが、その番号は {{ic|kvm}} グループと一致している必要があります。{{ic|1770}} のモードは、グループ内の誰でもファイルの作成は可能ですが、他のメンバーのファイルの削除やリネームはできないようにします。{{ic|/dev/hugepages}} が正しくマウントされていることを確認してください:
=== ヒュージページの有効化 ===
 
 
ヒュージページを有効にすることで仮想マシンのパフォーマンスを向上させることができます。最新の Arch Linux と KVM ならおそらく必要条件はすべて満たされているはずです。{{ic|/dev/hugepages}} ディレクトリが存在しているかどうかチェックしてください。ディレクトリが存在しなかったら、作成してください。そしてこのディレクトリに適切なパーミッションを設定します。
 
 
{{ic|/etc/fstab}} に以下を追加:
 
hugetlbfs /dev/hugepages hugetlbfs mode=1770,gid=78 0 0
 
   
Of course the gid must match that of the {{ic|kvm}} group. The mode of {{ic|1770}} allows anyone in the group to create files but not unlink or rename each other's files. Make sure {{ic|/dev/hugepages}} is mounted properly:
 
 
{{hc|# umount /dev/hugepages
 
{{hc|# umount /dev/hugepages
 
# mount /dev/hugepages
 
# mount /dev/hugepages
$ mount <nowiki>|</nowiki> grep huge|
+
$ mount {{!}} grep huge|2=
2=hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)
+
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)
 
}}
 
}}
   
  +
それから必要なヒュージページの数を計算します。ヒュージページの大きさを確認するには:
Now you can calculate how many hugepages you need. Check how large your hugepages are:
 
  +
 
$ grep Hugepagesize /proc/meminfo
 
$ grep Hugepagesize /proc/meminfo
   
  +
通常は 2048 kB ≙ 2 MB です。仮想マシンを 1024 MB で動作させたい場合、1024 / 2 = 512 となり少し追加して 550 まで丸めることができます。必要とするヒュージページをマシンに設定:
Normally that should be 2048 kB ≙ 2 MB. Let's say you want to run your virtual machine with 1024 MB. 1024 / 2 = 512. Add a few extra so we can round this up to 550. Now tell your machine how many hugepages you want:
 
  +
# echo 550 > /proc/sys/vm/nr_hugepages
 
  +
# sysctl -w vm.nr_hugepages=550
   
 
十分な空きメモリがあれば以下のように表示されるはずです:
 
十分な空きメモリがあれば以下のように表示されるはずです:
  +
{{hc|$ grep HugePages_Total /proc/meminfo |
 
  +
{{hc|$ grep HugePages_Total /proc/meminfo|
 
HugesPages_Total: 550
 
HugesPages_Total: 550
 
}}
 
}}
   
  +
数字がさらに小さい場合、アプリケーションを閉じるか少ないメモリで仮想マシンを開始してください (number_of_pages x 2):
If the number is smaller, close some applications or start your virtual machine with less memory (number_of_pages x 2):
 
  +
 
$ qemu-system-x86_64 -enable-kvm -m 1024 -mem-path /dev/hugepages -hda <disk_image> [...]
 
$ qemu-system-x86_64 -enable-kvm -m 1024 -mem-path /dev/hugepages -hda <disk_image> [...]
   
  +
そして {{ic|-mem-path}} パラメータを使うことでヒュージページが利用されます。
Note the {{ic|-mem-path}} parameter. This will make use of the hugepages.
 
  +
  +
仮想マシンの実行中に、使われているヒュージページを確認するには:
   
Now you can check, while your virtual machine is running, how many pages are used:
 
 
{{hc|$ grep HugePages /proc/meminfo |
 
{{hc|$ grep HugePages /proc/meminfo |
 
HugePages_Total: 550
 
HugePages_Total: 550
164行目: 176行目:
 
}}
 
}}
   
Now that everything seems to work you can enable hugepages by default if you like. Add to your {{ic|/etc/sysctl.d/40-hugepage.conf}}:
+
問題がないようでしたらデフォルトでヒュージページを有効にすることができます。以下を {{ic|/etc/sysctl.d/40-hugepage.conf}} に追加してください:
  +
vm.nr_hugepages = 550
 
  +
{{hc|/etc/sysctl.d/40-hugepage.conf|2=
  +
vm.nr_hugepages = 550
  +
}}
   
 
参照:
 
参照:
  +
* https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
 
  +
* [https://docs.kernel.org/admin-guide/mm/hugetlbpage.html Linux カーネルの hugetlbpage サポートの概要]
* http://wiki.debian.org/Hugepages
 
  +
* [[debian:Hugepages|Debian Wiki - Hugepages]]
* http://www.linux-kvm.com/content/get-performance-boost-backing-your-kvm-guest-hugetlbfs
 
  +
  +
=== セキュアブート ===
  +
  +
<!-- 翻訳除外: {{Merge|QEMU#Enabling Secure Boot|This is not KVM-specific and would be a great addition to what is already described there.}} -->
  +
  +
KVM において Secure Boot を有効にするには、いくつかの要件を満たす必要があります:
  +
  +
# セキュアブートをサポートする UEFI を使用する必要があります。
  +
# その UEFI にキーが登録されている必要があります。
  +
  +
{{Note|Arch Linux は、Fedora のようなディストリビューションとは異なり、現時点でセキュアブートキーを提供していません。Arch Linux をセキュアブートで起動したい場合は、自分で署名キーを作成し、以下の手順に従った上でカーネルに署名する必要があります。詳しくは [[Unified_Extensible_Firmware_Interface/セキュアブート]] を参照してください。}}
  +
  +
セキュアブート対応の UEFI を有効にするには、{{Pkg|edk2-ovmf}} をインストールし、仮想マシンにセキュアブート対応の UEFI を使用させます。[[libvirt]] を使用している場合、仮想マシンの XML 設定に以下を追加します:
  +
  +
{{bc|1=
  +
<os firmware="efi">
  +
<loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
  +
</os>
  +
}}
  +
  +
次に、いくつかのキーを登録する必要があります。この例では、Microsoft および Red Hat のセキュアブートキーを登録します。{{Pkg|virt-firmware}} をインストールし、以下のコマンドを実行します。{{ic|''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 ファイルを指定します。
  +
  +
{{bc|1=
  +
<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 ブートロゴが表示されたときに {{ic|F2}} を押して仮想マシンの BIOS に入り、セキュアブートが有効になっているか確認できます。
   
 
== 参照 ==
 
== 参照 ==
  +
 
* [http://www.linux-kvm.org/page/HOWTO KVM Howto]
 
* [http://www.linux-kvm.org/page/HOWTO KVM Howto]
 
* [http://www.linux-kvm.org/page/FAQ#General_KVM_information KVM FAQ]
 
* [http://www.linux-kvm.org/page/FAQ#General_KVM_information KVM FAQ]
  +
  +
{{TranslationStatus|QEMU|2025-07-26|832342}}

2025年7月26日 (土) 23:33時点における最新版

関連記事

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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。