hnakamur’s blog

ものすごい勢いで忘れる私のために未整理でもいいからとりあえずメモ

2009-08-20

virt-cloneでゲストOSイメージをコピー

コピー実行

以下のコマンドで起動します。

$ sudo virt-clone --original vm10 --name vm11 --file vm11.qcow2 --mac 52:54:00:12:34:57

設定変更

その後vm11を起動してホスト名、MACアドレス、IPアドレスを変更します。

ホスト名変更

# vi /etc/sysconfig/network
HOSTNAME=vm11 # この行を修正

さらに今すぐ変更するためにコマンドも実行します。

# hostname vm11

一旦ログアウトしてログインし直すとプロンプトも変わりました。

MACアドレス、IPアドレスを変更

# service network stop
# cd /etc/sysconfig/network-scripts
# ls ifcfg-eth0*
ifcfg-eth0  ifcfg-eth0.bak
# rm ifcfg-eth0
# mv ifcfg-eth0.bak ifcfg-eth0
# vi ifcfg-eth0
HWADDR=52:54:00:12:34:57 # この行と
IPADDR=192.168.11.242    # この行を修正
# service network start

設定変更用のスクリプト

毎回手動で上記の設定変更を行うのも面倒なので、シェルスクリプトを書いてみました。ゲストOSに入れておきます。

#!/bin/bash
if [ $EUID -ne 0 ]; then
    echo "This script must be run by root." 1>&2
    exit 1
fi

if [ $# -ne 1 ]; then
    echo "Usage: chgvm hostname" 1>&2
    exit 1
fi

hostname=$1

case $hostname in
vm10)
    ipaddr=192.168.11.241
    macaddr=52:54:00:12:34:56
    ;;
vm11)
    ipaddr=192.168.11.242
    macaddr=52:54:00:12:34:57
    ;;
*)
    echo "Wrong hostname: $1" 1>&2
    exit 1
esac

hostname $hostname
sed -i -e "s/^HOSTNAME=.*/HOSTNAME=$hostname/" /etc/sysconfig/network

service network stop

cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF
# Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=$macaddr
NETMASK=255.255.255.0
IPADDR=$ipaddr
GATEWAY=192.168.11.1
TYPE=Ethernet
EOF

service network start

上記のvirt-cloneでコピーした後、以下のようにして変更します。

host$ sudo virsh start vm11
host$ sudo virsh console vm11
# ここでrootでログインして上記のシェルスクリプトを実行

virt-cloneした後はネットワークの設定がvm10と同一になっているので、まずvm11だけを起動してsshではなくconsoleからログインして、上記のシェルスクリプトで設定を変えるという手順をとる必要があります。

既存のKVMのゲストOSイメージをlibvirtに登録

手順

既存のKVMのゲストOSイメージをlibvirtに登録するのは、通常の手順としては用意されていないそうです。インストールに見せかけて即座に失敗するがエントリは作られるという方法で実現します。

ここでも--os-variant=centos5を試してみたのですがやはりエラーになってしまいました。

$ sudo virt-install -n vm10 -r 512 --vcpus=1 -f vm10.qcow2 -s 12 \
> --os-type linux --accelerate --network=bridge:br0 --hvm -c /dev/null --nographics -m 52:54:00:12:34:56 --os-variant=centos5
ERROR    OS variant 'centos5; does not exist in our dictionary for OS type 'linux'
Traceback (most recent call last):
  File "/usr/bin/virt-install", line 709, in 
    main()
  File "/usr/bin/virt-install", line 590, in main
    guest.set_os_variant(options.os_variant)
  File "/usr/lib/python2.6/dist-packages/virtinst/Guest.py", line 683, in set_os_variant
    {'var' : val, 'ty' : self._os_type}
ValueError: OS variant 'centos5; does not exist in our dictionary for OS type 'linux'

--os-variantをつけずに実行するとOKでした。

$ sudo virt-install -n vm10 -r 512 --vcpus=1 -f vm10.qcow2 -s 12 \
> --os-type linux --accelerate --network=bridge:br0 --hvm -c /dev/null --nographics -m 52:54:00:12:34:56

ここで別の端末でpsでプロセスIDを調べてkill -9します。

$ sudo virsh
virsh # destroy vm10
virsh # quit

-mで指定するMACアドレスは、一旦VMを起動してifconfigで調べておいたものです。virt-installの前にはシャットダウンしておきます。

man virt-installによるとXenの場合'00:16:3e'で始まる必要があり、QEMUの場合'54:52:00''52:54:00'で始まる必要があるそうです(2011-11-25追記: MACアドレスの値が間違っていました。タイプではなくコピペすべき>自分。←実はマニュアルが修正されていたようです。Bug 620838 – mistype in virt-install manpage - 54:52 should be 52:54)。 -mを指定しないとvirt-installがランダムに生成した値になりました(確か'00:16:3e'で始まっていました)。

この後確認すると/etc/libvirt/qemu/vm10.xmlという設定ファイルが作られていました。

参考にしたページ

KVMのゲストOSのネットワークをブリッジにする

Networking - KVMを参考にしました。

sudo kvm -hda vm10.qcow2 -m 256 -curses -net nic,00:23:7d:29:e1:02 -net tap,script=/etc/kvm/kvm-ifup

メモ

  • 00:23:7d:29:e1:02はランダムなMACアドレスです。ifconfigで表示された他のアドレスを変更してでっちあげました。
  • tunctlは無くてもいけました。ちなみにuml-utilitiesパッケージに含まれているらしい。
$ sudo aptitude show uml-utilities
Package: uml-utilities
State: not installed
Version: 20070815-1.1ubuntu2
Priority: extra
Section: universe/otherosfs
Maintainer: Ubuntu MOTU Developers 
Uncompressed Size: 336k
Depends: adduser, libc6 (>= 2.4), libfuse2 (>= 2.6), libncurses5 (>= 5.6+20071006-3), libreadline5 (>= 5.2), lsb-base (>= 3.0-10)
Suggests: user-mode-linux
Description: User-mode Linux (utility programs)
 User-mode Linux is a port of the Linux kernel to its own system call interface.  It provides a kind of virtual machine, which runs
 Linux as a user process under another Linux kernel.  This is useful for kernel development, sandboxing, jailing, experimentation,
 and many other things. 
 
 This package contains userspace utilities for use with User-mode Linux, including uml_mconsole, uml_moo, uml_switch, uml_net and
 tunctl.

Ubuntuでネットワークブリッジを作成

KVM Networking - Community Ubuntu Documentationを参考にしました。

bridge-utilsパッケージをインストールします。

$ sudo aptitude install bridge-utils

/etc/network/interfacesを以下のように書き換えます。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
  address 192.168.11.102
  netmask 255.255.255.0
  gateway 192.168.11.1
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0
  bridge_maxwait 0

で以下のコマンドを実行します。

$ sudo /etc/init.d/networking restart

libvirt: Wiki: Networkingによると/etc/sysctl.confも変更するらしいです。

$ sudo vi /etc/sysctl.conf

追加内容

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

以下のコマンドを実行して変更を反映。

$ sudo sysctl -p /etc/sysctl.conf

KVMでCentOSをテキストモードでインストールする

KVMのインストール

基本的にはKVM Installation - Community Ubuntu Documentationに従って実行しました。

$ sudo apt-get install kvm libvirt-bin python-vm-builder qemu bridge-utils
$ sudo adduser $USER libvirtd

ゲストOS環境作成

以下のページを参考にしました。

うまく行かなかった手順

$ sudo aptitude install python-virtinst
$ qemu-img create -f qcow2 vm10.qcow2 10G
$ sudo virt-install --connect qemu:///system -n vm10 -r 512 --vcpus=1 -f vm10.qcow2 -s 12 \
  -c CentOS-5.3-i386-bin-DVD.iso --vnc --noautoconsole --os-type linux \
  --accelerate --network=bridge:br0 --hvm

シングルコアなのでvcpusは1に。上記の2つめの記事に従って--os-variant=は指定しない(man virt-installを見ると--os-variant=centos5でよさそうなのだがやってみるとうまくいかない)。インストールは始まるが、途中で"800 x 600 Graphic mode"と表示されてしまいだめだった。

さらに--nographicsオプションをつけて実行してみたが、途中で行頭に?が表示された状態でにっちもさっちもいかなくなった。

Shadows of epiphany » Blog Archive » How to run KVM without Xというページも見つけたがこれは試していない。

うまく行った手順

ググってみるとvirt-installerは使わずに直接KVMを使えばいけるらしい。あと、qemuとkvmはコマンドレベルで互換性があり、qemuと書く代わりにkvmと書けば動くそうだ。試したらそのままいけました。QemuやKVMのドキュメントやmanを見て以下のようにした。

$ qemu-img create -f qcow2 vm10.qcow2 10G
$ sudo kvm -hda vm10.qcow2 -cdrom CentOS-5.3-i386-bin-DVD.iso -boot d -m 256 -curses

大切なのは最初に"640 x 480 Graphic mode"と表示された時。見えないがこのタイミングでCentOS5インストール - CentOSで自宅サーバー構築の1枚目のスクリーンショットの画面が表示されている。単に<ENTER>を押すとGUIインストールが始まってしまうので、linux text<ENTER>と入力すること。

試した環境

ハードウェア
HP ML115G5
CPU
AMD Athlon 1640B (2.7GHz、L2 512KB、45W、AM2)
RAM
8GB
ホストOS
Ubuntu 9.04 server i386
$ uname -a
Linux sunshine12 2.6.28-15-server #49-Ubuntu SMP Tue Aug 18 19:30:06 UTC 2009 i686 GNU/Linux
$ dpkg -l | egrep '(kvm|libvirt-bin|python-vm-builder|qemu|bridge-utils)'
ii  bridge-utils                              1.4-5                             Utilities for configuring the Linux Ethernet
ii  kvm                                       1:84+dfsg-0ubuntu12.3             Full virtualization on i386 and amd64 hardwa
ii  libvirt-bin                               0.6.1-0ubuntu5.1                  the programs for the libvirt library
ii  python-vm-builder                         0.10-0ubuntu2                     VM builder
ii  qemu                                      0.10.0-1ubuntu1                   fast processor emulator

ブログ アーカイブ