仮想化を実現するソフトウェア|KVM

【連載コラム5回目】
Linuxカーネルの機能を使った仮想マシンソフトウェア「KVM」を解説

最終更新日:2022年03月04日
このエントリーをはてなブックマークに追加

前回は、ホストOS型の仮想マシンソフトウェアであるVirtualBoxについて解説しました。今回はLinuxカーネルの機能を使った仮想マシンソフトウェアであるKVMについて解説します。


KVMはLinuxカーネルの持つ仮想マシン機能

KVMは「Kernel VM」の略からも分かる通り、Linuxカーネルの持つ仮想マシン機能です。特徴としては、CPUの持つ仮想化支援機能(Intel VTやAMD-V)を活用しており、また仮想マシンとしての機能を実現する部分をQEMUというソフトウェアを利用することで、KVMとしての実装の量はかなり少ない、ということです。そのため、非常に簡単に動作環境を用意することができます。

KVMを動かすにはCPUの仮想化支援機能が必要

上記の通り、KVMは仮想化を行うための実装を極力少なくするため、CPUが備えている仮想化支援機能が必要となります。ただ、現在のCPUでは標準化的に備えているのでCPU選びにはあまり困らないのですが、一部BIOSなどの機能で仮想化支援機能が使えないようにされている場合があります。

使用できるかどうかは、/proc/cpuinfoを参照して、flagにvmx(Intelの場合)、あるいはsvm(AMDの場合)が含まれていることを確認してください。

例)CPUがIntelの場合

$ cat /proc/cpuinfo | grep vmx
flags		: fpu (中略) vmx (以下略)

KVMの導入

KVMはLinuxカーネルの機能なので、多くのディストリビューションではカーネルモジュールとQEMUその他周辺のツールなどをパッケージとして用意しています。導入については各ディストリビューションのドキュメントなどを見てください。

例として、以下はUbuntuにKVMをインストールする場合のaptコマンドです。

$ sudo apt install qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager

libvirtは仮想マシンを操作するAPIを提供します。bridge-utilsはネットワーク周りをサポートするユーティリティです。virt-managerは仮想マシン管理用ツールです。

GUI管理ツールはVirtManager

KVMの動作環境が整ったら、仮想マシンを作成したり、動作させることができます。コマンドラインで行うこともできますが、ディストリビューションのインストール操作などが必要となるので、GUI管理ツールのVirtManagerを使います。GUIなので、Linux環境もGUIで動作している必要があります。ターミナルからvirt-managerを呼び出します。

仮想マシンの作成は対話形式で行えます。VirtualBoxなどで仮想マシン作成に慣れていれば、基本的な設定すべき項目は一緒ですので、使い方の説明などは特に無くても問題なく使うことができるでしょう。

仮想マシンを作成している様子
仮想マシンが動作している様子

KVMのネットワーク設定は少しネットワーク管理の知識が必要

仮想マシンを作成すると、ネットワークはデフォルトでNATに設定されています。すなわち、KVMホスト側のネットワークインターフェースと、仮想マシン側のネットワークインターフェースとの間で、ネットワークアドレス変換を行うことが外部と通信が行えます。

KVMホストのネットワークインターフェースを見てみる

KVMのNAT接続は自動的に設定されているので、その様子を見てみましょう。KVMホストで仮想マシンを動作させている状態でインターフェースを参照します。表示される情報が多いので、以下の例では必要なところ以外は省略しています。

$ ip a
(1から3は省略)
4: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master virbr0 state UNKNOWN group default qlen 1000

virbr0、virbr0-nic、vnet0の3つのネットワークインターフェースが確認できます。これらがどのように関係しているかを確認するには、brctlコマンドを使います。

$ brctl show
bridge name	bridge id		STP enabled	interfaces
virbr0		8000.525400bfb525	yes		virbr0-nic
							vnet0

virbr0はブリッジ、vnet0は仮想マシンのインターフェースです。これらが接続していることで、仮想マシンはNATで外部に出られるようになっています。
virbr0-nicは、Linuxのネットワーク仕様で問題が出るのを回避するために存在しており機能していないので、気にしないでも構いません。

KVMのブリッジ接続はちょっと難しい

KVMのネットワーク接続はデフォルトではNATですが、設定を変更することでブリッジ接続を行うこともできます。ただし、設定にはコマンドラインでの設定や設定ファイルの書き換え等が必要となるため、ここでは説明は割愛します。

サーバーとして動作させて学習環境として使うには、とりあえず前回紹介したVirtualBoxの方が手っ取り早いでしょう。ある程度スキルが身についたら、KVMのブリッジ接続にチャレンジしてみてください。

KVMは仮想化技術を深く理解する最適な教材

このように、KVMはLinuxカーネルの機能として提供されており、様々なディストリビューションで使うことができます。ただし、使い勝手は必ずしもフレンドリーというわけではありませんので、初学者にはあまり向いていない仮想化ソフトウェアという印象を受けます。そういう点で、KVMは仮想化技術について深く理解したり、Linux操作設定のスキルを試してみるのに適した教材を言えるでしょう。そういう観点で見ると、なかなか歯ごたえのあるソフトウェアです。是非挑戦してみてください。

筆者紹介
宮原 徹 氏

宮原 徹 氏

株式会社びぎねっと

Linux標準教科書、Linuxサーバー構築標準教科書などの監修者。LinuCレベル1/レベル2 Version10.0の改訂作業にも協力。また、幅広いOSSに関する情報提供の場として「オープンソースカンファレンス(OSC)」の企画運営も。

このエントリーをはてなブックマークに追加
ページトップへ