Xen 3.3(Ubuntu 8.10でのLive Xenner編)

2008年10月30日にUbuntu 8.10(Intrepid Ibex)がリリースされました。
Ubuntu 8.10にはXenner(KVM上のXenエミュレータ)が付属しています(xenner 0.41)。
しかしそのXennerは期待通りの動作はしません。
しかしxenner 0.46をソースから組み込むことでUbuntu 8.10でXennerを利用できるようになります。

ここではUbuntu 8.10環境(ライブ環境、実環境)でXennerを手軽に体験する手順を紹介します。
尚、今回使用したCPUはIntel Core 2 Duo E6600です。
またホストOSはUbuntu 8.10 日本語 Remix CDのリブート不要なライブ実行環境とします(実メモリは3GB以上を推奨)。
※下記手順の中のviはvim等お好みのエディタで読み替えて下さい。

  1. Ubuntu 8.10でXennerを使用するポイント
    (1)Xennerはxenner 0.46のソースから構築します(簡単です)。
    Xennerをソースから構築して利用するためにUbuntu 8.10標準のシェルを制限付きdashからbashに変更します。
    (2)一部のファイルはFedora 9用initscriptsパッケージに含まれるファイルを使用します。
    (3)PVゲストはVMBuilderではなくQEMUで作成するJeOS 8.10(Ubuntu 8.10 Server)とします。
    ※ライブ環境のVMBuilderではlibc6パッケージ(libc6_2.8~20080505-0ubuntu7_i386.deb)のインストールでエラーとなります。
    (4)NetworkManagerサービスは有効のままで問題ありません。

  2. ホストOSの起動とrootでのログイン
    (1)Ubuntu 8.10 日本語 Remix CDからマシンをブートします。
    (2)以下のコマンドでrootにパスワードを設定します。
    $ sudo passwd root
    (3)[システム]メニューの[システム管理]−[ログイン画面]のログインの設定でrootでのGDMログインを許可します。
    (4)suコマンドでrootユーザに切り替えて/root/.profileを以下の内容で新規作成します。
    GDM_LANG=ja_JP.UTF-8
    LANG=ja_JP.UTF-8
    (5)以下のコマンドでデフォルトシェルをdashからbashに変更します(/bin/shは/bin/dashへのリンクになっています)。
    # ln -sf /bin/bash /bin/sh
    ※コンパイル中のnametable.shシンタクスエラー等の防止用に必要です(内部コマンド実行エラー回避用)。
    (6)一旦デフォルトユーザセッションをログアウトします。
    (7)rootでGDMログインします。

  3. Ubuntu 8.10標準のKVM/Xenner関連パッケージのインストール
    以下の手順でKVM/Xenner関連パッケージをインストールします(ダウンロードされるdeb群含めて約300MB消費します)。
    (xennerパッケージだけインストールしてもkvmは自動インストールされません)
    (1)universeリポジトリの有効化
    Xennerはuniverseリポジトリに属すため、まず[システム]メニューの[システム管理]−[ソフトウェアソース]を開きます。
    次に<コミュニティによりメンテナンスされるオープンソフトウェア(universe)>を有効化して再読み込みを実行します。
    (2)以下のコマンドでKVM環境を構築します。
    # apt-get update
    # apt-get install kvm ※bridge-utilsもインストールされます。
    ※インストール後、/dev/kvmが自動生成されます。
    # apt-get install libvirt-bin
    ※この時点でifconfigを実行して「vnet0」が表示されることを確認します。
    # apt-get install ubuntu-vm-builder ※python-vm-builderもインストールされます。
    # apt-get install qemu
    # apt-get install virt-viewer
    (3)以下のコマンドで仮想マシン管理環境を構築します。
    # apt-get install ubuntu-virt-server ※openssh-serverもインストールされます。
    # apt-get install ubuntu-virt-mgmt ※virt-managerもインストールされます。
    上記で[アプリケーション]メニューに[システムツール]−[仮想マシンマネジャ]が追加されます。
    (4)以下のコマンドでXennerをインストールしてそのサービスを停止します。
    # apt-get install xenner ※xen-utils-3.3もインストールされます。
    ※このxennerインストールでxennerサービスが自動起動されますがそのサービス起動時にエラー多発となります。
    # service xenner stop
    (ライブ環境の代りに実環境を使用する場合はsysv-rc-confを導入してxennerサービスの自動起動を停止しておきます)
    (5)以下のコマンドでシンボリックリンクを設定します。
    # ln -s /usr/lib/libxenctrl.so.3.2.0 /usr/lib/libxenctrl.so
    # ln -s /usr/lib/xenner/libxenctrl.so.3.0.0 /usr/lib/xenner/libxenctrl.so
    # ln -s /usr/lib/libxenguest.so.3.2.0 /usr/lib/libxenguest.so

  4. xenner 0.46の導入
    (1)Xennerのサイト経由で"xenner-0.46.tar.gz"(2008.9.26版:300,631バイト)をダウンロードします。
    ※Xennerのサイトはhttp://kraxel.fedorapeople.org/xenner/です。
    ※ダウンロード先:/root/xenner-0.46.tar.gz
    (2)コンパイルに必要なパッケージのインストール
    # apt-get install uuid-dev ※/usr/include/uuid/uuid.hが含まれています。
    # apt-get install zlib1g-dev
    # apt-get install libxen3-dev
    (3)コンパイルの実行
    # tar zxvf xenner-0.46.tar.gz
    # cd xenner-0.46
    # make config
    以下の内容が表示されればOKです。
    checking for libdir name ... lib
    checking for arch ... i686
    checking for io_setup in aio ... no
    checking for evtchn_port_or_error_t in /usr/include/xenctrl.h ... yes
    checking for xen/sys/evtchn.h ... yes

    Make.config written, edit if needed
    ※libaio-devをインストールしてあれば「checking for io_setup in aio ... yes」と表示されます。
    # vi GNUmakefile
    「CFLAGS += -Wno-pointer-arith」という行の前に「CFLAGS += -fno-stack-protector」という行を追加します。
    ※これは「undefined reference to `__stack_chk_fail'」エラーの防止対策です。
    # vi mk/Variables.mk
    「prefix ?= /usr/local」行を「prefix ?= /usr」に変更します。
    ※これは新しいxennerコマンドのインストール先を古いxennerコマンドの格納先に合わすための変更です。
    # make
    ※重大エラー発生時はそれを対処し、make clean;makeを実行します。
    # make install
    以下の内容が表示されます。
    install -d /usr/bin /usr/sbin /usr/lib/xenner /etc/rc.d/init.d
    install -s xenner xenner-stats /usr/bin
    install -s evtchnd blkbackd netbackd /usr/sbin
    install emu32.elf hvm32.elf hvm32.bin libxenctrl.so.3.2.0 /usr/lib/xenner
    ln -s libxenctrl.so.3.2.0 /usr/lib/xenner/libxenctrl.so.3.2
    install xenner.init /etc/rc.d/init.d/xenner
    ※libxenctrl.so.3.2は/usr/lib/libxenctrl.so.3.2(実ハイパバイザ接続)の方ではなく/usr/lib/xenner/libxenctrl.so.3.2が共有ライブラリとして使用されます。
    ※libxenctrl.so.3.2はxenstored, xenconsoled(後述), blkbackd, netbackdから使用されます。
    # cd
    # modprobe dm-mod ※デバイスマッパードライバのロード(kvmエントリを含む/proc/miscが生成されます)。

  5. Fedora 9用initscriptsパッケージに含まれるファイルの流用
    (1)http://ftp.riken.jp/Linux/fedora/releases/9/Fedora/i386/os/Packages/から以下のパッケージをダウンロードします。
    ・initscripts-8.76-1.i386.rpm ※2008.5.3版です。
    (/root/initscripts-8.76-1.i386.rpmとして保存)
    (2)以下のコマンドでinitscriptsパッケージをインストールすることなくそのパッケージに含まれるファイルを取り出します。
    # apt-get install rpm ※/usr/bin/rpm2cpioコマンドを含みます。
    # mkdir rpmwork
    # cd rpmwork
    # rpm2cpio ../initscripts-8.76-1.i386.rpm | cpio -id
    # cp etc/rc.d/init.d/functions /etc/rc.d/init.d/functions
    ※このfunctionsは/etc/rc.d/init.d/xennerスクリプトから呼ばれます。
    # vi /etc/rc.d/init.d/functions
    19行目の「[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="`/sbin/consoletype`"」の先頭に#を付けてコメント化します。
    # cp -a bin/usleep /bin ※usleepは/etc/rc.d/init.d/functionsで使用されます。
    # cd

  6. PVゲストの準備
    PVゲストはVMBuilderではなくQEMUで作成するJeOS 8.10(Ubuntu 8.10 Server)とします。
    (1)まず400MB固定サイズの仮想ディスク用ファイル(jeosu810.img)を以下のいずれかの方法で作成します。
    # mkdir jeosu810
    # qemu-img create -f raw jeosu810/jeosu810.img 400M
    or
    # dd if=/dev/zero of=jeosu810/jeosu810.img bs=1M count=400
    (2)Ubuntu 8.10 Serverのインストール用isoイメージ(ubuntu-8.10-server-i386.iso)を/root直下にダウンロードします。
    (3)以下のコマンドでQEMU環境でのJeOS 8.10(Ubuntu 8.10 Server)仮想ディスクを作成します(インストールの実行)。
    ※ここでのネットワークはTAP型ではなくユーザモードにしています。
    qemu -no-kqemu -m 128 -boot d -cdrom /root/ubuntu-8.10-server-i386.iso ¥
    -hda jeosu810/jeosu810.img -net nic -net user -k ja

    [JeOS 8.10のインストールポイント]

    (4)QEMUでの動作確認
    以下のコマンドでQEMU環境でのJeOS 8.10を起動します。
    qemu -no-kqemu -m 128 -hda jeosu810/jeosu810.img -net nic -net user -k ja

    QEMUでのJeOS 8.10実行例

    (5)仮想ディスクイメージからの起動ファイル取り出し操作の実行
    ここでは以下の操作を行います。
    # cd jeosu810
    # fdisk -lu jeosu810.img 
    設定する必要があります シリンダ数.
    あなたは特別機能メニューからこれを行なうことができます
    
    Disk jeosu810.img: 0 MB, 0 bytes
    255 heads, 63 sectors/track, 0 cylinders, total 0 sectors
    Units = セクタ数 of 1 * 512 = 512 bytes
    Disk identifier: 0x0003e783
    
     デバイス Boot      Start         End      Blocks   Id  System
    jeosu810.img1   *          63      803249      401593+  83  Linux
    # mount -o loop,offset=$((512*63)) jeosu810.img /mnt
    # cp -a /mnt/boot/vmlinuz-2.6.27-7-server .
    # cp -a /mnt/boot/initrd.img-2.6.27-7-server .
    # cat /mnt/boot/grub/menu.lst |grep "^kernel"|head -n 1
    kernel		/boot/vmlinuz-2.6.27-7-server root=UUID=f8524d7f-73ba-42e2-a6cd-96f028152f8d ro quiet splash 
    # umount /mnt
    # cd
    

  7. xennerサービスの起動
    以下のコマンドでxennerスクリプトを起動します。
    # /etc/rc.d/init.d/xenner start
    以下のように表示されます。
    Starting xenner daemons
      mount -t tmpfs vmcore /var/run/xenner                    [  OK  ]
      evtchnd                                                  [  OK  ]
      xenstored                                                [  OK  ]
      blkbackd                                                 [  OK  ]
      netbackd                                                 [  OK  ]
    touch: cannot touch `/var/lock/subsys/xenner': No such file or directory
    
    (xennerサービスの再起動は「/etc/rc.d/init.d/xenner restart」で行います)

  8. 任意:xennerサービススクリプトの変更と/dev/xvc0の作成
    Xennerの適用性拡張のためにxennerサービススクリプトの変更と/dev/xvc0の作成方法を紹介します。


  9. PVゲストの起動
    (1)PVゲストを起動するには以下のコマンドを実行します。
    ※今回の手順ではPYGRUBは使用できないため-kernel, -initrd, -append指定が必要です。
    ※更に-appendではUUID値やquiet指定は必須です。xvc0はPVゲストのシリアルデバイスです。
    /usr/bin/xenner -m 128 -name livexnr-jeosu810 -boot c \
    -kernel /root/jeosu810/vmlinuz-2.6.27-7-server \
    -initrd /root/jeosu810/initrd.img-2.6.27-7-server \
    -hda /root/jeosu810/jeosu810.img \
    -append "root=UUID=f8524d7f-73ba-42e2-a6cd-96f028152f8d ro quiet console=xvc0" \
    -network 52:54:00:12:34:56,vnet0

    (2)今回の手順では以下の内容が表示されたままの状態になりますが構いません。
    [emu] <1>irq route: vec 42 = evtchn 10, type ext, vcpu 0, io-apic pin 4, other

  10. DHCPで割り当てられるIPアドレスの確認
    PVゲストを起動するとxenner0というインタフェースがホスト側に自動生成されます(ifconfigで確認できます)。
    このXenner環境でのネットワークはTUN/TAPデバイスドライバを使用したNAT型になります。
    今回構築したXenner環境ではPVゲストのログインプロンプトが表示されません。
    したがってssh接続するためにホスト側からDHCPで割り当てられるIPアドレスを確認する必要があります。
    DHCPで割り当てられるIPアドレスは/var/lib/libvirt/dhcp-default.leasesに格納されます。
    下記はホスト側の/var/lib/libvirt/dhcp-default.leasesの内容例です。
    ※「[emu] <1>irq route: vec 42 = evtchn 10, type ext, vcpu 0, io-apic pin 4, other」で停止してから1分後に確認して下さい。
    1227431517 52:54:00:12:34:56 192.168.122.140 ubuntu *

  11. ssh接続・操作
    ホスト側からsshコマンド(例:ssh root@192.168.122.140)でPVゲストに接続して操作します。
    ssh接続・操作例

  12. 実環境でPVゲストを準備する方法
    QEMUでJeOSをインストールするよりもVMBuilderでJeOSをインストールする方が遙かに高速です。
    ここでは実環境でのVMBuilderでJeOSをインストールしてPVゲストを準備する手順例を紹介します。
    (1)まずパーティション構成定義ファイルを作成します。
    # vi vbpart.root500 ※ルートパーティション全体を500MBにする設定です。
    「root 500」という1行の内容にします。
    (2)以下のコマンドで0.5GBのKVMゲスト(JeOS 8.10)仮想ディスクを作成します。
    # vmbuilder kvm ubuntu --suite intrepid --flavour virtual --arch i386 -o --libvirt qemu:///system --part /root/vbpart.root500
    ・仮想マシン名はubuntuとなります。
    ・ユーザ名はubuntuでそのパスワードもubuntuとなります。
    vmbuilderでKVMゲストにインストールされるパッケージ一覧
    尚、/root/ubuntu-kvmディレクトリに以下の仮想ディスクファイルが生成されます。
    ・disk0.qcow2 ※qcow v2の形式です。
    (インストール過程では/tmpに固定サイズのdisk0.imgとして生成されたものが最終的にqcow2形式に変換されます)。
    (3)KVMゲストへのopenssh-serverのインストール
    [アプリケーション]メニューの[システムツール]−[仮想マシンマネジャ]を起動します。
    次にその仮想マシンマネジャに自動登録されたKVMゲスト(ubuntu仮想マシン)を起動します。
    ubuntu仮想マシンにubuntuユーザでログインして以下のコマンドを実行します。
    $ sudo apt-get update
    $ sudo apt-get install openssh-server ※openssh-serverパッケージのインストール
    $ sudo passwd root ※rootユーザのパスワードを設定します(sshでのログイン用)。
    $ sudo shutdown -h now

    (4)仮想ディスクの形式変換
    以下のコマンドでqcow v2形式のdisk0.qcow2からraw形式の仮想ディスクイメージ(disk0raw500mb.img)を作成します。
    # cd ubuntu-kvm
    # qemu-img convert disk0.qcow2 -O raw disk0raw500mb.img
    # cd
    (5)仮想ディスクイメージからの起動ファイル取り出し操作の実行
    ここでは以下の操作を行います。
    # cd ubuntu-kvm
    # fdisk -lu disk0raw500mb.img
    設定する必要があります シリンダ数.
    あなたは特別機能メニューからこれを行なうことができます
    
    Disk disk0raw500mb.img: 0 MB, 0 bytes
    4 heads, 32 sectors/track, 0 cylinders, total 0 sectors
    Units = セクタ数 of 1 * 512 = 512 bytes
    Disk identifier: 0x00076da8
    
          デバイス Boot      Start         End      Blocks   Id  System
    disk0raw500mb.img1              32      974591      487280   83  Linux
    領域 1 は異なった物理/論理終点になっています:
         物理=(1023, 3, 32) 論理=(7613, 3, 32)
    # mount -o loop,offset=$((512*32)) disk0raw500mb.img /mnt
    # cp -a /mnt/boot/vmlinuz-2.6.27-7-server .
    # cp -a /mnt/boot/initrd.img-2.6.27-7-server .
    # cat /mnt/boot/grub/menu.lst
    ここで「kernel /boot/vmlinuz-2.6.27-7-server root=UUID=57b966c4-9cad-4270-99f2-a97370b788a9 ro quiet splash」行の内容を別ファイルに保存。
    # umount /mnt
    # cd
    

    (6)PVゲストのxenner起動コマンド
    PVゲストの起動コマンドは以下の内容となります。
    /usr/bin/xenner -m 128 -name xnr-kvmjeos -boot c \
    -kernel /root/ubuntu-kvm/vmlinuz-2.6.27-7-server \
    -initrd /root/ubuntu-kvm/initrd.img-2.6.27-7-server \
    -hda /root/ubuntu-kvm/disk0raw500mb.img \
    -append "root=UUID=57b966c4-9cad-4270-99f2-a97370b788a9 ro quiet console=xvc0" \
    -network 52:54:00:3e:60:94,vnet0

    (7)PVゲストのQEMUでのXenner的利用
    Ubuntu 8.10付属のQEMUはncursesライブラリ対応パッチが適用されておりSDLウィンドウ無しの使い方ができます。
    qemu起動コマンドで「-curses」オプションを指定することで640x480のVGA的表示ができます。
    更に以下の手順でXenner的利用も可能となります。
    • TAPインタフェースの利用準備
      QEMUでのネットワークでTAPインタフェースを利用するために以下のスクリプトを用意します。
      # vi /etc/myqemu-ifup
      #!/bin/sh
      /sbin/ifconfig $1 0.0.0.0 promisc up
      /usr/sbin/brctl addif vnet0 $1
      # chmod 755 /etc/myqemu-ifup
    • ゲストのqemu起動
      以下のqemuコマンドでゲストを起動します。
      qemu -no-kqemu -m 128 -boot c \
      -kernel /root/ubuntu-kvm/vmlinuz-2.6.27-7-server \
      -initrd /root/ubuntu-kvm/initrd.img-2.6.27-7-server \
      -hda /root/ubuntu-kvm/disk0raw500mb.img \
      -append "root=UUID=57b966c4-9cad-4270-99f2-a97370b788a9 ro quiet" \
      -net nic,macaddr=52:54:00:3e:60:94 -net tap,ifname=tap0,script=/etc/myqemu-ifup \
      -curses \
      -localtime
    • DHCPで割り当てられるIPアドレスの確認
      vnet0を使用したQEMU環境ではDHCPで割り当てられるIPアドレスは/var/lib/libvirt/dhcp-default.leasesに格納されます。
    • ゲスト操作の様子


  13. 補足
    ホストOS(実環境)のPVゲストとして仮想フレームバッファを組み込んだUbuntu 8.04 Desktopも使用できます(詳細略)。
    以下のコマンドでvncviewerをインストールします。
    # apt-get install xvnc4viewer
    以下のコマンドでそのPVゲストを起動します。
    /usr/bin/xenner -m 512 -name xnr-ubt804 -boot c \
    -kernel /root/xenner/vmlinuz-2.6.24-19-xen \
    -initrd /root/xenner/initrd.img-2.6.24-19-xen \
    -hda /root/xenner/anyubt8041flat4gb.img \
    -append "root=UUID=906e293e-9e84-4f04-a559-908a75ac020d ro quiet console=xvc0" \
    -network 00:16:3e:6c:2e:95,vnet0
    /var/lib/libvirt/dhcp-default.leasesの内容でPVゲストのIPアドレスを確認します。
    # vncviewer PVゲストのIPアドレス:1 ※vncviewerによるPVゲストへの接続。

    更に仮想フレームバッファを組み込んだUbuntu 8.04 DesktopをUbuntu 8.10 Serverカーネルで起動することも可能です。
    まず、ホストOS側にlinux-image-2.6.27-7-serverパッケージを導入します。
    次にUbuntu 8.04 Desktopの仮想ディスクにUbuntu 8.10 Serverのカーネルモジュールをコピーし、以下のコマンドでPVゲストを起動します。
    /usr/bin/xenner -m 512 -name xnr-ubt804 -boot c \
    -kernel /boot/vmlinuz-2.6.27-7-server \
    -initrd /boot/initrd.img-2.6.27-7-server \
    -hda /root/xenner/anyubt8041flat4gb.img \
    -append "root=UUID=906e293e-9e84-4f04-a559-908a75ac020d ro quiet xencons=xvc0 console=xvc0" \
    -network 00:16:3e:6c:2e:95,vnet0
    /var/lib/libvirt/dhcp-default.leasesの内容でPVゲストのIPアドレスを確認します。
    # vncviewer PVゲストのIPアドレス:1 ※vncviewerによるPVゲストへの接続。
    vncviewerによるPVゲストの操作例