仮想マシンの仕組みとKVM
2つの仮想化方式の概要と、KVMの導入の仕方と設定について紹介します。(LinuCレベル2 主題:2.05.1)
仮想化の概要と二つの方式(ホスト型とハイパーバイザー型)
仮想化とは、コンピューターやその他種々の物理的なリソースを抽象化し、ソフトウェア化する技術のことです。コンピューターの場合、単一のハードウェア上で、複数の、ソフトウェア化されたコンピューターを動作させます。この、ソフトウェア化されたコンピューターのことを「仮想マシン(Virtual Machine)」と呼びます。
コンピューターに対して仮想化技術を使用すると、一つのハードウェア上で複数の異なるオペレーティングシステム(以下、OS)を動作させ、物理サーバー台数の節約をしたり、用途ごとのサーバーを高速に構築して提供したり、柔軟に構成を変更してスケールアップやスケールアウトに対応できるなどの利点があります。また、近年普及が拡大しているパブリッククラウドを実現する基盤技術としても使用されています。
コンピューターに対する仮想化方式は、ホスト型とハイパーバイザー型があります。
*ホスト型
ハードウェアにインストールしたOS(「ホストOS」と呼びます)上に仮想化ソフトウェアをインストールし、その上で(複数の)仮想マシンをインストールして動作させる方式です。ホスト型の仮想化ツールでは、VirtualBoxやVMware Playerなどがよく知られています。
*ハイパーバイザー型
コンピューター上にハイパーバイザーと呼ばれる仮想化管理ツールを介して、直接OSをインストールして動作させる方式です。直接ハードディスク上にインストールするため、ホスト型に比べて高速に動作する、ホストOSの制約のためにゲストOSを調整する負担がない、などが利点です。ハイパーバイザー型の仮想化ツールとしてはVMware ESXiやHyper-V, KVMなどがよく知られています。
KVM
KVMは、Kernel-based Virtual Machineの略で、Linuxカーネルの拡張モジュールとして動作します。
CPUごとにモジュールが開発されていて
- kvm-intel(Intel社製CPU用)
- kvm-amd(AMD社製CPU用)
の二種類のカーネルモジュールが提供されています。
CPUが仮想化支援機能に対応しているかどうかは、/proc/cpuinfoやlscpuコマンドで確認します。
$ ls /proc/cpuinfo
そして、
Intel製CPUの場合には「vmx」
AMD製CPUの場合には「svm」
があることを確認します。
もし含まれていない場合は仮想化ツールを実行することができません。Intel製ならCore i3以降のCPUなら仮想化機能(VT-x)に対応しています。ただし、出荷時の設定で無効化されている場合があります。その場合は、電源投入直後にBIOSやUEFIの設定メニューを起動して、仮想化機能を有効化(Enable)にする必要があります。
KVMモジュールはLinuxカーネル上で動作するため、上記の分類のハイパーバイザー型のように動作します。そのため、ゲストOS側でホストOSの制限を受けにくく、Linuxの拡張機能などを使えます。
*完全仮想化と準仮想化
仮想化を実行する上では、以下の二つの仮想化方式があります。
- BIOSレベルからハードウェア全体を仮想化し、ディスクI/Oなどをすべてエミュレートして、OSに手を入れないで仮想マシンを構成する「完全仮想化」
- ゲストOSにハイパーバイザーとの連携の仕組みを取り入れる「準仮想化」
準仮想化は完全仮想化よりも高パフォーマンスを期待できますが、ハイパーバイザーへの依存性が高まるため、ハイパーバイザー間の移植性は低くなります。
KVMではvirtioという準仮想化ドライバパッケージを用いることで、より高速なディスクI/Oや高スループット、CPU処理のオーバヘッドの減少を実現します。
KVMを高速動作させるためのQEMU
QEMUは、ゲストOSからの入出力I/O(ディスク、ネットワーク)を仮想化する機能を提供するエミュレータです。KVMがメモリや仮想CPUを、QEMUがディスクやネットワークインターフェースなどの仮想ハードウェアを提供します。処理をそれぞれ分担することでパフォーマンスの向上を図っています。
KVMの導入と設定
KVMの導入・仮想マシンの追加は以下のようなステップで行います。
- ホストOSにKVM(カーネルモジュール)やQEMUをインストールする
- ブリッジインターフェースを設定する
- 仮想マシンを追加する
それでは順に実行していきましょう。ここではCentOS 7を使います。
1)必要なパッケージのインストール
以下のパッケージをyumコマンドでインストールします。
- yumのモジュール機能を使用して仮想環境パッケージ(virt)
- 仮想マシンのOSインストールツール(virt-install)
- ブラウザーインターフェースから仮想マシン(VM)を管理するツール(cockpit, cockpit-machines)
# yum -y module install virt
# yum -y install virt-install cockpit cockpit-machines
2)仮想化サポート機能の確認
# virt-host-validate
を実行して仮想化サポート機能の確認を行いましょう。
3)仮想化をサポートするlibvirtdサービスの自動起動を有効化・起動
# systemctl enable --now libvirtd
続いてはブラウザーインターフェースを提供するcockpitソケットの自動起動を有効化し、起動しましょう。
# systemctl enable --now cockpit.socket
4)インストール用ISOイメージの用意
インストールしたいOSのイメージをダウンロードしておきます。今回の例では、Ubuntu18.04LTSを使用します。
5)仮想マシンを追加する準備(ネットワークの設定)
KVMをインストールすると、デフォルトではvirbr0(仮想のブリッジインターフェース)と仮想ネットワーク(default) が設定されています。defaultは、ルーターとして機能し、DHCPサーバー機能を提供します。それぞれ設定を確認しておきましょう。
まずはインターフェースの確認をしてみましょう。
$ nmcli con | grep bridge
virbr0 dfeb02ec-554a-473e-b416-71334d164cbd bridge virbr0
次に仮想ネットワークの確認を行いましょう。
$ virsh net-list
名前 状態 自動起動 永続
----------------------------------------------------------
default 動作中 はい (yes) はい (yes)
6)ブリッジインターフェースを追加
上記のNAT接続ですと外部への接続はできますが、外部からの(インバウンド)接続ができません。そこでブリッジインターフェースを追加して、外部から接続できるようにしましょう。KVMには下記のNetwork Managerを使用する以外に、ブリッジ設定を行うブリッジユーティリティー(bridge-utils)も用意されています。
$ nmcli con add type bridge con-name br0 ifname br0
$ nmcli con mod br0 bridge.stp no
$ nmcli con mod br0 ipv4.method manual ipv4.addresses “192.168.1.5/24” ipv4.gateway “192.168.1.1” ipv4.dns 192.168.1.1 (アドレスは各自のLANに合わせる)
追加したら、もう一度インターフェースを確認してみましょう。
$ nmcli con | grep bridge
br0 bde3f90a-58ba-4d69-8992-5ba493f5d604 bridge br0
virbr0 dfeb02ec-554a-473e-b416-71334d164cbd bridge virbr0
次にbr0の接続先として、イーサネットインターフェース(enp0s3など、マシン上で確認しましょう)を追加します。
$ nmcli con add type bridge-slave ifname enp0s3 master br0
ブリッジインターフェースを有効化します。
$ nmcli con up br0
接続が正常にアクティベートされました (master waiting for slaves) (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/7)
ブリッジ接続を確認したら、enp0s3の接続設定を削除しましょう。
$ nmcli con del enp0s3
執筆者紹介
・太田 俊哉
・井上 博樹
このドキュメントは、LinuCレベル2の学習用の教材から抜粋して作成されたものです。教材全体は以下のPDFファイルをご覧ください。
LinuCレベル2学習教材