hnakamur’s blog

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

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

ブログ アーカイブ