背景
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