hnakamur’s blog

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

ラベル libvirt の投稿を表示しています。 すべての投稿を表示
ラベル libvirt の投稿を表示しています。 すべての投稿を表示

2011-11-21

virt-cloneでコピー後eth0がeth1などに変わってしまうのを戻す

参考:Banym's Blog - Change network device name from eth1 back to eth0.

/etc/udev/rules.d/70-persistent-net.rulesを編集。NAME="eth0"の行のMACアドレスを書き換える。NAME="eth1"など使わない行は削除。
# PCI device 0x1af4:0x1000 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:2a:7a:d9", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

/etc/sysconfig/network-scripts/ifcfg-eth0の内容を適切に変更して、それ以外のifcfg-eth?は削除。その後ゲストを再起動。

2010-12-16

KVMのゲストのHDDをマウントしてLive CDからブート

Live CDの入手と配備

CentOS-5.5-x86_64-LiveCD.isoをCentOSミラーサイトからダウンロードして/var/lib/libvirt/images/に置きます(場所はどこでも可)。

KVMでゲストを起動

libvirtで起動しようと試みましたが失敗(後述)したので、qemu-kvmコマンドで起動します。
/usr/libexec/qemu-kvm -m 1024 -smp 1 -boot d \
-drive file=/var/lib/libvirt/images/vm1.img,if=ide \
-cdrom /var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso \
-vnc localhost:1

この後UltraVNCなどのvncviewerで接続します。

(失敗メモ) libvirtでCD-ROMからブートを試みるも失敗


/etc/libvirt/qemu/vm1.xmlを以下のように書き換えます。
<domain type='kvm'>
  <name>ora1</name>
  <uuid>97f129e6-9b87-9998-0247-d573d774be81</uuid>
  <memory>2097152</memory>
  <currentMemory>2097152</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='x86_64' machine='rhel5.4.0'>hvm</type>
    <boot dev='cdrom'/>
    <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/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' cache='none'/>
      <source file='/var/lib/libvirt/images/vm1.img'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <mac address='54:52:00:54:37:df'/>
      <source network='default'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5901' autoport='no'/>
  </devices>
</domain>
変更内容は
<boot dev='cdrom'/>

<disk type='file' device='cdrom'>
      <driver name='qemu'/>
      <source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
の追加です。


上記の定義を反映。
# virsh define /etc/libvirt/qemu/vm1.xml

起動してコンソールに接続
# virsh start vm1; virsh console vm1

gparted-live-0.7.1-1.isoもダウンロードして/var/lib/libvirt/images/に配置し、
<source file='/var/lib/libvirt/images/CentOS-5.5-x86_64-LiveCD.iso'/>

<source file='/var/lib/libvirt/images/gparted-live-0.7.1-1.iso'/>
に変えてみても同じでした。

おそらくCentOS-5.5-x86_64-LiveCD.isoとgparted-live-0.7.1-1.isoはシリアルコンソールで繋がるように作られていないということなのかと思います。

2009-09-29

virsh consoleを使うためにUbuntuのシリアルコンソール設定

ゲストOSのシリアルコンソール設定

SerialConsoleHowto - Community Ubuntu Documentationを参考にしました。ゲストOSを起動してシリアルコンソールを設定します。

$ sudo vi /etc/event.d/ttyS0
以下の内容で新規にファイルを作成します。
# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5

stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

respawn
exec /sbin/getty 115200 ttyS0
grubの設定を行います。
$ sudo vi /boot/grub/menu.lst

titleの前にserialとterminalの行を追加し、kernelパラメータにconsoleのパラメータを2つ追加します。

...
serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1 # ←この行を追加
terminal --timeout=5 serial console # ←この行を追加
title           Ubuntu 9.04, kernel 2.6.28-15-serveruuid            0ede7815-2475-4811-83b6-1970ab826e32
kernel          /boot/vmlinuz-2.6.28-15-server root=UUID=0ede7815-2475-4811-83b6
-1970ab826e32 ro quiet splash console=tty0 console=ttyS0,115200n8 # ←consoleパラメータを2つ追加
initrd          /boot/initrd.img-2.6.28-15-server

title           Ubuntu 9.04, kernel 2.6.28-15-server (recovery mode)uuid            0ede7815-2475-4811-83b6-1970ab826e32
kernel          /boot/vmlinuz-2.6.28-15-server root=UUID=0ede7815-2475-4811-83b6
-1970ab826e32 ro  single
initrd          /boot/initrd.img-2.6.28-15-server
...

ホストOS側のlibvirtのドメイン設定

DOMの設定ファイルにConsoles, serial & parallel devicesのconsoleタグが入っていなければゲストOSの設定を変更。

$ sudo vi /etc/libvirt/qemu/ubuntu.xml

以下のようにconsoleタグを追加。

...
    <console type='pty'>
      <source path='/dev/pts/4'/>
      <target port='0'/>
    </console>
  </devices>
</domain>

ゲストOSを止めた状態で反映。

$ sudo virsh define /etc/libvirt/qemu/ubuntu.xml

KVM/libvirtでUbuntu 9.04 server 64bit版サーバーをホストOS、32bit版サーバーをゲストOSとする環境構築

背景

Javaで4GB以上の最大メモリを使いたくてUbuntu 9.04 server 64bit版上で64bit版のJavaを使用していたのですが、32bit版でしか動かないバイナリのみ提供のとあるプログラムを動かす必要が出てきました。

Ubuntu Linux 64bit版で32bit向けバイナリを使えるようにする | おいぬま日報を参考にia32-libsを試してみましたが、いくつかライブラリが自動でインストールされたものの、お目当ての実行ファイルは結局動作せず。

武藤さんのdebian-amd64のページを見るとchrootでできるみたいですが、chrootがよくわかってない私がやるとはまりそうなのでこの道は止めました。

ということで、Ubuntu 9.04 server 64bit版をホストOSとし、Ubuntu 9.04 server 32bit版をゲストOSとする環境構築を行いました。

Ubuntu 9.04 Server 32bit版をゲストOSとしてインストール

うまくいかなかった手順

当初はKVMでCentOSをテキストモードでインストールすると同様にUbuntu 9.04 Server 32bit版のCD-ROM ISOイメージからインストールしようとしました。しかし、"640 x 480 Graphic mode"からリターンキーで進んでも一旦コンソールになったあと再び"640 x 480 Graphic mode"になってしまいます。手元の環境でVirtualBoxでインストールしながら同じようにリターンキーを押していくということも試しましたが、進んでるかどうかさっぱりわからないので止めました。

作業環境からホストOSにvnc viewerでアクセスできるようなネットワーク構成を組んでいればそれでもよかったのですが、このときは外出先からアクセスしていてsshとhttp/httpsでしかアクセスできないのでこの手は使えませんでした。

ubuntu-vm-builderを使うと簡単にインストールできます(でも結局vncは必要)

ubuntu-vm-builderでのゲストOSインストール

調べてみるとKVM Create Guests - Community Ubuntu Documentationでubuntu-vm-builderという便利なものが紹介されていました。これだと自動でインストールしてくれます。

$ sudo aptitude install ubuntu-vm-builder
$ sudo ubuntu-vm-builder --addpkg vim openssh-server --libvirt qemu:///system

デフォルトで作られるアカウントのID/パスワードはubuntu/ubuntuでした。

--libvertオプションはlibvirtの管理下に登録するために必要とのこと。

--addpkgでopenssh-serverを指定しておくと最初からsshサーバーがインストールされて、ゲストOSを起動後ホストOSからsshでアクセスできるとのことなんですが、なんかうまくいかなかったようです。で、この作業をしていたときは家だったのでゲストOS起動後、LAN経由でvnc viewerでアクセスできたので、なんとかなりました。ただし、vncサーバーがデフォルトではlocalhostからしかアクセスできないようになっているので設定変更と反映が必要でした。

ゲストOSのIPアドレスを固定するようにホストOSのDHCPを設定

まずゲストOSの設定ファイルを見て

$ sudo vi /etc/libvirt/qemu/ubuntu.xml

MACアドレスを確認します。

    ...
    <interface type='network'>
      <mac address='52:54:00:52:42:d9'/>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
    ...

DHCPの設定を変更します。

$ sudo vi /etc/libvirt/qemu/networks/default.xml

適当に自動割り当てのrangeを狭くして、MACアドレスを指定した行を追加します。

<network>
  <name>default</name>
  <uuid>ae240447-f8ad-b557-a039-4e8bae931331</uuid>
  <forward mode='nat'/>
  <bridge name='virbr1' stp='on' forwardDelay='0' />
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.100' end='192.168.122.254' />
      <host mac='52:54:00:52:42:d9' name='ubuntu' ip='192.168.122.11' />
    </dhcp>
  </ip>
</network>

保存したらdnsmasqを再起動します。

まずdnsmasqのPIDを調べてkillします。KVM以外でdnsmasqを動かしていなければ以下のコマンドで調べてそのままkillできます。

$ sudo kill `ps --no-heading -o pid -C dnsmasq`

ネットワーク設定をlibvirtに反映します。

$ sudo virsh net-define /etc/libvirt/qemu/networks/default.xml

ゲストOS上のvncサーバーにホストOS以外のマシンからアクセスできるようにする設定

まず現状どうなっているかの確認はpsでkvmのコマンドラインを見ます。

$ ps ww -C kvm

ホストOS上で以下の設定を行います。

$ sudo vi /etc/libvirt/qemu/ubuntu.xml

このファイルについてはlibvirt: Domain XML formatに説明があります。

以下のように<devices>のセクションにvncのエントリを追加し、listen='0.0.0.0'を追加します。

    ...
    <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'/>
  </devices>
</domain>

編集したら以下のコマンドで反映します(ゲストOSは予め止めておきます)

$ sudo virsh define /etc/libvirt/qemu/ubuntu.xml

なおGraphical framebuffersの説明によるとport='-1'という書き方は古くてautoport='yes'と書けとのことでしたが、virsh defineで反映すると勝手にport='-1'も追加されていました。

再度以下のコマンドを実行して

$ ps ww -C kvm

-vncのパラメータが-vnc 0.0.0.0:0となっていればOKです。

ホストOSと同一LANにある別のマシンからゲストOSにアクセス

上の-vncのパラメータのコロンの後がディスプレイ番号(ポート番号はディスプレイ番号+5900)なので、そこにアクセスします。

MacBook/Snow LeopardからChicken of the VNC | Get Chicken of the VNC at SourceForge.netを使ってアクセスしました。

ゲストOS上にsshサーバーをインストール

vnc viewerでつなぐとコンソールのログインプロンプトが出ているのでログインしてopenssh-severをインストールします。

$ sudo aptitude install openssh-server

2009-08-27

NAT構成ネットワークでkeepalivedによるロードバランサの実験

libvirtでNAT構成にするための設定ApacheのServer-Side Includesの設定の準備ができたところで、いよいよロードバランサの実験です。

ホストOS上の/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface br0
    virtual_router_id 50
    priority 200
    advert_int 1
    garp_master_delay 10
    virtual_ipaddress {
        192.168.11.100
    }
}

virtual_server 192.168.11.100 80 {
    delay_loop 1
    lvs_sched rr
    lvs_method NAT #DR
    protocol TCP
    real_server 192.168.122.11 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
        }
    }
    real_server 192.168.122.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
        }
    }
}

実験用スクリプト

$ while :; do curl http://192.168.11.100; env LANG=C date; sleep 1; done

実行結果はこんな感じ。

Hello, this is vm11.
Thu Aug 27 02:47:03 JST 2009
Hello, this is vm10.
Thu Aug 27 02:47:05 JST 2009
Hello, this is vm11.
Thu Aug 27 02:47:06 JST 2009
Hello, this is vm10.
...(略)...

vm10でhttpdを止めてみるとvm11のみにいくようになりました。その前に

curl: (52) Empty reply from server

が1回出るときと1回も出ずにスムーズにvm11に切り替わるときがありました。

その後、vm10でhttpdを再開してみたのですが、引き続きvm11にしかいきません。ホストOSで

# /etc/init.d/keepalived reload

と実行してみると再びvm10とvm11に交互に投げるようになりました。inhibit_on_failureというオプションがあるぐらいなので指定しない場合は復活するのかと思っていたのですが。これはこういうものなのかは今後調査したいと思います。

2009-08-26

libvirtでNAT構成にするための設定

ブリッジを止めてNATに切り替えたわけ

KVMのゲストOSのネットワークをブリッジにするの環境でkeepalivedでのVRRPの実験は成功したのですが、DSR構成でのロードバランサの実験がどうもうまくいきませんでした。仮想環境でのネットワーク構築がよくわかっていない私がいきなり上級者編のDSRにチャレンジというのに無理があったということで、まずはNAT構成でチャレンジすることにしてみました。

libvirtでNAT構成

libvirt: Wiki: Networkingを参考にしました。また、今まではゲストOSを実運用に近い設定にしようとして固定IPにしていましたが、virt-cloneでゲストOSイメージをコピーしたあとにゲストOS毎に設定を変えるのが面倒なので、今回から極力ゲストOS毎の設定変更箇所を少なくするという方針に変更しました。

試行錯誤しながらホストOSでのlibvirtの設定変更を変更したので、手順は無しで設定ファイルだけメモしておきます。

ホストOS (Ubuntu) の設定

/etc/libvirt/qemu/networks/default.xml

<network>
  <name>default</name>
  <uuid>212ea219-055f-bd26-1c76-52817e607642</uuid>
  <bridge name="virbr%d" />
  <forward mode="nat"/>
  <ip address="192.168.122.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.122.100" end="192.168.122.254" />
      <host mac="52:54:00:12:34:56" name="vm10" ip="192.168.122.11" />
      <host mac="52:54:00:12:34:57" name="vm11" ip="192.168.122.12" />
    </dhcp>
  </ip>
</network>

/etc/libvirt/qemu/vm10.xml

<domain type='kvm'>
  <name>vm10</name>
  <uuid>35e92166-78c8-641f-15d7-5a30af377d55</uuid>
  <memory>524288</memory>
  <currentMemory>524288</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc'>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'>
      <source file='/home/hnakamur/kvm_work/vm10.qcow2'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='file' device='cdrom'>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='network'>
      <mac address='52:54:00:12:34:56'/>
      <source network='default'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
  </devices>
</domain>

/etc/sysctl.confでは以下の設定変更をしてsysctl -pで読み込みました。

net.ipv4.ip_forward=1

/etc/resolv.conf

nameserver 192.168.122.1
nameserver 192.168.11.1

ゲストOS (CentOS) の設定

/etc/sysconfig/network (ホスト名はDHCPで設定するので空にしました)

NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=

/etc/resolv.conf

nameserver 192.168.122.1

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
DNS1=192.168.122.1

(追記) その後試していると/etc/resolv.confの設定が消されてしまってeth0が上がらないことがありました。/etc/sysconfig/network-scripts/ifcfg-eth0にDNS1=で指定しておくとOKでした。これがまっとうなのかはわかりませんが、とりあえずこれで。

(2009-08-27追記) CentOSのDeployment Guideの14.2. Interface Configuration Filesに説明がありました。PEERDNSがyesの場合DNS1とDNS2に指定した値で/etc/resolv.confが修正されます。dhcpの場合PEERDNSのデフォルト値はyesです。

ホストOSでのlibvirtの設定の試行錯誤

手順として整理したものは無いのですが、どんな試行錯誤をしたかのメモを書いておきます。

/etc/libvirt/qemu/networks/default.xmlの変更と反映での試行錯誤

libvirt: Wiki: Networkingを参考にしたのですが、結局のところvirshを起動してhelpコマンドで出てくるネット関連のコマンド(net-*)を手当たり次第に試して変更しました。net-editで変更してみたり、net-destroyやnet-undefineで消してからnet-createで作り直したり。net-destroyかnet-undefineを実行したときは、/etc/libvirt/qemu/networks/default.xmlが消えてしまって慌てたりしました。事前にバックアップをとっておいたほうがいいです。

また途中でnet-editを実行したときに

error: invalid network pointer in no network with matching uuid
というエラーが出て困りました。どうやら、/etc/libvirt/qemu/networks/default.xmlを直接エディタで変更したのがよくなかったようで、常にnet-editで編集するようにしておいたほうがいいみたいです。あと、確か元々の/etc/libvirt/qemu/networks/default.xmlにはuuidの要素は無かったのが、net-editで見たときは入っていました。/etc/libvirt/qemu/networks/default.xmlはテンプレートみたいなものでvmを作るときにそこからコピーされるのかとも思ったのですが、net-editで編集した結果は/etc/libvirt/qemu/networks/default.xmlに反映されるようです。そのときにどこか別の場所にも反映されているのかな、まだよくわかってないです。

ゲストOSでのlibvirt組み込みのDNSサーバーdnsmasqの設定変更の試行錯誤

libvirt: Wiki: Networking

If you are already running dnsmasq on your machine, please see libvirtd and dnsmasq.
という説明があります。libvirt: Wiki: Libvirtd and dnsmasqを読んで、psで見てみるとdnsmasqのプロセスがありますが/etc/dnsmasq.confはありませんでした。というわけでこれはlibvirtが起動したもののようです。ただ、/etc/init.d/dnsmasqとかはないんですよね。Bug #231060 in libvirt (Ubuntu): “packages dnsmasq and libvirt-bin conflict with each other”とかが関係ありそうですが、とりあえずスルーしました。

libvirtのネットワークをうまく設定できた今の状態ではpsで見るとこんな感じです。

# ps auxww|grep dnsmasq
root      5077  0.0  0.0   2076   564 pts/7    S+   00:52   0:00 grep dnsmasq
nobody   31008  0.0  0.0   2388   716 ?        S    Aug26   0:00 dnsmasq --strict-order
 --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file=  
--listen-address 192.168.122.1 --except-interface lo --dhcp-range 192.168.122.100,192.168.122.254
 --dhcp-host 52:54:00:12:34:56,vm10,192.168.122.11 --dhcp-host 52:54:00:12:34:57,vm11,192.168.122.12

こうなるまでにいろいろ試行錯誤しました。/etc/libvirt/qemu/networks/default.xmlの<dhcp>タグの設定に対応していることはわかったのですが、viやvirsh net-editで変更するだけでは反映されないようなので、killして上げ直そうとしたのですが起動方法をまた試行錯誤するはめに。どうやらnet-startのときに同時にあがるのかと思いきや

virsh# net-start default
error: Failed to start network default
error: internal error network is already active
というエラーになったり。1

今、再度試してみたところ以下の手順でとりあえず変更できることを確認しました。

virsh # net-destroy default

ここでviで/etc/libvirt/qemu/networks/default.xmlを編集

virsh # net-create /etc/libvirt/qemu/networks/default.xml
Network default created from /etc/libvirt/qemu/networks/default.xml

net-createを実行した時点でdnsmasqのプロセスが上がっていました。

さらに一覧を確認して自動実行する設定にします。

virsh # net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     no
virsh # net-autostart default
error: failed to mark network default as autostarted
error: Failed to create symlink '/etc/libvirt/qemu/networks/autostart/default.xml' 
to '/etc/libvirt/qemu/networks/default.xml': File exists

別端末にて/etc/libvirt/qemu/networks/autostart/default.xmlというシンボリックリンクを削除します。

# ls -l /etc/libvirt/qemu/networks/autostart/default.xml 
lrwxrwxrwx 1 root root 38 Aug 26 20:43 /etc/libvirt/qemu/networks/autostart/default.xml -> /etc/libvirt/qemu/networks/default.xml
# rm /etc/libvirt/qemu/networks/autostart/default.xml

これでようやく設定変更できた状態でdnsmasqが起動できたと思ったら今度は、ゲストOSの変更前のIPアドレスがキャッシュされて残っていたようでdigコマンドで引いても古い値を返されてしまいました。そこでkillして

# dnsmasq --clear-on-reload

を実行した後再度killしてvirshでnet-destroy、net-createとして再起動などとしてなんとかdigで新しい設定のIPアドレスが返されるところまでこぎつけました。このへんの手順も試行錯誤してたまたま見つけただけで、まっとうな手順はまだよくわかっていません。が、とりあえず目的は達成できたのでよしということで。

DHCPの恩恵

ホストOSもゲストOSも192.168.122.1のdnsmasqを使うようにしたので、/etc/hostsからvm10とvm11のエントリを削除できました。DHCPといっても、/etc/libvirt/qemu/networks/default.xmlの<host>タグでMACアドレスに対してホスト名とIPアドレスを指定しているので、各vmのIPアドレスが変動することはありません。

2009-09-29追記

  1. これはdnsmasqのプロセスが残っていたからでした。単にpsでdnsmasqのPIDを調べてkillした後、net-defineコマンドでxmlの内容を反映し、net-startコマンドでdnsmasqを起動します。ちなみに、net-destroyは定義ファイルを削除するのでやりすぎです。

2010-09-19追記

定義ファイルごと削除されるのはnet-undefineを実行したときです。net-destroyはdnsmasqのプロセスを止めます。

2010-12-16追記

DHCPで運用しているとゲストを上げたまま一日ぐらいたつとゲストのIPアドレスが消失してネットワークが繋がらなくなるという現象を何度か体験しました。仕方が無いのでDHCPはやめて静的にIPアドレスを指定する運用に切り替えました。

2009-08-21

virsh consoleを使うためにCentOSのシリアル端末を設定

CentOSのシリアル端末を設定

Setting up a serial console | HowtoForge - Linux Howtos and Tutorialsを参考にしました。

# vi /etc/inittab
S0:12345:respawn:/sbin/agetty ttyS0 115200 # この行を追加
1:2345:respawn:/sbin/mingetty tty1
# vi /etc/grub.conf
serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1 # この行を追加
terminal --timeout=5 serial console # この行を追加
title CentOS (2.6.18-128.4.1.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-128.4.1.el5 ro root=/dev/VolGroup00/LogVol00 console=tty0 console=ttyS0,115200n8 # console以降を追加
        initrd /initrd-2.6.18-128.4.1.el5.img

再起動すればシリアル端末が使えるようになります。

virsh consoleからの利用手順

まずゲストOSを起動します。

$ sudo virsh start vm10

ゲストOSが事前に起動済みの状態で、シリアル端末に接続します。

$ sudo virsh console vm10

シリアル端末から切断する方法はわかりませんでした。screenを使っていれば、別端末に切り替えてvirshのPIDを調べてkillするか、端末を切り替えずにscreenのkillコマンドでウィンドウごとkillすることができます。screenってほんと便利ですね。

kenyaさんからのコメントでCtrl+](右角括弧)で抜けられることを教わりました。これは便利です。

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という設定ファイルが作られていました。

参考にしたページ

ブログ アーカイブ