KVMで暇を潰そうの会:会員No. 001の報告

最初に言っておきますが、そんな会は実在しません。
非実在同好会です。
仮に存在したとしたら、関係者の方には申し訳ないですけど。
最初は『〜で遊ぼうの会』にしようと思ったんですが、ググったら割とヒットしたのでやめました。
まあ、そんな訳で。
会員は募集しておりませんので、ご了承ください。


さてさて。
まあ、このブログがどんなものなのか、もっと言えばどういう記事が書かれているかを把握されておられる希少な方がいらっしゃったとすれば、こう思うことでしょう。
「こいつ、やることがころころ変わるなあ……」
呆れ半分、諦め半分で。
反論はありません。
ああ、『ありません』というのは、まさに言葉通りの意味であって、『反論はあるけど、ここではしない』ではなく、『ないものはないんです。本当に、困ったものです』ということです。
「そんなことじゃ何も身につかないぜ?」とでも言いたげな目はやめてください。
分かってますから。
僕は何でも知ってるんです。


えっへん。


てな訳で。
今回は、KVMです。
Kernel-based Virtual Machine、略してKVMですね。
決して、『彼女は仮想機械』の略ではありません。
ある意味、間違ってないと思いますけどね。
ラノベのタイトルとかにありそうじゃないですか?
ただまあ、もしあったとしたら、そんな彼女が規制されないことを祈るばかりです。


話が飛んでばかりですね。
主題とは全く別ベクトルに話題が富んでいるとも言いますが。
ときに、一通さんは話題のベクトルも自由自在なんでしょうか。
ああ、大丈夫ですね。
考えてみれば、考えるまでもなく彼はコミュニケーションにおいてもほぼ一方通行でした。
それでも、最近はそうでもない印象を受けますけどね。
アクセラレーターかわいいです。
彼が怪異だとしたら、間違いなくダイレクトに影響を与えているのは打ち止めでしょうけどね。
………………
どっちも常識が通用しねぇ……。


閑話休題
そろそろ、話を始めましょう。
話の構成としては、ざっくりと、

  1. インストール?
  2. 使い方?
  3. KVMって何?

みたいにしようと思ってます。
とりわけ、使い方?の部分では、Arch LinuxWindows7FreeBSDをそれぞれ試験的にインストールした際の話をしようかな、と、そんな風に思ってます。
始めてこのブログに目を通される方で、この記事に目を通す価値があるか判断しかねている方は、『はじめに』カテゴリを参照していただければ、大方の目安になるかと思います。
参考までに私見を示しておくと、ほとんどないと思います。
自分で書いておきながら、とお思いでしょうけれど、でも自分で書いたから分かることもあるでしょう?
そういうことです。
……どういうことだ?

KVMのインストールについて

僕はUbuntuユーザーなので、ここでの話はUbuntuにおけるものと解釈してください。
もっとも、貴方がUbuntuユーザーなら、ここでの話はとても簡単です。


まず、第一にハードウェア的に環境が満たされているかをチェックしましょう。
最も肝心なのは、CPUが仮想化支援機能を有しているか否かです。
IntelのCPUをお使いなら、

% grep vmx /proc/cpuinfo

AMDのCPUをお使いなら、

% grep svm /proc/cpuinfo

のコマンドで、それぞれのサポート状況をご確認ください。
結果、たとえばIntel系の場合なら、

% grep vmx /proc/cpuinfo
flags           :(前略) vmx(後略)

のようになっていれば、OKです。AMD系ならvmxをsvmに置き換えてください。
これが、最初の関門です。
残念ながらフラグが立っていなかった方は、KVM使えません。
いや、手元にサポートしていないCPUを積んだマシンがないので検証できてないんですけど、まあできません。
お気持ちは察しますが、僕にあたらないで下さい。
でも、最近のものなら割とサポートしてると思います。
まあ、マシン買い換えるってのも、お金、かかっちゃいますからね。
とにかく、この基準を満たしているかどうかの確認を最初に行って下さい。


で。
このハードな関門を乗り越えれば、インストール自体は楽ちんです。
拍子抜けです。
以下のコマンドで、必要なパッケージのインストール終了です。

sudo apt-get install qemu-kvm kvm-pxe

ね?
簡単でしょう?
ただ、ちょっと準備が要ります。
お使いのCPUがIntel系なら、

% sudo modprobe kvm
% sudo modprobe kvm_intel

AMD系なら、

% sudo modprobe kvm
% sudo modprobe kvm_amd

のそれぞれのコマンドを実行して、モジュールをロードしてください。
KVMは、現在ローダブル・カーネル・モジュールとして実装されていて、モジュールがローダブルと言うよりモジュールをロードしないと使えません。
あとあと、起動時に自動で読み込んでくれるように、/etc/modulesに以下を追記しとくといいと思います。

kvm
kvm_intel(あるいはkvm_amd)

最後に、モジュールがロードされているかの確認もしてみます?

% lsmod |grep kvm

あとは、まあ、kvmグループにでも登録しておきましょう。

% grep kvm /etc/group
とすると、kvmグループが作られていることでしょう。
任意のユーザーを所属させるには、
% sudo gpasswd -a <user-name> kvm

これで、大方の準備は終わりです。
お次は、使い方?行ってみましょう。

追記

CPUが仮想化をサポートしているにも関わらず、kvm_intelをロードしようとすると、

FATAL: Error inserting kvm_intel (/lib/modules/2.6.35-28-generic/kernel/arch/x86/kvm/kvm-intel.ko): Operation not supported

みたいなエラーメッセージと共に失敗する場合は、BIOSの設定を怪しんでください
具体的な一例(あくまで例ですので、ご自身の環境に置き換えて見てください)として、BIOSのConfigとかからCPUの設定に入り、Intel(R) Virtualization TechnologyやVT-d FeatureがEnableになっているかどうか、それを確認してください。
これが、Disableになっていると何してもロードできません

KVMを使う

インストールできたら、後は使うだけですね。
まあ、本来こちらがメインですけれど。


KVM仮想マシンにインストールを行う際の手順は、

  1. 仮想ディスクを作る
  2. インストールする

という豪華2本立てになっています。
これらは、それぞれ該当するコマンドで行います。


仮想ディスク、って言ったらいいんですかね。
要するに、現在のファイルシステム上にインストールする仮想OSのための領域確保です。
仮想的なハードディスクドライブを作ると言えば、より簡易でしょうか。
そのコマンド例が以下です。

% qemu-img create -f qcow2 virtual-hdd.img 20G

細かい説明は、細かい説明をしてくれるところに回すとして。
qcow2とは作成する仮想HDDのフォーマットのことなんですが、qcowおよびqcow2は実際に使った分だけの容量を消費します。
つまり、この例では20ギガバイトのHDDを仮想的に作っていますが、いきなり20Gが占領されるわけではありません。
大抵のKVMの紹介では、qcowやqcow2を使っています。
ただし。
僕は、rawフォーマットでの作成を推奨します。
rawは固定フォーマットなので、20G予約したら20Gを占領します。
ただ、qcow*(qcowとqcow2の意)フォーマットよりも早いです。
なぜか。
qcow*は使った分だけを消費しますから、それは逆に言うと、データの書き込みが起こる度に、ホストOSのファイルシステム上にゲストOSのファイルシステムをエミュレートすることに他なりません。
つまり、データの書き込みの度に、ディスクをフォーマットしていることになります。
経験から結論を言うと、qcow*遅いです。
環境によって変わるのかもしれないですが、遅いです。
後述しますが、qcow2フォーマットのメモリ512MB予約でUbuntu minimalインストールした時なんて、半ギレしました。
遅すぎます。
今時、個人のHDDリソースなんて、消費しきれるものではないでしょう?
重要なデータは、基本外付けHDDでバックアップをとっているでしょうし。
ストレスフリーとまではいきませんが、可能な限り快適な環境を求めるなら、

% qemu-img create -f raw virtual-hdd.img 20G

がいいと思います。
imgファイルの名称とディスクサイズはご自由に。
僕は、試験的に導入したwindows7には100Gをあてがいました。


で。
容量予約を済ませたら、次はいよいよインストールですね。
KVMはCD/DVDドライブに挿入したインストールディスクからのインストールと、isoイメージからのインストール、どちらにも対応しています。
まあ、windows系は別としても、isoからのインストールの方がディスク焼かなくていいんで楽です。
isoイメージファイルからのインストール例は、

% sudo kvm -no-acpi -m 1024 -cdrom ./mini.iso -hda virtual-hdd.img -boot d

各オプションについて
-no-acpi: acpiサポートを無効にします。後述しますが、エラーの原因になりやすいです。
-m 1024: メモリの予約です。ここでは、1024MB、つまり1ギガを予約しています。
-cdrom: インストールメディアの指定です。ここでは、isoイメージファイルを指定しています。
-hda: インストールを行う仮想HDDです。qemu-imgで作った任意のものを指定してください。
-boot: ブート先。インストール作業を行うときはdを指定してください。

ですね。
特筆すべきことは、メモリの予約についてでしょうか。
ここで予約できるメモリの上限は、おそらく実メモリの半分以下です。
具体例をあげると、貴方のマシンが4Gのメモリ搭載なら、2Gまでは予約可能ですが、2.1Gはきっと無理です。
ドキュメントをまだよく読んでないのですが、この制約を破ると『〜Gのメモリのエミュレートは無理だって!』とエラー吐かれます。
まあ、Linuxぐらいなら、1Gあれば事足りるでしょう。
貧弱な環境を長らく使っていた僕なんかに言わせたら、おもちゃに1Gもメモリを割り当てられるなんて素敵です。


仮に、貴方がCD/DVDからインストールするならば、たとえば、

% sudo mount /dev/sr0 /media
% sudo kvm -no-acpi -m 1024 -cdrom /media -hda virtual-hdd.img -boot d
(作業終了後)
% sudo umount /media

みたいな感じでしょうか。
僕、minimalでいつもUbuntuインストールするので、しかもどのマシンもCD/DVDドライブ搭載してないので、いつも外付けなんですよ。
なんで、例における/mediaの部分は、ドライブが認識されていれば、それに置き換えてください。
自動でドライブがマウントされるなら、mountのくだりも不要です。
今回は書き込みではなく読み込みなので、自動マウントされないのなら、おそらくマウント必須です。
後は、普通にインストールするだけですね。
ネットワークはDHCPで構わないと思います。ただ、プロキシにはご注意を。
……プロキシめ。
ntpdateが使えねぇとか……仕方ないけどさ。

ちなみに。
うっかり仮想OSのウィンドウをクリックしてしまって抜け出せねぇ!!となった場合
ウィンドウトップのメッセージに従ってください。
すなわち、『Ctrl-Alt』を押してください。
解放されます。


インストールが終わったら、後は普段の使い方ですね。

% kvm -no-acpi -m 1024 -hda virtual-img.img -boot c&

bootオプションにcが渡されていることに注意してください。
通常起動時は、dではなくcになります
このコマンドを実行すると、QEMUというエミュレータが起動し、インストールしたOSが立ち上がったらハッピーです。


さてさて。
では、僕がそれぞれ試しにインストールしてみたときのことを、参考までに記しておきましょう。
まずは、Ubuntu minimal。

% qemu-img create -f qcow2 vm-disk.img 20G
% sudo kvm -no-acpi -m 512 -cdrom ./mini.iso -hda vm-disk.img -boot d

これ、インストール完了までに6時間以上かかりました。
core-i7だぜ?メモリ、4ギガだぜ?
実マシンでやったら、6時間で環境の構築までが大方終わるってのによォ。
………………
僕は、この一件で懲りに懲りて、メモリは1ギガ、形式はrawを使うようになりました。
ただ、メモリに関してはちょっと疑問です。
ゲストOSでtopしても、そんなに無いような……。
この辺は勉強不足です、すみません。


次がArch Linux
何か、僕のまわりで人気沸騰中なんですよ。
なぜ?

% qemu-img create -f raw arch.img 20G
% sudo kvm -no-acpi -m 1024 -cdrom ./arch.iso -hda arch.img -boot d

こちらは、とりたてて問題なく。
せいぜい、キーマップとプロキシという、個人的な問題だけでした。


ここで、Xの環境構築についてですが、どうもデフォルトのままではダメなようです。
Openbox使ってるんですが、X起動しても落ちる方は、Xorgの設定でScreenセクションのDefaultDepthを16にしてください。
必要なドライバ入ってるはずなのに、って場合は、大概それでOKです。
/etc/X11/Xorg.confの例としては、

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    Monitor        "Monitor1"
    DefaultDepth    16
    Option         〜
    Option         〜
    SubSection     〜
        Depth       16
    EndSubSection
EndSection

Archなら/etc/X11/xorg.conf.d/10-monitor.confをいじればいいんですが、まあArchWikiのXorgに詳しいでしょうから、そちらに譲ります。


で。
問題なのが、FreeBSDWindows7ですね。
結論から言うと、-no-acpiオプションは外してください
このオプションつけたままでは、インストール進みません。
起動の段階で止まります。
FreeBSDの場合。

% qemu-img create -f raw freebsd.img 20G
% sudo kvm -m 1024 -cdrom ./freebsd.iso -hda arch.img -boot d

Windows7の場合。これは、CD/DVDドライブ使いました。

% qemu-img create -f raw win7.img 100G
% sudo mount /dev/sr0 /media
% sudo kvm -m 1024 -cdrom /media -hda win7.img -boot d
% sudo umount /media

まあ、後はあげつらうべき問題はありませんでした。
ちなみに、FreeBSDxorgのconfigure中に『VMware-video』の文字を見かけてチェック入れましたが、やっぱりDefaultDepthは16が無難です。
素敵です。
xorgのmake installさえ、2時間あれば終わりました。
かつての非力なマイマシンは、2倍以上はかかったというのに……。
実は3倍以上だけどね!キラッ☆……環境構築に連日徹夜したのは、いい思い出

まあ、基本的にはこんなもんですかねぇ。
もう少し、ネットワークの設定とか、色々便利には出来るんですけど、それはまたにしましょう。
この記事、とんでもなく長くなっているので。

KVMってそもそも何すか?

冒頭でも……言ったっけ?まあ、Kernel-based Virtual MachineKVMです。
Wikiとかに有益な情報がまとまってるんですが、KVMWikiと併せて、少なくともハイパーバイザWikiには目を通してください。仮想化技術に関して、とても簡潔に把握できると思います。


要は、KVMでは、ホストOS上でゲストOSが動くと言うよりも、ホストOSとゲストOSは同次元にあって、両者のリソース配分をKVMが管理しているという具合でしょうか。
同次元は言い過ぎかな。
でも、まあホストOSがゲストOSを管理しているわけではないということです。
仮想的な仮想化ではなく、より本質的なと言うか本来のイメージでの仮想化技術ですね。


まあ、この辺は僕も把握しきれていないので、これぐらいにしておきます。
ただ、手っ取り早く知った気になりたい方は、とにかくハイパーバイザのWikiを見てください。
ぶっちゃけ、記事編集に疲れました……

終わりに

僕がKVMを使うのは、技術的な好奇心と言うより、色んなディストリビューションやOSを触ってみたいと思ったからです。
特に、FreeBSDなんかは練習がてらに使うのにもってこいですし。
プログラムの環境依存の調査とかにも便利そうですし。
単純に、いくつもOSが動いてるってすごいことですし。


まあ。
いくつもOS立ち上げたところで、僕の処理能力は変わりませんが。
ではでは、今日はこの辺で。
長文、失礼しました。長文、めっさ疲れた……