仮想マシン
 Computer >> コンピューター >  >> ソフトウェア >> 仮想マシン

KVM仮想化入門 ― 徹底解説ガイド

当サイトの仮想化カテゴリーを読んでくださっている方なら、これまでの記事が主にVMwareとVirtualBoxを中心に据え、クラウド関連やイメージのリマスタリングも少し取り上げてきたことをご存じでしょう。しかし、そろそろ新しい分野へ足を踏み入れます。今回から、KVMをテーマにした全く新しいチュートリアルシリーズが正式に始動します。今後はXenなど、ほかにもユニークな仮想化技術を扱う予定ですが、まずはKVMに焦点を絞って解説していきます。

本ガイドでは、Red Hatが開発したKVM(Kernel-based Virtual Machine)について学びます。KVMは、各種商用ソリューションの代替となる無料のオープンソース仮想化技術です。ダウンロード・インストール・セットアップの手順から、仮想マシンの管理に使えるツール群、コマンドラインでの操作方法やスクリプトによる自動化まで、段階的に習得できます。さらに、高度なネットワーク構成やストレージ設定といった発展的なトピックも後半で紹介します。それでは始めましょう。

KVM仮想化入門 ― 徹底解説ガイド

KVMの基礎知識 ― 用語解説

まずは、KVMの仕組みをごく簡単におさらいします。難しい話ではなく、基本的な用語を理解してもらうための導入です。ご安心ください、内容はすぐにシンプルに感じられるはずです。

KVMは、最新のIntelおよびAMDプロセッサに搭載されているCPU仮想化拡張機能(Intel VT-x/AMD-V)を利用して動作します。メモリ上にロードされたカーネルモジュールがプロセッサの仮想化機能を制御し、修正版QEMUをベースとしたユーザーモードのドライバがハードウェア層をエミュレートすることで、その上に仮想マシンを作成・実行できるようになっています。

なお、CPUの仮想化拡張機能がなくてもKVMを実行すること自体は可能です。ただしその場合はQEMUによる純粋なソフトウェアエミュレーションモードで動作するため、パフォーマンスが大幅に低下する点に注意してください。

KVMの管理は、VMware製品やVirtualBoxのようなグラフィカルな管理ツールを使う方法と、コマンドラインから複数の手段で行う方法の両方が用意されています。

最も人気のあるGUIは、Red Hatが開発した「Virtual Machine Manager(VMM)」です。汎用的なパッケージ名ではvirt-managerとして知られています。付属ツールとして、仮想マシンのプロビジョニングを行うvirt-install、複製を行うvirt-clone、インストールを支援するvirt-image、表示を行うvirt-viewerなどがあり、VMMはXen仮想マシンにも対応しています。

KVMのコマンドラインインターフェースはvirshによって提供されます。仮想マシンの作成にはvirt-installなどの補助ツールを組み合わせて使います。またUbuntuには、Canonicalが開発したubuntu-vm-builderという専用ツールがあり、Ubuntu環境のプロビジョニングに利用できます。

名前が多すぎて混乱しそうですが、焦らず一つずつ覚えていけば問題ありません。さらに言えば、KVMはQEMUに似た独自の構文も持っていますが、これは仮想マシン管理の推奨手段ではないので覚える必要はあまりありません。

より詳しい情報については、以下のページを参照してください。

  • The Kernel Virtual Machine ― Community Ubuntu Documentation
  • howtoforge.comのKVMチュートリアル
  • KVM/Virsh ― Community Ubuntu Documentation

以上が第一歩です。

KVMのメリットとデメリット

果たしてKVMを使うべきでしょうか? それは「何を実現したいか」次第です。

一般のホームユーザー、仮想化愛好家、中級レベルのエンスージアストにとって、KVMは最初のとっかかりが少し難しく感じられるかもしれません。基本的にはコマンドライン主体のツールであり、VMwareやVirtualBoxほど直感的で親しみやすいとは言えません。GUI管理の面では、KVMは競合製品より数年遅れている印象があります。しかし、実際に仮想化を「提供する」能力においては同等以上のパワーを持っています。むしろ、コマンドラインツールとして設計されているからこそ、長期的には生産性が高く、細かい部分まで自由にコントロールできるのです。こうした特性から、KVMはビジネス環境でこそ真価を発揮します。

さらに重要なのは、CPUが仮想化支援機能に対応していない場合です。その場合、KVMは非常に低速で非効率なエミュレーションモードでしか動かないため、時間の無駄になりかねません。また、KVMはVirtualBoxと競合することが知られていますが、これについては別のチュートリアルで詳しく説明します。

まとめると、KVMは仮想化に強い関心を持つ人、おそらく管理者やプロフェッショナル向けのツールです。手軽に遊べる家庭向けのおもちゃではなく、当面そうあり続けるでしょう。しかし、腰を据えて取り組む価値は十分にあります。一度習得すれば、それはほかの技術とも掛け合わせられる強力な武器になります。VMwareやVirtualBoxがGUIツールの使用を前提としているのに対し、KVMはコマンドラインスクリプトによる効率重視の運用に最適化されているのです。

要約すると、以下のような方にはKVMが向いています。

  • 追加ライセンス費用や機能制限のない、無料でモダンな仮想化ソリューションを求めている方
  • 強力なコマンドラインインターフェースを活用したい方
  • 多少手を汚すことに抵抗がない方

逆に、以下のような方には向いていません。

  • CPUが仮想化拡張機能(Intel VT-x/AMD-V)に非対応の方
  • スクリプトを書くのが苦手で、コードに触れたくない方
  • VMware Server、ESXi、VirtualBoxのような、より管理が簡単なソリューションを好む方

それでは、進めていきましょう。

検証環境

KVMは実質的にどのLinuxディストリビューションでも使えます。一般的に、Red Hat系ディストリビューションはKVMとの相性が良い傾向にあります。RHELはOSにKVMが標準で組み込まれており、CentOS、Scientific Linux、FedoraなどのRed Hat系でも利用可能です。

筆者は自宅では主にUbuntuを使っているため、今回は仮想化対応のIntel Core i5プロセッサを搭載した比較的新しいHPノートPC上のUbuntuで検証しました。今年中には、Linux専用のマルチブートマシンに最新版のCentOSまたはScientific Linuxを導入する予定なので、これらのディストリビューション向けの追加チュートリアルも公開していく計画です。そこでXenにも触れる予定です。

本チュートリアルでは、64bit版の長期サポート版Ubuntu LucidへのKVMセットアップ方法を紹介します。続編のガイドでは、ほかの仮想化技術との共存や競合の解決、高度な管理機能、スクリプティングなど、KVMに関わる多くのトピックを取り上げます。

それでは、いよいよ本題に入りましょう。

事前準備

まず必要なのは、仮想化に対応したCPUです。以下のコマンドで確認できます。

egrep -c '(vmx|svm)' /proc/cpuinfo

結果が0以外の数値であれば対応しています。ただし、BIOS側で仮想化機能が有効になっていることも必ず確認してください。BIOSで設定を変更した場合は、変更を反映させるために一度完全に電源を切り、再起動(コールドブート)する必要があります。

準備ができたらOSを起動し、KVMをインストールしましょう。

動作確認には、kvm-okコマンドを使用します。

KVM仮想化入門 ― 徹底解説ガイド

KVMのダウンロードとインストール

KVMをインストールするには、以下のパッケージを取得します(aptコマンドの場合)。

apt-get install qemu-kvm libvirt-bin

加えて、以下のパッケージのインストールを強くおすすめします。

apt-get install bridge-utils virt-manager python-virtinst

補足:パッケージ名はディストリビューションによって異なります。たとえばvirt-installは、python-virt-installやpython-virtinst、あるいは単にvirt-installという名前で提供されることがあります。virt-clone、virt-image、virt-viewerの依存関係は自動的に解決されます。

多くのチュートリアルではブリッジユーティリティが必要だと説明されていますが、実際には必須ではありません。ブリッジユーティリティが必要になるのは、仮想NICを物理NICとブリッジ接続したい場合だけです。筆者のVirtualBoxネットワーキングチュートリアルで詳細な例を紹介しているので参考にしてください。原理は同じです。

また、「無線LANインターフェースはブリッジに対応していない」という記述も多くのチュートリアルで目にします。確かにそのケースもありますが、筆者の検証では無線アダプタのブリッジ接続にすべて成功しています。希望は持って大丈夫です。

VMM(virt-manager)は強くおすすめします。同様に、virt-viewer、virt-install、virt-image、virt-cloneといった補助ツール一式も揃えておきましょう。

最後に、ubuntu-vm-builderを選択肢に入れるのも良いでしょう。

apt-get install ubuntu-vm-builder

多数の依存パッケージが自動的に解決されるため、ダウンロードには時間がかかる場合があります。補足:Red Hat系ではyum install、SUSE系ではzypper installを使用してください。

VirtualBoxとの競合について

ここでも、多くのチュートリアルの常識に反しますが、KVMとVirtualBoxは同じホストに共存させられます。ただし、両方を同時に実行することはできません。つまり、どちらか一方のカーネルモジュールをメモリからアンロードする必要があるということです。慌てる必要はありません。まず試してみて、うまく動かなければそのとき対処すればよいのです。

しかもこの切り替えは稼働中のまま(in-vivo)で行えます。再起動などの劇的な作業は不要です。具体的な手順は別のチュートリアルで紹介します。ちなみに筆者の検証ホストでは、両方がインストールされ、実際に運用されています。

KVMを使ってみる

さあ、ここからが本当の楽しいパートです。まずはGUIツールであるVMMから始めます。ほとんどの人は、そして始めるべきなのはここだからです。実用面では、VMwareコンソールやVirtualBoxと非常によく似た感覚で操作できます。

Virtual Machine Manager(VMM)

それでは、VMMを見ていきましょう。

初回起動時には、未接続状態のカテゴリが2つ表示されます。これはローカルホストのKVMモジュールを指しており、まだ使用されていない状態です。利用するには右クリックして「接続」を選択します。

新しい接続を追加するには、「ファイル > 接続の追加」をクリックします。開いたウィンドウで、ハイパーバイザの種類と接続タイプを指定できます。VMMはQEMU/KVMやXenなど、ローカル接続とリモート接続の両方に対応しており、さまざまな認証方式で接続できます。

自動接続(Autoconnect)を有効にすれば、次回VMMを起動したときに接続が自動的に確立されます。これはVMware Serverの起動時に尋ねられる設定と似ています。ご参考までに。

システム接続とユーザーモード接続の違い

通常の(デフォルトの)接続とUsermodeの違いは何か? と疑問に思うかもしれません。Usermodeでは管理者権限なしで実行できる反面、ネットワーク機能が制限されます。それでは先へ進みましょう。

VMMの機能概要(続き)

仮想マシンを作成する前に、ほかの機能も確認しておきましょう。

ネットワーク機能は「ホストの詳細(Host Details)」で確認・変更できます。KVMのネットワークの扱い方は、別のチュートリアルで詳しく解説します。ブリッジユーティリティの設定方法もそこで紹介するのでご安心ください。

同様に、ストレージ設定も変更できます。こちらも専用のガイドを用意する予定です。

設定の変更

VMMには、外観や挙動をより賢くカスタマイズできるオプションがいくつかあります。システムトレイアイコンの表示、統計情報のポーリング間隔の設定、ディスクおよびネットワークメトリクスのポーリング有効化(デフォルトでは無効)、コンソールのキーボードグラブ、コンソールのスケーリング、音声オプションの設定、マシン操作時の確認ダイアログの表示などを調整できます。

KVM仮想化入門 ― 徹底解説ガイド

KVM仮想化入門 ― 徹底解説ガイド

これらの設定により、後ほど仮想マシンのメトリクスをより詳細に、より細かくコントロールしながら監視できるようになります。たとえば、UbuntuゲストのCPU使用率、ディスクI/O、ネットワークI/Oの表示などが可能です。

こちらがシステムトレイアイコンの様子です。

それでは、いよいよ新しい仮想マシンを作成しましょう。

仮想マシンの作成

仮想マシンはVMMまたはコマンドラインから作成できます。まずはGUIから始めます。最初のステップはとても直感的です。仮想マシンの名前とインストールメディアの場所を入力します。インストールメディアとしては、ISOイメージやCD/DVDなどのローカルストレージ、HTTP・FTPサーバー、NFS領域、PXEが利用できます。

ここではローカルのインストールメディアを使用します。次に、物理デバイスかイメージファイルを選択します。今回はISOイメージを使用します。続いて、OSの種類とバージョンを選択します。厳密に一致させる必要はありませんが、できる限り正確に近づけることで、追加の仮想マシン最適化が適用されます。

RAMとCPU数を割り当てます。

4番目のステップはストレージです。新しいイメージを作成するか、既存のものを使用できます。サイズを指定し、全容量を事前に割り当てることも可能です。事前割り当てはパフォーマンス向上につながり、断片化も抑えられます。

ストレージについては後ほど詳しく掘り下げます。今の時点では、ディスクがすでに用意されているか、あるいはデフォルトのストレージプールに作成すると想定してください。なお、Usermodeで実行している場合、デフォルトのストレージプールの場所である/varには書き込めません。非管理者ユーザーがアクセスできる新しいストレージプールを作成する必要がありますが、これについては別の記事で詳しく説明します。

ステップ5はサマリー画面で、いくつかの高度なオプションが含まれています。ネットワークタイプの変更、固定MACアドレスの設定、仮想化タイプの選択、ターゲットアーキテクチャの指定が可能です。Usermodeで実行している場合はネットワークオプションが限定されます。ブリッジユーティリティを使用していない場合、インターフェースのブリッジ接続はできません。さらに、CPU仮想化拡張機能がない場合、「Virt Type」欄にはKVMではなくQEMUと表示されます。この例は後ほど、エミュレーションモードで動作させることの重大な欠点を議論する際に改めて見せます。参考までに、典型的なUbuntu仮想マシンの設定画面はこのようになります。

これで仮想マシンが完成しました。まもなく電源を入れて使用してみます。

仮想マシンのオプション

VMM本体と同様に、VMコンソールにも興味深いオプションがいくつかあります。ゲストへのシグナル送信、仮想コンソールの切り替え、強制再起動や強制シャットダウン、クローン作成、マイグレーション、保存、スクリーンショット撮影などが可能です。これらも競合製品とよく似ています。

クローンとマイグレーションのオプション画面を少しだけお見せします。今後、GUIとCLIの両面から詳細なチュートリアルを公開する予定です。

仮想マシンの実行

楽しいパートです。いくつか素敵なスクリーンショットをご覧ください。

まずは32bit版Ubuntu 10.10 Maverickのブートメニューから。

続いてPuppy Linux。美しいデスクトップとともに。

NAT接続で動作中のUbuntu。問題ありません。CPU使用率が非常に低いことに注目してください。重要なポイントなので、後ほどエミュレーションのみのモードを議論するときに思い出してください。しつこくて申し訳ありませんが、この超ターボ式の教育にどうかお付き合いください。

コンソールウィンドウをゲストの解像度に合わせてスケーリングすることもできます。これはビューワーメニューにあるオプションです。さらに、設定でコンソールの自動スケーリングを有効にすることも可能です。PuppyとUbuntuを並べて表示した様子がこちら。

システム使用状況はこちら。最小限に抑えられています。このような賢いリソース消費のおかげで、物理ハードウェアの限界を大きく超えるオーバーコミットが可能になり、1つの仮想マシンを1コアに束縛しながら、通常より多くの仮想マシンを快適に運用できます。

もちろん、仮想マシンとその関連ファイルを削除することもできます。

基本的な使い方に慣れたところで、次はコマンドラインに挑戦しましょう。

コマンドラインでの操作

それでは、悪名高い? コマンドラインを見ていきます。たとえば、virshを使って利用可能なすべての仮想マシンを一覧表示できます。

virsh list --all

次に、virt-installを使って仮想マシンを作成し、起動するまでの一連のコマンドです。なお、筆者はKVMの達人ではありません。manページにはテンプレートコードが載っていますし、ネット上には膨大なサンプルがあります。

実際のコマンドはこちらです。

virt-install --connect qemu:///system -n puppy -r 512 -f puppy.img -c lupu-520.iso --vnc --noautoconsole --os-type linux --accelerate --network=network:default

それぞれのオプションの意味は?

  • --connect qemu:///system:使用するハイパーバイザの種類を定義します。root権限でベアメタルカーネル上で実行する場合はsystem、非rootユーザーの場合はsessionを指定します。VMMでUsermodeを選択して右クリック接続していたときの違いを思い出せばイメージできるでしょう。xenでも同様に機能します。
  • -n puppy:仮想マシンの一意な名前です。気に入らない場合は、virshでゲストの名前変更や削除ができます。
  • -r 512:RAM容量をMB単位で指定します。
  • -f:ディスクファイルを指定します。ここではddコマンドで作成したpuppy.imgというディスクイメージを使用しています。容量を節約するため、スパースファイルとしてイメージを作成しました。スパースファイルの作成方法については、筆者の「Cool Linux hacks」第二弾の記事で詳しく解説しています。
  • -c:CD-ROMを指定します。物理デバイスでもISOイメージでも構いません。
  • --vnc:ゲストコンソールをセットアップし、VNCサーバーとしてエクスポートします。--noautoconsoleを付けると、仮想マシンの電源投入時にコンソールが自動的に開かれなくなります。
  • --os-type:ゲストのオペレーティングシステムを指定します。
  • --accelerate:可能な場合に、ゲストシステムのパフォーマンスを高速化する最適化機能の使用を許可します。
  • --network:ネットワークタイプを定義します。ここではデフォルト接続を使用しています。

このほかにも多くの機能が利用できます。コア数の指定や特定CPUコアへのバインド、NICへの固定MACアドレス設定、ストレージなしでの起動、キーマップの変更などです。

これらはすべてmanページに記載されています。直感的ではありませんが、使い込むうちに自然と身につきます。実際、最初の印象ほど学習曲線は急ではありません。virt-installのコツをつかめば、ほかのコマンドにも応用でき、virshでマシンの起動・停止を操れるようになります。そうなればもう一人前です。

その他の注意点

言及しておくべき詳細がいくつかあります。

純粋なエミュレーションモードでの実行(非推奨)

前述の通り、エミュレーションモードはまったく非効率です。その証拠をお見せしましょう。たとえば「Host Details Overview」のPerformanceグラフを見てください。エミュレーションモードでは、CPU使用率が仮想マシンに割り当てられたリソース(この場合は1コア)の上限100%に張り付きます。ホスト全体では25%の使用率に相当します。まるでDOS時代のようです。つまり、どんなに軽量な仮想マシンでも4台動かせば、4コアのホストを圧迫してしまうのです。

さらに、パフォーマンスは悲惨なことになります。Intel VTを有効にして内部の7,200rpm HDD上のイメージから起動する場合、Ubuntuゲストの起動は約1分ですが、エミュレーションモードでは約20分かかります。CPU拡張機能がなくても十分に良好なパフォーマンスを維持するほかのソリューションと比べると、これはQEMU/KVMの弱点だと言えます。

おすすめの参考文献

冒頭でリンクしたhowtoforge.comのKVMシリーズを強くおすすめします。

さらに、以下の資料も読んでおくと良いでしょう。

  • Discover the Linux Kernel Virtual Machine
  • KVM management tools

まとめ

このチュートリアルを楽しんでいただけたなら幸いです。KVMを始めるための最初の一歩を記録したものではありますが、かなり長く詳細な内容になりました。初期セットアップと前提条件、コマンドラインツールとGUIツール、管理オプション、複数の仮想マシンの作成と実行方法など、多くの事柄を一望できる内容になっています。

続編も大量に控えています。ブリッジネットワーキングを含む高度なストレージ・ネットワーク構成、仮想マシンのクローン作成とマイグレーション、ほかの仮想化ソフトウェアとの競合の解決方法などを取り上げる予定です。直接の関連はありませんが、XenやESXiに関する記事シリーズも執筆していきます。

ご覧いただいたように、KVMは新規ユーザーには少し敷居が高く見えるかもしれませんが、非常に強力なツールです。管理面での初心者への優しさでは一部の競合に劣りますが、今日の記事で、その不安や混乱はいくらか払拭できたのではないでしょうか。

それでは、今回の解説はここまでです。ぜひ楽しんでください!


  1. 仮想化ソフトウェア徹底ガイド – デスクトップ体験を広げる多彩な選択肢

    今回は、デスクトップ環境を強化するために活用できる、人気の高い仮想化製品をいくつかご紹介します。仮想化ソフトウェアについては以前にも詳しく取り上げましたが、今回は「ソフトウェアに何ができるか」ではなく、「ユーザー自身が何をできるようになるか」という視点に焦点を当てます。 Windows / Linux の一般的なユーザーであれば、選べるソフトウェアは非常に幅広く、無料のオープンソース、無料のクローズドソース、有料製品まで、使いやすさや難易度もさまざまです。それでは早速見ていきましょう。 最良の選択肢 このカテゴリには、VMware 製の無料製品2つと、VirtualBox の開発元である Su

  2. MojoPac徹底解説|USBメモリで使えるデスクトップ仮想化ソフトウェア

    大容量ポータブルUSBデバイスが手頃な価格で容易に入手できるようになった今、ポケットに収まる小さなドライブに大量のデータやアプリケーションまで持ち運べるというアイデアは、非常に魅力的に響きます。この用途向けに特化した人気ソフトウェアとしては、Portable AppsやPendrive Linuxが挙げられますが、それぞれにいくつかの弱点があります。 Portable AppsとPendrive Linuxの課題 Portable AppsはWindowsコンピュータ専用です。Firefox、GIMP、OpenOfficeなど数多くの便利なアプリケーションを持ち運べる一方で、USBドライブ上の