はじめに
新人研修で新人の方々の中で技術方面やりたい人のサポートしています。今までネットサーフィンとメールとOffice使うくらいしかしてなかった、という人も多数いるのでそういう方々に早く技術を身につけてもらいたいなと思って家に環境構築をすることをお勧めしました。
どうせならいろんな環境を作ってほしいなと思い、仮想化環境を使って環境を構築する方法をメモっておきます。VMwareやVirtualBoxを使えば簡単なんでしょうけど、せっかくなら新しめの技術に触れてほしいということで、ここに触れておきます。自分も別に詳しいわけではないので突っ込み歓迎。会社の後輩向けに書いていますのでその辺も汲み取ってください。
KVMってなんですか?
詳しい人はたくさんいるのでここでは詳細は省きます。KVMはKernel-based Virtual Machineの略でLinuxカーネル自体をハイパーバイザー化した完全仮想化技術です。CPUはQEMUによりエミュレートされ、I/Oはすべて/dev/kvmというインタフェースを通して処理されます。積極的にIntel VT/AMD-Vなどの仮想化支援機能を利用するのでQEMUによるHVM化のオーバーヘッドは軽減されています。
この説明で分かる人はこの記事を見なくても自分で環境構築できると思いますが。ここ飛ばしても環境は作れるので飛ばしてください。
- 作者: 平初,森若和雄,鶴野龍一郎,まえだこうへい
- 出版社/メーカー: 翔泳社
- 発売日: 2010/07/08
- メディア: 大型本
- 購入: 5人 クリック: 205回
- この商品を含むブログ (13件) を見る
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 ネットワークブリッジインタフェースの作成
$ 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.
するとこんな感じでいつもと同じようにインストールの画面が見れますね。
で、あとは適当にいつもOSをインストールする感じで設定をしていけばいいですね。
運用
ドメインの停止/起動
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 の自動起動設定が解除されました
おわりに
とまあこんな感じでまったり書いてきましたが、一番言いたいことは「自分で手を動かさないとわからないこともたくさんあるので、がんばってください」ということです。マシンを買うことはお金がかかることではありますが、こういうことを気軽に試せる環境があることで、それ以上の価値や体験はできると思いますよ。
あとはどんどん使っていって慣れるだけですね!