Xen 3.3.1(Fedora 10のDomain0化)


2008年11月25日にFedora 10 正式版がリリースされました。
Fedora 10 正式版でもFedora 9同様にDomain0としての動作は未サポートのままです。
つまりFedora 9同様にFedora 10付属のXen 3.3ベースのXenハイパバイザーをブートできません。
※そのハイパバイザーをブートすると「elf_init: not an ELF binary」エラーになります。
しかしFedora 11 Beta用xen-3.3.1-11.fc11.src.rpmを利用してFedora 10にXen 3.3.1環境を構築するとDomain0として実行可能となります。
ここで構築するXen 3.3.1環境用カーネルは「通常カーネル兼PVゲストカーネル兼Domain0カーネル」という便利なものです。

[補足]
(1)カーネル2.6.23からparavirt-opsという仕組みが追加されました。
(2)paravirt-opsとは通常のvmlinuzカーネル(bzImage形式)をPVゲストカーネルとしても動作させる仕組みを指します。
(3)Fedora 11のxen-3.3.1-11.fc11.src.rpmにはparavirt-ops対応のDomain0カーネルをサポートする機能が追加されています。
(4)paravirt-ops対応のDomain0カーネルとは「通常カーネル兼PVゲストカーネル兼Domain0カーネル」を指します。
(5)Fedora 11が正式リリースされるまでの間はFedora 10環境にparavirt-ops対応のDomain0カーネルを導入するのが無難です。
(6)paravirt-ops対応のDomain0カーネルを構築することで「Xen専用カーネルの不要化」が実現可能となります。

ここではFedora 10をクリーンインストールした状態でXen 3.3.1環境を構築する手順とPVゲストの実行例を紹介します。
尚、今回使用したCPUはCore 2 Duo E6600です。
またここで紹介するホストOS, PVゲスト共にすべて32ビット版OSです。


  1. ホストOS(Fedora 10)のインストール
    ホストOS(Fedora 10)のインストール手順詳細は省略しますが今回のインストール条件は以下の通りです。
    (1)ホスト名:fedora10.mydomain.net
    (2)パーテョション設定
    ・ルートパーティション(ext3):/dev/sda3(約100GB)
    ・swapパーティション:なし
    (3)ブートローダの作成場所:MBR(/dev/sda)
    (4)インストールするソフトウェアセット
    ・オフィスとプロダクティビティ
    ・ソフトウェア開発
    ・Webサーバ
    ・カスタマイズで追加するソフトウェア;
    サーバ系の「サーバ設定ツール」
    ベースシステム系の「システムツール」(「仮想化」は選択しません)

  2. ホストOS(Fedora 10)のインストール後の設定
    (1)GDMでのrootログインの可能化設定
    具体的には一般ユーザでログインして以下のコマンドを実行します。
    $ su - root
    # vi /etc/pam.d/gdm
    「auth required pam_succeed_if.so user != root quiet」行を「auth required pam_succeed_if.so」に変更します。
    この後、rootでログインします。
    (2)NetworkManagerサービスは有効のままとします(networkサービスは無効のままとします)。
    (3)テスト用のためファイアウォールはここでは便宜上無効としました。
    (4)SELinux機能を無効にします。
    # vi /etc/sysconfig/selinux
    「SELINUX=enforcing」を「SELINUX=disabled」に変更します。
    (5)システム再起動

  3. Xen 3.3.1環境の構築
    ここでは以下の手順でFedora 11 Beta付属のXen 3.3.1を導入します。
    (1)パッケージの追加インストール
    # yum install bridge-utils SDL
    # yum install transfig texi2html libaio-devel dev86 glibc-devel.i386
    # yum install qemu-img
    ※qemu-imgは後でrpmbuildで作成するXen関連パッケージ(xen-runtime)のインストール時に必要となります。
    (2)Fedora 11のダウンロードサイトからxen-3.3.1-11.fc11.src.rpmを取得します(/root直下に保存)。
    (3)rpmbuild --rebuildを使用しないXen 3.3.1導入
    xen-3.3.1-11.fc11.src.rpmはgrub-0.97.tar.gzを含みます。
    「rpmbuild --rebuild xen-3.3.1-11.fc11.src.rpm」を実行すると「grub-0.97.tar.gz;4a04a30a: cpio: MD5 チェックサムが適合しません」エラーで停止します。
    そこで以下の回避策にてXen 3.3.1を導入します。
    # cd
    # mkdir -p rpmbuild/SOURCES
    # mkdir -p rpmbuild/SPECS
    # mkdir rpmwork
    # cd rpmwork
    # rpm2cpio ../xen-3.3.1-11.fc11.src.rpm | cpio -id
    # cp -a rpmwork/* rpmbuild/SOURCES/
    # mv rpmbuild/SOURCES/xen.spec rpmbuild/SPECS/
    # rpmbuild -bb /root/rpmbuild/SPECS/xen.spec
    本rpmbuildの実行で以下のような表示がされます。
    伸張ファイルの検査中: /usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/xen-3.3.1-11.fc10.i386
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-3.3.1-11.fc10.i386.rpm
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-libs-3.3.1-11.fc10.i386.rpm
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-runtime-3.3.1-11.fc10.i386.rpm
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-hypervisor-3.3.1-11.fc10.i386.rpm
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-devel-3.3.1-11.fc10.i386.rpm
    書き込み完了: /root/rpmbuild/RPMS/i386/xen-debuginfo-3.3.1-11.fc10.i386.rpm

    ここで作成したFedora 10用Xen 3.3.1関連パッケージを以下のコマンドでインストールします。
    ※xen-devel-3.3.1-11.fc10.i386.rpmにはコンパイル用ヘッダファイルが含まれています。
    # cd /root/rpmbuild/RPMS/i386
    # rpm -ivh *.rpm
    # cd
    (4)virt系のパッケージ(libvirt等)はインストールしないままとします。
    (5)この時点でのrpmパッケージ一覧はこちらです。

  4. Domain0用カーネル構築
    # git clone git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git linux-2.6-xen
    # cd linux-2.6-xen/
    # make menuconfig
    ※上記gitでソース入手した時期によってデフォルト構成オプションが異なる場合がありますので必ずしも下記通りの手順にならないこともあります。
    (1)デフォルトでは「X86_PAE=n」になっているため「X86_PAE=y」となるように操作します。
    具体的には「Linux Kernel Configuration」画面で以下の操作を行います。
    ・Processor type and features --->の選択
    ・High Memory Support (4GB) --->の選択
    ・High Memory Supportで「(X) 4GB」を「(X) 64GB」に変更します。
    (2)デフォルトでは「XEN_DOM0=n」になっているため「XEN_DOM0=y」となるように操作します。
    具体的には「Linux Kernel Configuration」画面で以下の操作を行います。
    ・Processor type and features --->の選択
    ・[*] Paravirtualized guest support --->の選択
    ・[ ] Xen guest support (NEW) にチェックを入れます。
    ・[ ] Enable Xen privileged domain support (NEW)にチェックを入れます。
    ※「[*] Enable Xen privileged domain support」表示となります。
    (3)Xen virtual block device supportやXen network device frontend driverも有効にします(詳細手順略)。
    (4)Block-device backend driverやXen backend network deviceも有効にします(詳細手順略)。
    (5)最終的にmake menuconfigで作成される.configのXENオプションが以下の表示となるようにmake menuconfigを実施します。
    # cat .config|grep XEN
    CONFIG_XEN=y
    CONFIG_XEN_MAX_DOMAIN_MEMORY=8
    CONFIG_XEN_SAVE_RESTORE=y
    # CONFIG_XEN_DEBUG_FS is not set
    CONFIG_XEN_DOM0_PCI=y
    CONFIG_XEN_DOM0=y
    CONFIG_XEN_PRIVILEGED_GUEST=y
    CONFIG_MICROCODE_XEN=y
    CONFIG_PCI_XEN=y
    CONFIG_XEN_BLKDEV_FRONTEND=y
    CONFIG_XEN_NETDEV_FRONTEND=y
    CONFIG_XEN_KBDDEV_FRONTEND=y
    CONFIG_HVC_XEN=y
    CONFIG_XEN_FBDEV_FRONTEND=y
    CONFIG_XEN_BALLOON=y
    CONFIG_XEN_SCRUB_PAGES=y
    CONFIG_XEN_DEV_EVTCHN=y
    CONFIG_XEN_BACKEND=y
    CONFIG_XEN_BLKDEV_BACKEND=y
    CONFIG_XEN_NETDEV_BACKEND=y
    CONFIG_XENFS=y
    CONFIG_XEN_COMPAT_XENFS=y
    CONFIG_XEN_SYS_HYPERVISOR=y
    CONFIG_XEN_XENBUS_FRONTEND=y
    CONFIG_XEN_GNTDEV=y

    尚、PARAVIRTオプションについても以下の確認をしておきます。
    # cat .config|grep PARAVIRT
    CONFIG_PARAVIRT_GUEST=y
    CONFIG_PARAVIRT=y
    CONFIG_PARAVIRT_CLOCK=y
    # CONFIG_PARAVIRT_DEBUG is not set

    (6)以下のコマンドでカーネルをビルド/インストールします。
    # make
    # make modules_install ※これによって/lib/modules/2.6.30-rc3-tipが作成されます。
    # make install
    ※これによって/boot/vmlinuz-2.6.30-rc3-tip, /boot/initrd-2.6.30-rc3-tip.imgがインストールされます。
    ※また/boot/grub/grub.confにvmlinuz-2.6.30-rc3-tipを通常カーネルとしてブートするエントリも追加されます。

  5. xenデーモン設定ファイルの変更
    # vi /etc/xen/xend-config.sxp
    用途に合わせて/etc/xen/xend-config.sxpの内容を変更します(今回使用した/etc/xen/xend-config.sxpの内容)。

  6. /boot/grub/grub.confの変更
    /boot/grub/grub.confにFedora 10をdomain0として起動するエントリを追加して以下の内容にします。
    default=2
    timeout=15
    splashimage=(hd0,2)/boot/grub/splash.xpm.gz
    hiddenmenu
    title Fedora (2.6.30-rc3-tip)
    	root (hd0,2)
    	kernel /boot/vmlinuz-2.6.30-rc3-tip ro root=UUID=d32eba94-9e7a-4a62-bd5c-8f59f20ebd5f rhgb quiet
    	initrd /boot/initrd-2.6.30-rc3-tip.img
    
    title Fedora dom0 (2.6.30-rc3-tip)
    	root (hd0,2)
    	kernel /boot/xen-3.3.gz dom0_mem=1024M
    	module /boot/vmlinuz-2.6.30-rc3-tip ro root=UUID=d32eba94-9e7a-4a62-bd5c-8f59f20ebd5f console=tty0
    	module /boot/initrd-2.6.30-rc3-tip.img
    
    title Fedora (2.6.27.5-117.fc10.i686)
    	root (hd0,2)
    	kernel /boot/vmlinuz-2.6.27.5-117.fc10.i686 ro root=UUID=d32eba94-9e7a-4a62-bd5c-8f59f20ebd5f rhgb quiet
    	initrd /boot/initrd-2.6.27.5-117.fc10.i686.img
    

  7. Fedora 10の通常カーネルでの起動
    Fedora 10を再起動し、GRUBメニューでFedora (2.6.30-rc3-tip)]を選択して起動します。
    これでFedora 10が通常カーネルモードで起動します。
    通常カーネルモードでの動作確認
    ※xm dmesgは当然エラーとなります。

  8. Fedora 10のDomain0起動
    Fedora 10を再起動し、GRUBメニューで[Fedora dom0 (2.6.30-rc3-tip)]を選択して起動します。
    これでFedora 10のDomain0が起動し、DomainUでの準仮想化ゲストも実行できます。
    (vif = ['bridge=eth0']指定で準仮想化ゲストを起動するとホスト側に「vif1.0」インタフェースが自動生成されます)
    Domain0起動での動作確認
    ※Domain0起動での動作確認内容は以下の通りです。
    [root@fedora10 ~]# uname -srm
    Linux 2.6.30-rc3-tip i686
    [root@fedora10 ~]# cat /etc/fedora-release
    Fedora release 10 (Cambridge)
    [root@fedora10 ~]# rpm -qa|grep xen|sort
    xen-3.3.1-11.fc10.i386
    xen-debuginfo-3.3.1-11.fc10.i386
    xen-devel-3.3.1-11.fc10.i386
    xen-hypervisor-3.3.1-11.fc10.i386
    xen-libs-3.3.1-11.fc10.i386
    xen-runtime-3.3.1-11.fc10.i386
    [root@fedora10 ~]# ps aux|grep xen
    root        21  0.0  0.0      0     0 ?        S<   20:37   0:00 [xenwatch]
    root        22  0.0  0.0      0     0 ?        S<   20:37   0:00 [xenbus]
    root      2258  0.0  0.0   2368   860 ?        S    20:37   0:00 /usr/sbin/xenstored --pid-file /var/run/xenstore.pid
    root      2268  0.0  0.0  10528   520 ?        Sl   20:37   0:00 /usr/sbin/xenconsoled --log=none --log-dir=/var/log/xen/console
    root      2509  0.2  1.0  85028 11272 ?        Sl   20:37   0:00 /usr/bin/python2.5 /usr/sbin/xend
    root      3249  0.0  0.0   5304   808 pts/1    R+   20:42   0:00 grep xen
    [root@fedora10 ~]# ifconfig |grep Link
    eth0      Link encap:Ethernet  HWaddr 00:02:B3:38:DC:9B  
              inet6 addr: fe80::202:b3ff:fe38:dc9b/64 Scope:Link
    lo        Link encap:Local Loopback  
    peth0     Link encap:Ethernet  HWaddr 00:02:B3:38:DC:9B  
              inet6 addr: fe80::202:b3ff:fe38:dc9b/64 Scope:Link
    [root@fedora10 ~]# ping -c 1 www.yahoo.com|grep icmp
    64 bytes from www.yahoo.com (209.131.36.158): icmp_seq=1 ttl=55 time=127 ms
    [root@fedora10 ~]# ps aux|grep -i network
    root      2098  0.0  0.2  15120  2476 ?        Ssl  20:37   0:00 NetworkManager --pid-file=/var/run/NetworkManager/NetworkManager.pid
    root      2104  0.0  0.3   8108  3680 ?        S    20:37   0:00 /usr/sbin/nm-system-settings --config /etc/NetworkManager/nm-system-settings.conf
    root      3255  0.0  0.0   5308   888 pts/1    R+   20:42   0:00 grep -i network
    [root@fedora10 ~]# 
    [root@fedora10 ~]# cat /proc/cpuinfo|grep name
    model name	: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz
    model name	: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz
    [root@fedora10 ~]# dmesg|grep paravirt
    Booting paravirtualized kernel on Xen
    [root@fedora10 ~]# 
    [root@fedora10 ~]# xm dmesg
    以下省略
    


  9. Fedora 9をPVゲストとして実行する例
    Fedora 8のPVゲストとして作成したFedora 9の仮想ディスクをFedora 10上で実行してみました。


  10. Fedora 10をPVゲストとして実行する例
    別のFedora 10環境でKVMゲストとしてFedora 10をインストールした仮想ディスク(pvfc10.img:4000MB)を今回のXen 3.3.1環境のPVゲストとして利用してみました。
    ※このKVMゲストにはkernel-PAE(通常カーネル兼PVゲストカーネル:vmlinuz-2.6.27.5-117.fc10.i686.PAE)をインストール済みです。


  11. Ubuntu 8.10 Server(JeOS)をPVゲストとして実行する例
    VMware Server環境でUbuntu 8.10 Server(JeOS)をインストールした仮想ディスクをPVゲストとして利用してみました。