DebianでKVM-withoutVNC

お久しぶりです。
KVMを使ってみました。

ホストOS・・・Debian6.0.6(Squeeze)
Kernel・・・2.6.32-5-amd64
KVM・・・qemu-kvm-0.12.5
管理ツール・・・virtinst

基本的なインストール方法だけしか書いていませんので、
MANやHelpを見ながらやったほうが良いと思います。


1)KVMと管理ツールのインストール

まず、これがないと始まりません・・・

# aptitude install kvm
以下の新規パッケージがインストールされます:
  bridge-utils{a} ca-certificates{a} dbus{a} kvm libaio1{a} libasound2{a} 
  libasyncns0{a} libbluetooth3{a} libbrlapi0.5{a} libcap2{a} 
  libcurl3-gnutls{a} libdbus-1-3{a} libdirectfb-1.2-9{a} libflac8{a} 
  libgcrypt11{a} libgnutls26{a} libgpg-error0{a} libice6{a} libidn11{a} 
  libldap-2.4-2{a} libogg0{a} libpulse0{a} libsasl2-2{a} 
  libsasl2-modules{a} libsdl1.2debian{a} libsdl1.2debian-alsa{a} libsm6{a} 
  libsndfile1{a} libsvga1{a} libsysfs2{a} libtasn1-3{a} libts-0.0-0{a} 
  libvdeplug2{a} libvorbis0a{a} libvorbisenc2{a} libx86-1{a} libxi6{a} 
  libxtst6{a} mime-support{a} openssl{a} python{a} python-minimal{a} 
  python2.6{a} python2.6-minimal{a} qemu-kvm tsconf{a} 
更新: 0 個、新規インストール: 46 個、削除: 0 個、保留: 0 個。
13.0 MB のアーカイブを取得する必要があります。展開後に 40.6 MB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

KVMだけでは、使いづらい。。。

管理ツールを入れましょう。

# aptitude install virtinst
以下の新規パッケージがインストールされます:
  esound-common{a} etherboot-qemu{a} fontconfig{a} hicolor-icon-theme{a} libatk1.0-0{a} 
  libatk1.0-data{a} libaudiofile0{a} libavahi-client3{a} libavahi-common-data{a} libavahi-common3{a} 
  libcairo2{a} libcap-ng0{a} libcups2{a} libdatrie1{a} libesd0{a} libglade2-0{a} libglib2.0-0{a} 
  libglib2.0-data{a} libgtk-vnc-1.0-0{a} libgtk2.0-0{a} libgtk2.0-bin{a} libgtk2.0-common{a} 
  libjasper1{a} libjpeg62{a} libnl1{a} libpango1.0-0{a} libpango1.0-common{a} libpcap0.8{a} libpcre3{a} 
  libpixman-1-0{a} libpng12-0{a} libreadline5{a} libthai-data{a} libthai0{a} libtiff4{a} libvde0{a} 
  libvirt0{a} libxcb-render-util0{a} libxcb-render0{a} libxcomposite1{a} libxcursor1{a} libxdamage1{a} 
  libxenstore3.0{a} libxfixes3{a} libxft2{a} libxinerama1{a} libxml2{a} libxrandr2{a} libxrender1{a} 
  lvm2{a} openbios-ppc{a} openbios-sparc{a} openhackware{a} python-central{a} python-libvirt{a} 
  python-libxml2{a} python-pycurl{a} python-support{a} python-urlgrabber{a} qemu{a} qemu-keymaps{a} 
  qemu-system{a} qemu-user{a} qemu-utils{a} seabios{a} sgml-base{a} shared-mime-info{a} vde2{a} 
  vgabios{a} virt-viewer{a} virtinst x-ttcidfont-conf{a} xml-core{a} 
更新: 0 個、新規インストール: 73 個、削除: 0 個、保留: 0 個。
42.1 MB のアーカイブを取得する必要があります。展開後に 124 MB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

おもむろに叩くと

# virt-install 
ERROR    unable to connect to '/var/run/libvirt/libvirt-sock', libvirtd may need to be started: そのようなファイルやディレクトリはありません
Traceback (most recent call last):
  File "/usr/bin/virt-install", line 1033, in <module>
    main()
  File "/usr/bin/virt-install", line 789, in main
    conn = cli.getConnection(options.connect)
  File "/usr/lib/pymodules/python2.6/virtinst/cli.py", line 217, in getConnection
    conn = open_connection(connect)
  File "/usr/lib/pymodules/python2.6/virtinst/cli.py", line 232, in open_connection
    open_flags)
  File "/usr/lib/python2.6/dist-packages/libvirt.py", line 111, in openAuth
    if ret is None:raise libvirtError('virConnectOpenAuth() failed')
libvirtError: unable to connect to '/var/run/libvirt/libvirt-sock', libvirtd may need to be started: そのようなファイルやディレクトリはありません

怒られたw

解決してあげます。

# aptitude install libvirt-bin
以下の新規パッケージがインストールされます:
  dnsmasq-base{a} ebtables{a} gawk{a} libparted0debian1{a} libpciaccess0{a} libvirt-bin libxml2-utils{a} netcat-openbsd{a} 
更新: 0 個、新規インストール: 8 個、削除: 0 個、保留: 0 個。
2,766 kB のアーカイブを取得する必要があります。展開後に 6,652 kB のディスク領域が新たに消費されます。
先に進みますか? [Y/n/?] 

これでOK.

また、叩いてみる

# virt-install 
ERROR    A name is required for the virtual machine. (use --prompt to run interactively)

大丈夫そう

モジュールの詳細

# modinfo kvm
filename:       /lib/modules/2.6.32-5-amd64/kernel/arch/x86/kvm/kvm.ko
license:        GPL
author:         Qumranet
depends:        
vermagic:       2.6.32-5-amd64 SMP mod_unload modversions 
parm:           oos_shadow:bool
parm:           ignore_msrs:bool
# modinfo kvm-intel
filename:       /lib/modules/2.6.32-5-amd64/kernel/arch/x86/kvm/kvm-intel.ko
license:        GPL
author:         Qumranet
depends:        kvm
vermagic:       2.6.32-5-amd64 SMP mod_unload modversions 
parm:           bypass_guest_pf:bool
parm:           vpid:bool
parm:           flexpriority:bool
parm:           ept:bool
parm:           unrestricted_guest:bool
parm:           emulate_invalid_guest_state:bool

きちんと読まれています

2)ホストOSのネットワーク設定

ネットワークはブリッジを使いたいので、
「auto」に「br0」を追加。
「eth0」をコメントアウトして、「br0」にIPやらを設定する。
bridge-utilsはkvm入れた時に、依存で入ります)

# vi /etc/network/interfaces

# The loopback network interface
auto lo br0
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp

iface br0 inet static
        address 192.168.255.254
        netmask 255.255.255.0
        network 192.168.255.0
        broadcast 192.168.255.255
        gateway 192.168.255.1
        bridge_ports eth0

こんな感じになります。

OS再起動してもいいですが、ネットワーク再起動だけでも大丈夫です。

# /etc/init.dnetwork restart

特にエラーもなく・・・w

確認してみます。

# ifconfig
br0       Link encap:イーサネット  ハードウェアアドレス 00:17:08:56:a5:fb 
          inetアドレス:192.168.255.254 ブロードキャスト:192.168.255.255  マスク:255.255.255.0
          inet6アドレス: fe80::217:8ff:fe56:a5fb/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:85 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:53 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0 
          RXバイト:8601 (8.3 KiB)  TXバイト:8640 (8.4 KiB)

eth0      Link encap:イーサネット  ハードウェアアドレス 00:17:08:56:a5:fb 
          inet6アドレス: fe80::217:8ff:fe56:a5fb/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:49232 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:24935 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000 
          RXバイト:65613235 (62.5 MiB)  TXバイト:1827025 (1.7 MiB)
          割り込み:16 

lo        Link encap:ローカルループバック  
          inetアドレス:127.0.0.1 マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:0 
          RXバイト:0 (0.0 B)  TXバイト:0 (0.0 B)

ブリッジデバイスにIP等割り当てられているのがわかります。

3)ゲストOS用HDDイメージの作成

さて、ここからOSをインストール作業です。
まず、OSインストール先のイメージファイルを作ります。
インストール先のディスクを作成します。
今回は10GBにしてみます。

# qemu-img create -f raw /var/vm/ubuntu-test.img 10G
Formatting '/var/vm/ubuntu-test.img', fmt=raw size=10737418240 

一瞬ですw

仮想的に10GBありますが、中身はありません。

# qemu-img info /var/vm/ubuntu-test.img 
image: /var/vm/ubuntu-test2.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0

データが書き込まれれば、その分増えていくので経済的ですw

(注意)
qcow2で作ったHDDイメージでは、
ゲストOSからなぜかそのファイル容量しか認識せず、
使うことはできませんでした。

# qemu-img create -f qcow2 test.img 10G
Formatting 'test.img', fmt=qcow2 size=10737418240 encryption=off cluster_size=0
#
# ls -la
-rw-r--r-- 1 root  root  262144 2012-10-14 10:36 test.img

約256kbのファイルが作成されましたが、ゲストOSからも256kbしか見えませんでした。
いろいろみるとrawのほうが速いのでこれはこれで放置w

4)ゲストOSのインストール

VNCを使わないでゲストOSを入れてみます
さて、コマンド一発でやっちゃいます

ドメイン(ゲストOS)名・・・ubuntu-test
HDDイメージ・・・/var/vm/ubuntu-test.img
CPU・・・2つ
メモリ・・・512MB
ネットワーク・・・ブリッジ

# virt-install \
--name ubuntu-test \
--ram 512 \
--vcpus=2 \
--disk path=/var/vm/ubuntu-test.img \
--os-variant=virtio26 \
--network=bridge:br0 \
--location http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/ \
--nographics \
--extra-args='console=tty0 console=ttyS0,115200n8'

こんな感じ。

–os-variant
Linux系とかUnix系、Win系でオプションが違います。
準仮想化ドライバが使えるようになります。

–location
ネットワークインストールさせています。

–nographics
–extra-args=’console=tty0 console=ttyS0,115200n8′

これを書いておかないとコンソール接続できません。

あとは、ホストOSのコンソールにインストール画面がツラツラ出てきますので、
いつもどおりに、ゲストOSをインストール出来ます。

コンソールから、離れる場合は
Ctrl+](「コントロールキー」と「]」括弧)
で、一旦離れることができます。
再度、コンソールに接続する場合は、

# virsh
virsh # console <domain-name or ID>

で、接続出来ます。

あとは、
マニュアルを見て下さい・・・
いろいろ書かれています。

# man virt-install

Debian/Ubuntuだけなのかもしれませんが、
ゲストOSが停止出来ないので(destroyするしかない)、ゲストOSにACPIデーモンを入れてあげます。

# aptitude install acpid

これで、

virsh # shutdown <domain-name or ID>

でゲストOSが落とせます。

出来たXMLファイルは、

virsh # dumpxml ubuntu-test

<domain type='kvm'>
  <name>ubuntu-test</name>
  <uuid>a8e1ea50-ac50-f1d8-f57c-5f91c2323068</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>2</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' type='raw'/>
      <source file='/var/vm/ubuntu-test.img'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:73:ed:4b'/>
      <source bridge='br0'/>
      <target dev='vnet1'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memballoon>
  </devices>
</domain>

こんな感じ。
virtioが見えています。

ゲストOSを消すには

virsh # list --all
 Id Name                 State
----------------------------------
  3 ubuntu-test          running

動いているのが見えます。

削除してみる

virsh # undefine ubuntu-test
error: Failed to undefine domain ubuntu-test
error: Requested operation is not valid: cannot delete active domain

と怒られるので、

virsh # destroy ubuntu-test
Domain ubuntu-test destroyed

もしくはshutdownしてないとダメです。
今回は強制終了してやりますw

改めて

virsh # undefine ubuntu-test
Domain ubuntu-test has been undefined

これで消えました。

詳細は

virsh # help

でコマンド一覧がでますので、見てみて下さい。
いろんなことができますねぇ。。。

今回使った各バージョンは以下の通りです。

# virt-install --version
0.500.3
# kvm --version
QEMU PC emulator version 0.12.5 (qemu-kvm-0.12.5), Copyright (c) 2003-2008 Fabrice Bellard
# virsh --version
0.8.3

[tegaki]難しいなぁ。。。[/tegaki]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Enter code * Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.