「KVM」の版間の差分
(同期) |
|||
| 1行目: | 1行目: | ||
[[Category:ハイパーバイザ]] |
[[Category:ハイパーバイザ]] |
||
[[Category:カーネル]] |
[[Category:カーネル]] |
||
| + | [[es:KVM]] |
||
[[en:KVM]] |
[[en:KVM]] |
||
| − | [[ |
+ | [[ru:KVM]] |
[[zh-hans:KVM]] |
[[zh-hans:KVM]] |
||
| − | [[zh-hant:KVM]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
| − | {{Related| |
+ | {{Related|:Category:ハイパーバイザ}} |
{{Related|Libvirt}} |
{{Related|Libvirt}} |
||
| − | {{Related|VirtualBox}} |
||
| − | {{Related|Xen}} |
||
| − | {{Related|VMware}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
| − | '''KVM''' |
+ | '''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 などのオペレーティングシステムが動作する仮想マシンを複数動かすことができます (詳しくは [ |
+ | KVM を使用することで、修正を加えずに GNU/Linux や Windows などのオペレーティングシステムが動作する仮想マシンを複数動かすことができます (詳しくは [https://www.linux-kvm.org/page/Guest_Support_Status Guest Support Status] を参照してください)。それぞれの仮想マシンには専用の仮想化されたハードウェアが使われます: ネットワークカード、ディスク、グラフィックカードなど。 |
| − | KVM と [[Xen]], [[VMware]], QEMU の違いについては [ |
+ | 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 という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます: |
||
| − | $ LC_ALL=C lscpu | grep Virtualization |
||
| + | $ LC_ALL=C.UTF-8 lscpu | grep Virtualization |
||
| − | プロセッサが仮想化をサポートしていれば、それを示す行があるはずです。 |
||
次を実行することでも確認できます: |
次を実行することでも確認できます: |
||
| + | |||
$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo |
$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo |
||
| − | + | いずれのコマンドを実行しても何も表示されない場合、あなたのプロセッサはハードウェア仮想化をサポート'''していない'''ため、KVM を使用することは'''できません'''。 |
|
| − | {{Note|BIOS の方で仮想化サポートを有効にする必要があるときもあります。}} |
+ | {{Note|BIOS の方で仮想化サポートを有効にする必要があるときもあります。過去 10 年以内に製造された AMD および Intel のすべての x86_64 プロセッサは仮想化をサポートしています。プロセッサが仮想化をサポートしていないように見える場合、ほぼ確実に BIOS で無効になっているだけです。}} |
=== カーネルのサポート === |
=== カーネルのサポート === |
||
| − | Arch Linux のカーネルは KVM と VIRTIO をサポートする適切な[[カーネルモジュール]]を提供しています。 |
||
| + | Arch Linux のカーネルは KVM をサポートするために必要な [[カーネルモジュール]] を提供しています。 |
||
| − | ==== KVM モジュール ==== |
||
| + | |||
| − | あなたの使っているカーネルで必要なカーネルモジュール ({{ic|kvm}} と、{{ic|kvm_amd}} か {{ic|kvm_intel}} のどちらか) が使えるようになっているかは次のコマンドで確認できます (カーネルが {{ic|CONFIG_IKCONFIG_PROC}} を有効にしてビルドされたことが前提です): |
||
| + | * 必要なモジュール ({{ic|kvm}} と、{{ic|kvm_amd}} または {{ic|kvm_intel}} のいずれか) がカーネルに含まれているかどうかは、次のコマンドで確認できます: |
||
| − | $ zgrep CONFIG_KVM /proc/config.gz |
||
| + | |||
| − | モジュールが {{ic|y}} か {{ic|m}} に設定されていない場合、そのモジュールは利用'''できない'''ことを意味します。 |
||
| + | $ 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 つの構成要素を持ちます: ホストのデバイスとゲストのドライバーです。 |
||
| + | === カーネルの対応状況 === |
||
| − | ==準仮想化デバイス== |
||
| − | ゲストがホストマシンのデバイスを使えるように、準仮想化は高速で効率的な通信手段を提供します。KVM はハイパーバイザとゲスト間のレイヤーとして Virtio API を使って仮想マシンに準仮想化デバイスを提供します。 |
||
| + | 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}} の出力を見ることで確認できます。}} |
||
=== 準仮想化デバイスの一覧 === |
=== 準仮想化デバイスの一覧 === |
||
| 71行目: | 85行目: | ||
== KVM の使い方 == |
== KVM の使い方 == |
||
| + | |||
次の記事を参照してください: [[QEMU]]。 |
次の記事を参照してください: [[QEMU]]。 |
||
== ヒントとテクニック == |
== ヒントとテクニック == |
||
| − | {{Note|一般的な小技やヒントは [[QEMU#ヒントとテクニック]] や [[QEMU |
+ | {{Note|一般的な小技やヒントは [[QEMU#ヒントとテクニック]] や [[QEMU/トラブルシューティング]]を参照してください。}} |
| − | === |
+ | === ネストされた仮想化 === |
| − | + | ネストされた仮想化を使うことで、元の仮想マシンやネットワークに修正を加えることなく、既存の仮想マシンを別のハイパーバイザや他のクラウド上で動作させることができるようになります。 |
|
ホスト側で、{{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> |
||
| + | {{hc|$ cat /sys/module/kvm_intel/parameters/nested|2= |
||
| − | nested = "Y" |
||
| + | Y |
||
| − | </nowiki>}} |
||
| + | }} |
||
全ての CPU の機能をゲスト環境に転送するために"ホストパススルー"モードを有効化: |
全ての CPU の機能をゲスト環境に転送するために"ホストパススルー"モードを有効化: |
||
| − | + | # [[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 を起動したら vmx フラグが存在するか確認: |
||
$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo |
$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo |
||
| + | === ヒュージページの有効化 === |
||
| − | === 手軽なネットワーク === |
||
| + | <!-- 翻訳除外: {{Merge|QEMU|qemu-kvm no longer exists. After the above issue is cleared, I suggest merging this section into [[QEMU]].}} --> |
||
| − | ブリッジネットワークの設定は少し厄介です。実験目的で VM を使いたいのであれば、SSH トンネリングを使ってホストとゲストを接続するという方法があります。 |
||
| + | ヒュージページを有効にすることで仮想マシンのパフォーマンスを向上させることができます。 |
||
| − | 基本的な手順は以下の通りです: |
||
| + | 最新の Arch Linux と KVM ならおそらく必要条件はすべて満たされているはずです。{{ic|/dev/hugepages}} ディレクトリが存在しているかどうかチェックしてください。ディレクトリが存在しなかったら、作成してください。 |
||
| − | * ホスト OS で SSH サーバーをセットアップ |
||
| + | このディレクトリを利用するには適切なパーミッションが必要です。デフォルトでは root の UID および GID で 0755 ですが、ここでは kvm グループのメンバーであればヒュージページにアクセスできるようにします。 |
||
| − | * (任意) トンネリング用のユーザーを作成 (例: tunneluser) |
||
| − | * VM に SSH をインストール |
||
| − | * セットアップ認証 |
||
| + | {{ic|/etc/fstab}} に以下を追加: |
||
| − | SSH のセットアップについては [[SSH]] の記事、特に [[SSH#他のポートのフォワーディング]]を参照してください。 |
||
| + | {{hc|/etc/fstab|2= |
||
| − | デフォルトのユーザーネットワークスタックを使用する場合、ホストには 10.0.2.2 アドレスでアクセスできます。 |
||
| + | hugetlbfs /dev/hugepages hugetlbfs mode=01770,gid=kvm 0 0 |
||
| − | |||
| + | }} |
||
| − | 全てが動作しホストに SSH できるようになったら、{{ic|/etc/rc.local}} に以下を追加してください: |
||
| − | # Local SSH Server |
||
| − | 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 |
||
| − | |||
| − | 上記の例では VM の SSH サーバーのトンネルを作成してホストの任意のポートを VM に引き入れています。 |
||
| − | |||
| − | VM における基礎的なネットワークですが、堅牢であり大抵の場合はこれで上手く行きます。 |
||
| − | |||
| − | === ヒュージページの有効化 === |
||
| + | {{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 |
+ | $ mount {{!}} grep huge|2= |
| − | + | 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): |
| + | |||
$ 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> [...] |
||
| 161行目: | 168行目: | ||
仮想マシンの実行中に、使われているヒュージページを確認するには: |
仮想マシンの実行中に、使われているヒュージページを確認するには: |
||
| + | |||
{{hc|$ grep HugePages /proc/meminfo | |
{{hc|$ grep HugePages /proc/meminfo | |
||
HugePages_Total: 550 |
HugePages_Total: 550 |
||
| 169行目: | 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 Linux カーネルの hugetlbpage サポートの概要] |
||
| + | * [https://docs.kernel.org/admin-guide/mm/hugetlbpage.html Linux カーネルの hugetlbpage サポートの概要] |
||
| − | * https://wiki.debian.org/Hugepages |
||
| + | * [[debian:Hugepages|Debian Wiki - Hugepages]] |
||
| + | |||
| + | === セキュアブート === |
||
| + | |||
| + | <!-- 翻訳除外: {{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:20時点における版
関連記事
KVM、Kernel-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 を使用することはできません。
カーネルのサポート
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
このコマンドが何も出力しない場合、モジュールを手動で読み込む必要があります。詳細は カーネルモジュール#手動でモジュールを扱う を参照してください。
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。
ヒントとテクニック
ネストされた仮想化
ネストされた仮想化を使うことで、元の仮想マシンやネットワークに修正を加えることなく、既存の仮想マシンを別のハイパーバイザや他のクラウド上で動作させることができるようになります。
ホスト側で、kvm_intel の nested 機能を有効にしてください:
# 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 の機能をゲスト環境に転送するために"ホストパススルー"モードを有効化:
- QEMU を使用する場合、次のコマンドでゲスト VM を実行してください:
qemu-system-x86_64 -enable-kvm -cpu host。 - virt-manager を使用する場合、CPU モデルを
host-passthroughに変更してください。 - 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 を有効にするには、いくつかの要件を満たす必要があります:
- セキュアブートをサポートする UEFI を使用する必要があります。
- その UEFI にキーが登録されている必要があります。
セキュアブート対応の 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 に入り、セキュアブートが有効になっているか確認できます。