「KVM」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(ハイパーバイザーからハイパーバイザに変更)
(行頭の空白の抜けを修正)
 
(3人の利用者による、間の4版が非表示)
1行目: 1行目:
 
[[Category:ハイパーバイザ]]
 
[[Category:ハイパーバイザ]]
 
[[Category:カーネル]]
 
[[Category:カーネル]]
  +
[[es:KVM]]
 
[[en:KVM]]
 
[[en:KVM]]
[[it:KVM]]
+
[[ru:KVM]]
 
[[zh-hans:KVM]]
 
[[zh-hans:KVM]]
[[zh-hant: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]] 似ていますがもっとシンプルに動作ます。エミュレーションを使うネイティブの [[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]], [[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 サポートの確認 ==
25行目: 22行目:
   
 
KVM を使うには仮想マシンのホストのプロセッサが仮想化をサポートしている必要があります (Intel のプロセッサでは VT-x、AMD のプロセッサでは AMD-V という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:
 
KVM を使うには仮想マシンのホストのプロセッサが仮想化をサポートしている必要があります (Intel のプロセッサでは VT-x、AMD のプロセッサでは AMD-V という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:
$ lscpu
 
   
  +
$ LC_ALL=C.UTF-8 lscpu | grep Virtualization
プロセッサが仮想化をサポートしていれば、それを示す行があるはずです。
 
   
 
次を実行することでも確認できます:
 
次を実行することでも確認できます:
$ egrep --color=auto 'vmx|svm|0xc0f' /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つに分けることができます: ホストのデバイスとゲストのドライバーです。
 
   
=== VIRTIO モジュール ===
 
Virtio はネットワークやディスクデバイスドライバーの仮想化規格です。これによってゲストはネットワークやディスク操作の高いパフォーマンスを得ることが可能になり、準仮想化で役に立ちます。次のコマンドで必要なモジュールが使用可能か確認します:
 
 
$ zgrep VIRTIO /proc/config.gz
 
$ zgrep VIRTIO /proc/config.gz
   
=== カーネルモジュールのロード ===
+
続いて、以下のコマンドでカーネルモジュールが自動的に読み込まれているか確認します:
   
まず、カーネルモジュールが自動でロードされているか確認してください。最新の [[udev]] ではそうなっているはずです。
 
$ lsmod | grep kvm
 
 
$ lsmod | grep virtio
 
$ lsmod | grep virtio
   
上記のコマンドが何もメッセージを返さない場合、カーネルモジュールを[[カーネルモジュール#ロード|ロード]]する必要があります。
+
上記のコマンドが何も出力しない場合[[カーネルモジュール#手動でモジュールを扱う|カーネルモジュールを手動で読み込む]] 必要があります。
{{Tip|{{Ic|kvm_intel}} や {{Ic|kvm_amd}} の modprobe が失敗して {{Ic|kvm}} の modprobe が成功する場合 (そして {{ic|lscpu}} でハードウェアアクセラレーションがサポートされていると表示される場合)、BIOS の設定を確認してください。メーカーによっては (特にノートパソコンメーカー)、プロセッサの拡張をデフォルトで無効にしていることがあります。BIOS で無効化されている拡張があるかどうかは、modprobe に失敗した後に {{Ic|dmesg}} の出力を見ることで確認できます。}}
 
   
 
=== 準仮想化デバイスの一覧 ===
 
=== 準仮想化デバイスの一覧 ===
70行目: 85行目:
   
 
== KVM の使い方 ==
 
== KVM の使い方 ==
  +
 
次の記事を参照してください: [[QEMU]]。
 
次の記事を参照してください: [[QEMU]]。
   
 
== ヒントとテクニック ==
 
== ヒントとテクニック ==
   
{{Note|一般的な小技やヒントは [[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/kvm_intel.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 フラグが存在するか確認:
 
$ egrep --color=auto '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#他のポートのフォワーディング]]を参照してください。
 
   
  +
<!-- 翻訳除外: {{Merge|QEMU|qemu-kvm no longer exists. After the above issue is cleared, I suggest merging this section into [[QEMU]].}} -->
デフォルトのユーザーネットワークスタックを使用する場合、ホストには 10.0.2.2 アドレスでアクセスできます。
 
   
  +
ヒュージページを有効にすることで仮想マシンのパフォーマンスを向上させることができます。
全てが動作しホストに SSH できるようになったら、{{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}} に以下を追加:
上記の例では VM の SSH サーバーのトンネルを作成してホストの任意のポートを VM に引き入れています。
 
   
  +
{{hc|/etc/fstab|2=
VM における基礎的なネットワークですが、堅牢であり大抵の場合はこれで上手く行きます。
 
  +
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
 
   
もちろん gid は {{ic|kvm}} グループに一致している必要があります。{{ic|1770}} ではグループの誰でもファイルを作成することができますが、他人のファイルを消去することはできません。{{ic|/dev/hugepages}} が正しくマウントされていることを確認してください:
 
 
{{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)
 
}}
 
}}
   
 
それから必要なヒュージページの数を計算します。ヒュージページの大きさを確認するには:
 
それから必要なヒュージページの数を計算します。ヒュージページの大きさを確認するには:
  +
 
$ grep Hugepagesize /proc/meminfo
 
$ grep Hugepagesize /proc/meminfo
   
通常は 2048 kB ≙ 2 MB です。仮想マシンを 1024 MB で動作させたい場合、1024 / 2 = 512 となり少し追加して550まで丸めることができます。必要とするヒュージページをマシンに設定:
+
通常は 2048 kB ≙ 2 MB です。仮想マシンを 1024 MB で動作させたい場合、1024 / 2 = 512 となり少し追加して 550 まで丸めることができます。必要とするヒュージページをマシンに設定:
  +
# 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):
+
数字がさらに小さい場合、アプリケーションを閉じるか少ないメモリで仮想マシンを開始してください (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> [...]
   
157行目: 168行目:
   
 
仮想マシンの実行中に、使われているヒュージページを確認するには:
 
仮想マシンの実行中に、使われているヒュージページを確認するには:
  +
 
{{hc|$ grep HugePages /proc/meminfo |
 
{{hc|$ grep HugePages /proc/meminfo |
 
HugePages_Total: 550
 
HugePages_Total: 550
165行目: 177行目:
   
 
問題がないようでしたらデフォルトでヒュージページを有効にすることができます。以下を {{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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。