YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

10分で始めるKVM

はじめに

新人研修で新人の方々の中で技術方面やりたい人のサポートしています。今までネットサーフィンとメールとOffice使うくらいしかしてなかった、という人も多数いるのでそういう方々に早く技術を身につけてもらいたいなと思って家に環境構築をすることをお勧めしました。
どうせならいろんな環境を作ってほしいなと思い、仮想化環境を使って環境を構築する方法をメモっておきます。VMwareVirtualBoxを使えば簡単なんでしょうけど、せっかくなら新しめの技術に触れてほしいということで、ここに触れておきます。自分も別に詳しいわけではないので突っ込み歓迎。会社の後輩向けに書いていますのでその辺も汲み取ってください。

KVMってなんですか?

詳しい人はたくさんいるのでここでは詳細は省きます。KVMはKernel-based Virtual Machineの略でLinuxカーネル自体をハイパーバイザー化した完全仮想化技術です。CPUはQEMUによりエミュレートされ、I/Oはすべて/dev/kvmというインタフェースを通して処理されます。積極的にIntel VT/AMD-Vなどの仮想化支援機能を利用するのでQEMUによるHVM化のオーバーヘッドは軽減されています。
この説明で分かる人はこの記事を見なくても自分で環境構築できると思いますが。ここ飛ばしても環境は作れるので飛ばしてください。

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

KVM徹底入門 Linuxカーネル仮想化基盤構築ガイド

KVMの導入とインスタンスの構築

では実際に10分でKVMを導入し、インスタンスを構築してみます。今回は僕が自宅で使っているUbuntu10.04を基準に書きます。

0:00 パッケージのインストール
$ sudo apt-get install kvm qemu-kvm <-- KVM自体のインストール
$ sudo apt-get install virsh virtinst libvirt0 python-libvirt <-- 管理ツールのインストール

後者の作業をすると、virshやvirt-installといった便利なツールが使えるようになります。libvirtっていうのがQEMU,XenやVirtualBox,VMwareなど多くの仮想化環境をサポートしてるめちゃめちゃ便利なツール/ライブラリです。ライブラリはいろんな言語のバインディングがあるんで、遊んだりできます。
KVMはカーネルモジュールを追加するので、modprobeするかOSの再起動をしておきましょう。

0:30 ネットワークブリッジインタフェースの作成

UbuntuなのでRedHat系とは違うかもしれませんね。

$ vim /etc/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

# The bridge network interface for KVM
auto br0
iface br0 inet static
address 192.168.1.10
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp off

$ sudo /etc/init.d/networking stop
$ sudo /etc/init.d/networking start 

こんな感じにしてbr0というブリッジインタフェースを作成します。もともとeth0に書いてあった内容をbr0として書いて、さらにbridge_xxxというようなプロパティを記述するだけです。あとネットワークの再起動は念のためrestartではなくstop, startにしました。

2:30 イメージの作成
$ sudo mkdir test
$ cd test
$ dd if=/dev/zero of=Test.img bs=1M count=8000

仮想HDDとして8GBのファイルを作成しました。僕の環境ではtimeコマンド使ったら57secで作成できました。簡単な環境作成ではこのようにファイルで仮想HDDを指定しますが、ホストOSのパーティションを使用することもできます。

3:30 インストールコマンドの指定

virt-installという管理ツールを使うと簡単に作成できます。KVMでは仮想マシンをドメインと呼びます。ドメインを作成するにあたってさまざまな物理デバイスの割り当てを最初にvirt-installで指定するというイメージです。本来ならこの設定は自分でXMLを書くわけですが、virt-installを使うと自動で作成できます。

$ sudo virt-install \
--name=test \ <-- ドメイン名
-connect=qemu:///system \ <-- QEMUを使います
--ram=4096 \ <-- ドメインにRAMを4GB与えます
--vcpus=4 \ <-- 仮想CPUは4つ
--os-type=linux \ <-- ドメインはLinuxにします
--hvm \ <-- 完全仮想化にします
--virt-type=kvm \ <-- 仮想化方法はKVM
--file=Test.img \ <-- 仮想HDDはいま作成したTest.img
--cdrom=/work/iso/debian-504-amd64-xfce+lxde-CD-1.iso \ <-- インストーラのISOの場所
--vnc \ <-- VNCを使って画面を操作します
--vncport=5900 \ <-- このドメインには5900番ポートを割り当て
--vnclisten=0.0.0.0 \ <-- どのマシンからもVNCを受け付けます
--network=bridge:br0 \ <-- 仮想NICは先ほど作成したbr0のブリッジインタフェースを使います
--keymap=ja <-- ドメインのキーマップはja

各々のオプションに説明を書いたら見づらくなってしまいましたが、こんな感じです。詳しくはman virt-installしてください。ここではtestという名前のインスタンスを作成しようとしています。KVM用の設定としては、

  • -connect=qemu:///system
  • --hvm
  • --virt-type=kvm

あたりだと思います。インストールする際はGUIを使うことになると思いますので画面周り(VNC)の設定をすることを忘れずに。自分はこれをinstall.shとファイルにしておいて使いまわしてます。

4:30 インストール開始

上のコマンドを実行するとドメインが起動しますので、VNCクライアントでホストOSの5900番ポートにアクセスします。

$ ./install.sh
インストールを開始しています...
ドメインを作成中...                                        0 B 00:00

(virt-viewer:5019): Gtk-WARNING **: cannot open display:
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

f:id:ymotongpoo:20100806163030j:image
するとこんな感じでいつもと同じようにインストールの画面が見れますね。
f:id:ymotongpoo:20100806163032j:image
で、あとは適当にいつもOSをインストールする感じで設定をしていけばいいですね。

10:00+ インストール完了

ディストリビューションによって違いますが、小さなものならすぐにインストール終わります。早ければ10分くらいじゃないですかね。さすがにKVMの導入から10分で、というのは大げさでしたがこんな感じでお手軽に仮想環境が構築できてしまいます。簡単ですね。
f:id:ymotongpoo:20100806173416j:image

運用

ドメインの停止/起動

virshのshutdown/startを使います。

$ virsh start <domain name>
$ virsh shutdown <domain id/domain name>

startのときはまだ稼働してないのでdomain idが割り振られてないことに注意してください。おんなじようにサスペンド、再起動や強制終了は各々suspend, reboot, destroyでできます。

ドメインを監視したい

virshの中のlistを使います。

$ virsh list
 Id 名前               状態
----------------------------------
  2 test                 実行中
ドメインの環境を変更したい

virshのeditを使います。修正する前はvirsh shutdownしといたほうがいいと思いますよ。詳しい設定に関してはlibvirtのドキュメント(上記リンク)を見ながらやればできると思います。

$ virsh edit <domain id/domain name>

すると勝手にviとかエディタが立ち上がるのでセーブして完了。ドメインtestはこんな感じになってる。

<domain type='kvm'>
  <name>test</name>
  <uuid>78979cde-4d8e-2f35-3f78-ab96774abc5f</uuid>
  <memory>4194304</memory>
  <currentMemory>4194304</currentMemory>
  <vcpu>4</vcpu>
  <os>
    <type arch='x86_64' machine='pc-0.12'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu'/>
      <source file='/mnt/sdb/kvmpool/test/Test.img'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='block' device='cdrom'>
      <driver name='qemu'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:3d:f7:0a'/>
      <source bridge='br0'/>
      <target dev='vnet0'/>
    </interface>
    <console type='pty'>
      <target port='0'/>
    </console>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0' keymap='ja'/>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
    </video>
  </devices>
</domain>
ドメインをなかったことにしたい

同じドメイン名を使ってインスタンスを作りたい場合はvirsh undefineを使います。

$ virsh undefine <domain id/domain name>

これをしないと「こら!」と言われます。

$ sudo virt-install --name=test ....
ERROR    Guest name 'test' is already in use.
ユースケース:バックアップを取って、リストアする

virshを使っていると直接libvirtのXMLを書くことはありません。しかしバックアップを取る際には設定と一緒にバックアップしなければいけません。また逆にそれをリストアする際にはバックアップしておいたXMLファイルを読み込まなければいけません。これはdumpxmlとcreateを使う次のような方法でできます。

  • バックアップ時
$ pwd
/work/kvmpool/test
$ virsh dumpxml test > test.xml
$ cd ..
$ tar czf test.tgz test
  • リストア時
$ tar xzf test.tgz
$ cd test
$ virsh create test.xml
ユースケース:ホストOS起動時にゲストOSも自動起動させる

これはvirshのオプションで一撃です。

$ virsh autostart test
ドメイン test が自動起動に設定されました

そして自動起動を解除する時はdisableオプションをつけます。

$ virsh autostart --disable test
ドメイン test の自動起動設定が解除されました
おわりに

とまあこんな感じでまったり書いてきましたが、一番言いたいことは「自分で手を動かさないとわからないこともたくさんあるので、がんばってください」ということです。マシンを買うことはお金がかかることではありますが、こういうことを気軽に試せる環境があることで、それ以上の価値や体験はできると思いますよ。
あとはどんどん使っていって慣れるだけですね!