仮想化を実現するソフトウェア|KVM
【連載コラム:仮想化技術をしっかり解説します(5)】
Linuxカーネルの機能を使った仮想マシンソフトウェア「KVM」を解説
前回は、ホスト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)」の企画運営も。
バックナンバー
第10回:クラウド利用の留意点
第9回:オンプレミスのクラウド環境
第8回:たくさんあるぞ!クラウドサービス
第7回:クラウド〜仮想化技術の活用系〜
第3回:第3のサーバー環境「コンテナ」
第2回:仮想化の種類と特徴