読者です 読者をやめる 読者になる 読者になる

KVMメモ

KVMごっこをしたときのメモ。 共通編、qemu直叩き編、virsh使用編の3編でお送りします。

共通

環境
インストール

コマンド一発。

$ sudo aptitude install kvm
カーネルモジュールのロード

KVMはローダブルカーネルモジュールになっているので、 モジュールをロードして使う。

$ sudo modprobe kvm
$ sudo modprobe kvm_intel 
モジュールをブート時に読ませる

/etc/modulesにkvmkvm_intelを追記する。

$ sudo vim /etc/modules
KVMグループにユーザを登録

必要があるかどうかわからないのでやらなかった。 コマンドはこれ。

$ gpasswd -a bisco kvm
ゲストOS用ディスクイメージ作成(qcow2)

qcow2フォーマットで、vm00.imgという名前のディスクイメージを10GB分作成する。 使った分だけ物理ドライブを消費する。性能はいまいちだけどスナップショットがとれるのが利点。

$ qemu-img create -f qcow2 vm00.img 10G

# スナップショットは以下のコマンドで取れる(未実施)
# snapという名前でtest.imgのスナップショットを取る
$ qemu-img snapshot -c snap test.img

# スナップショットを確認する
$ qemu-img snapshot -l test.img

# test.imgをsnapに巻き戻す
$ qemu-img snapshot -a snap test.img

# test.imgのスナップショットsnapを消す
$ qemu-img snapshot -d snap test.img 
ゲストOS用ディスクイメージ作成(raw)

rawで作る。速度を気にする場合はこちら。 ddで作ると相当時間かかる上にドライブに負担がかかるので、 並行する別の作業に支障がでるかもしれない。

# raw(スパース:見かけ0で実際使った分だけ消費)
$ qemu-img create -f raw vm00.img 10G

# raw(ノンスパース:10GB最初から割り当てられてる)
$ dd if=/dev/zero of=./vm00.img bs=1M count=10240
ブリッジ接続用の準備

KVMはデフォルトでNATになってしまう。NATだとホストOSからSSHでアクセスできなくて困るので、 ブリッジ接続にしたい。

まずはブリッジ作成
# ブリッジ作成用に必要なものをインストール
$ sudo aptitude install bridge-utils

インストールが終わったら、/etc/network/interfacesを編集する。 面倒なのでdiff結果を貼っておく。パラメタの詳細は調べてない。

$ diff -ur interfaces.back interfaces
--- interfaces.back 2013-07-21 15:42:55.083528245 +0900
+++ interfaces  2013-07-21 15:47:57.123542047 +0900
@@ -2,9 +2,16 @@
 # and how to activate them. For more information, see interfaces(5).
 
 # The loopback network interface
-auto lo
+auto lo br0 eth0
 iface lo inet loopback
+iface eth0 inet manual
 
 # The primary network interface
 allow-hotplug eth0
-iface eth0 inet dhcp
+#iface eth0 inet dhcp
+iface br0 inet dhcp
+  bridge_ports    eth0
+  bridge_maxwait  0
+  bridge_fd       0
+  bridge_stp      off
+
qemu用にシェルスクリプトを用意する

下記スクリプトを/etc以下にqemu-ifupとして作成しておく。

#!/bin/sh
/sbin/ifconfig $1 up
/usr/sbin/brctl addif br0 $1

diff結果はこれ。

--- qemu-ifup.back 2013-07-21 16:18:14.743625079 +0900
+++ qemu-ifup   2013-07-21 16:19:17.303627934 +0900
@@ -1,2 +1,3 @@
 #!/bin/sh
-sudo -p "Password for $0:" /sbin/ifconfig $1 172.20.0.1
+/sbin/ifconfig $1 up
+/usr/sbin/brctl addif br0 $1

qemuコマンド直叩き編

ゲストOSをISOイメージからブートする

KVMコマンド直叩きで作成。オプションはこんな感じ。

  • -no-acpi:トラブルのもとらしいので、acpiをOFFにする。実際よくわからないのでそのままコピペ。
  • -m 1024:メモリの予約。ここでは、1024MBを予約。
  • -cdrom:CDメディアの指定。ここでは、isoイメージを指定する。
  • -hda:ディスクイメージを指定。
  • -boot:ブート先。インストール作業を行うときはdを指定。
  • -monitor telnet::4445,server,nowait:qemuのコンソール用設定。nowaitを設定しないと、接続するまでqemuがホールドしてしまうらしい。
  • -vnc :0:VNCの接続番号を指定する。いくつかゲストOSを立ち上げる場合は、ここの番号でVNCの接続を指定する。ここでは0番を指定。
  • -daemonize:プロセスをデーモン化する。デーモン化しないと、コンソールが占拠されてしまう。
$ kvm -no-acpi -m 1024 -monitor telnet::4445,server,nowait \
      -vnc :0 -daemonize \
      -cdrom /home/bisco/iso/debian-7.1.0-amd64-CD-1.iso \
      -hda vm00.img -boot d
ゲストOSへのアクセス

付属のVNCビューアからアクセスする。マウスのフォーカスを取り返すには、Ctrl+Alt。

インストール終了後

KVMは基本的にCDブートなので、CDイメージをくくりつけておくと再起動しても無駄。qemuのコンソールから殺しておく。

$ telnet 4445
# qemuにアクセス
(qemu) q
ディスクイメージから起動する(ブリッジ接続用)

デフォルトで立ち上げるとNATになる。NATだとsshでアクセスできないので、ブリッジ接続にする。TUN/TAPで何とかかんとかするらしい。 TAPを作るのに特権がいるので、sudoで起動する。

  • -net nic,macaddr=xx:xx:xx:xx:xx:xx,model=e1000:物理的なネットワークカードの設定をVMに追加。MACアドレスは適当でいいけど、LAN内で同じにならないようにすること。modelはデフォルトでe1000になるけど、明示的に指定しないとrtl8139になってしまうらしい。
  • -net tap,ifname=tap0:tapはVM用のブリッジインタフェース。ここで指定するifnameがqemu-ifupに渡されて、ブリッジインタフェースと関連付けられる。
  • -boot c:ディスクイメージから起動する。
$ sudo kvm -no-acpi -m 1024 -monitor telnet::4445,server,nowait \
           -vnc :0 -daemonize \
           -net nic,macaddr=12:34:56:78:90:ab,model=e1000 \
           -net tap,ifname=tap0 \
           -hda vm00.img -boot c

virsh使用編

virshインストール

コマンド一発でらくらくインストール。

$ sudo aptitude install libvirt
VMインストール
promptモードでインストール

sudoしなくても作れるけど、ブリッジ接続のためにsudoで作っておく。 下記4つを指定するだけで作れる。

$ sudo virt-install --prompt
コマンドラインでインストール

ここここを参考にした。 インストール終わったら、ゲストOSをシャットダウンする。

以下抜粋。

  • --name=debian-kvm:ゲストOSの名前を設定
  • --cdrom=/home/bisco/iso/debian-7.1.0-amd64-CD-1.iso:ISOイメージ
  • --vcpus=2:CPU割り当て数を2にする
  • --hvm:完全仮想化
  • --ram=1024:メモリ割り当て量
  • --vncport=5900:VNCポートを指定。5900以上を指定する。
  • --file=vm00.img:ディスクイメージ
  • --vnclisten=0.0.0.0:どのホストからもVNCを受け付ける
  • --noapic:apicを無効にする。 --os-type、--os-variantが優先。
  • --accelerate:カーネルの高速化設定
$ sudo virt-install --name=debian-kvm \
             --connect=qemu:///system \
             --ram=1024 \
             --vcpus=2  \
             --os-type=linux \
             --hvm \
             --virt-type=kvm \
             --file=vm00.img \
             --cdrom=/home/bisco/iso/debian-7.1.0-amd64-CD-1.iso \
             --vnc \
             --vncport=5900 \
             --vnclisten=0.0.0.0 \ 
             --network=bridge:br0 \
             --keymap=ja \
             --noapic \ 
             --accelerate 
ディスクイメージから起動

sudoでインストールしたので、virshもsudoで起動する。設定ファイルがsudoとsudoなしで保存場所が違うので、 sudo付けないと何もできない。 よく使うコマンドはこんな感じ。コマンドまとめはここ

  • list --all:VM一覧を表示。shut offされてるVMはこれじゃないと見られない。
  • start debian-kvm:ゲストOSの名前を指定してスタートさせる
  • shutdown debian-kvm:ゲストOSの名前を指定してシャットダウン
  • destroy debian-kvm:ゲストOSの名前を指定して電源断
$ sudo virsh
virsh # list --all
 Id    Name                           State
----------------------------------------------------
 -     debian-kvm                     shut off

virsh # start debian-kvm
Domain debian-kvm started

virsh # list
 Id    Name                           State
----------------------------------------------------
 1     debian-kvm                     running

virsh # destroy debian-kvm
Domain debian-kvm destroyed

virsh # list
 Id    Name                           State
----------------------------------------------------

参考ページ:メモが適当でどれがどれやら・・・