# KVM (日本語)

関連記事

- QEMU
- Libvirt
- VirtualBox
- Xen
- VMware

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 という名前が付けられています)。あなたの使っているプロセッサがハードウェア仮想化をサポートしているかは次のコマンドで確認できます:

    $ lscpu

プロセッサが仮想化をサポートしていれば、それを示す行があるはずです。

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

    $ grep -E "(vmx|svm|0xc0f)" --color=always /proc/cpuinfo

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

Note: BIOS の方で仮想化サポートを有効にする必要があるときもあります。

### カーネルのサポート

Note: Arch Linux のカーネルは KVM と VIRTIO をサポートする適切なカーネルモジュールを提供しています。

#### KVM モジュール

あなたの使っているカーネルで必要なカーネルモジュール (`kvm` と、`kvm_amd` か `kvm_intel` のどちらか) が使えるようになっているかは次のコマンドで確認できます (カーネルが `CONFIG_IKCONFIG_PROC` を有効にしてビルドされたことが前提です):

    $ zgrep CONFIG_KVM /proc/config.gz

モジュールが `y` か `m` に設定されていない場合、そのモジュールは利用できないことを意味します。

#### VIRTIO モジュール

Virtio はネットワークやディスクデバイスドライバーの仮想化規格です。これによってゲストはネットワークやディスク操作の高いパフォーマンスを得ることが可能になり、準仮想化で役に立ちます。次のコマンドで必要なモジュールが使用可能か確認します:

    $ zgrep CONFIG_VIRTIO /proc/config.gz

### カーネルモジュールのロード

まず、カーネルモジュールが自動でロードされているか確認してください。最新の udev ではそうなっているはずです。

    $ lsmod | grep kvm
    $ lsmod | grep virtio

上記のコマンドが何もメッセージを返さない場合、カーネルモジュールをロードする必要があります。

Tip: If modprobing `kvm_intel` or `kvm_amd` fails but modprobing `kvm` succeeds, (and `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 `dmesg` after having failed to modprobe will tell.

## KVM の使い方

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

## Tips and tricks

Note: See QEMU#Tips and tricks and QEMU#Troubleshooting for general tips and tricks.

### Nested virtualization

On host, enable nested feature for `kvm_intel`:

    # modprobe -r kvm_intel
    # modprobe kvm_intel nested=1

To make it permanent (see Kernel modules#Setting module options):

    /etc/modprobe.d/modprobe.conf

    options kvm_intel nested=1

Verify that feature is activated:

    $ systool -m kvm_intel -v | grep nested

        nested              = "Y"

Run guest VM with following command:

    $ qemu-system-x86_64 -enable-kvm -cpu host

Boot VM and check if vmx flag is present:

    $ grep -E "(vmx|svm)" /proc/cpuinfo

### Poor Man's Networking

Setting up bridged networking can be a bit of a hassle sometimes. If the sole purpose of the VM is experimentation, one strategy to connect the host and the guests is to use SSH tunneling.

The basic steps are as follows:

- Setup an SSH server in the host OS
- (optional) Create a designated user used for the tunneling (e.g. tunneluser)
- Install SSH in the VM
- Setup authentication

See: SSH for the setup of SSH, especially SSH#Forwarding_Other_Ports.

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 `/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

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.

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.

### Enabling huge pages

You may also want to enable hugepages to improve the performance of your virtual machine. With an up to date Arch Linux and a running KVM you probably already have everything you need. Check if you have the directory `/dev/hugepages`. If not, create it. Now we need the right permissions to use this directory.

Add to your `/etc/fstab`:

    hugetlbfs       /dev/hugepages  hugetlbfs       mode=1770,gid=78        0 0

Of course the gid must match that of the `kvm` group. The mode of `1770` allows anyone in the group to create files but not unlink or rename each other's files. Make sure `/dev/hugepages` is mounted properly:

    # umount /dev/hugepages
    # mount /dev/hugepages
    $ mount | grep huge

    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

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

If you had enough free memory you should see:

    $ grep HugePages_Total /proc/meminfo

    HugesPages_Total:  550

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> [...]

Note the `-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:

    $ grep HugePages /proc/meminfo

    HugePages_Total:     550
    HugePages_Free:       48
    HugePages_Rsvd:        6
    HugePages_Surp:        0

Now that everything seems to work you can enable hugepages by default if you like. Add to your `/etc/sysctl.d/40-hugepage.conf`:

    vm.nr_hugepages = 550

See also:

- https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
- http://wiki.debian.org/Hugepages
- http://www.linux-kvm.com/content/get-performance-boost-backing-your-kvm-guest-hugetlbfs

## 参照

- KVM Howto
- KVM FAQ

Categories:

- Virtualization (日本語)
- Kernel (日本語)