ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

Xen+Dom0:Ubuntu+DomU:CentOS7

Ubuntu16.04LTSにXen6.4をインストール、Ubuntu Serverの最小構成をDomUとして起動することには成功しました。もともとはお勉強用にCentOS7の最小構成をDomUとして立ち上げたかったのですが、これが存外に苦労しました。

以下、ざっくりと経緯を書きます。

  1. Kernel Panic発生

    最初、Ubuntu Serverの仮想イメージへのインストールと同様に、CentOS7(64bit)のネットワークインストール用のISOからKernelイメージとramdiskイメージを抜き出して、これをxl.cfgに設定して、DomUを起動しましたがなぜかKernel Panicが発生します。
    Ubuntuの64bitでは発生しなかったので、64bit kernelが動くのを期待したのですが、これは原因不明のままです。Celeron 550ではダメなのか、xl.cfgのKernel Optionの指定で改善するのか?未だ調査中です。
    結局CentOS7ではPV(準仮想化)は未サポートが真相の様です。CentOS7.4で64bit版をPVモードで起動できることが判りました。後日手順を紹介します。


    rc30-popo.hatenablog.com


    有志でビルドされたaltarchのi386版では動きました。

  2. ネットワークインストールできない

    64bitカーネルが立ち上がらないので、仕方なく32bit版のCentOS7のKernel,ramdiskを使いましたが、ネットワークインストーラが起動せず。これも当方の使い方の問題かもしれませんが、Minimalインストール用のISOをダウンロードしてここからインストールすることにしました。
    下記の様なxl.cfgを作って、sudo xl create -c します。

    name = "centos7"
    kernel = "/home/foo/centos7-i386/vmlinuz"
    ramdisk = "/home/foo/centos7-i386/initrd.img"
    memory = 512
    vcpu = 1
    disk = [ 'file:/home/foo/centos7.img,xvda,w','file:/home/foo/CentOS-7-i386-Minimal-1708.iso,xvdb:cdrom,r' ]
    vif = [ 'mac=00:16:3e:xx:xx:xx,bridge=xenbr0']
    extra="inst.repo=cdrom:xvdb"

    これでインストーラが立ち上がり、インストールに成功しました。
    なおパーティション設定はLVMを使わず、standard partitionでインストール。

  3. インストール後のイメージファイルでpygrubがrootパーティションを見つけられない

    name = "centos7"
    memory = 512
    vcpu = 1
    disk = [ 'file:/home/foo/centos7.img,xvda,w']
    vif = [ 'mac=00:16:3e:xx:xx:xx,bridge=xenbr0']
    bootloader = "/usr/lib/xen-4.6/bin/pygrub"

    xl.cfgを上の様に書き換えてDomUを起動しますがpygrubがrootパーティションを見つけれないというエラーを吐いて、起動に失敗します。

    Traceback (most recent call last):
      File "/usr/lib/xen-4.6/bin/pygrub", line 882, in <module>
        raise RuntimeError, "Unable to find partition containing kernel"
    RuntimeError: Unable to find partition containing kernel

このエラーについてはググるといくつか情報があるのですが、結局Xenの準仮想化で使用するbootloaderエミュレータpygrub(名前から分かる通りpythonで書かれています)が、grub2というbootloaderに対応していないためらしいです。
解決策としては大きくは2つの情報がありました。

  • pygrubで読み取れるmenu.lstファイルを仮想ディスクイメージに追加する

https://plone.lucidsolutions.co.nz/linux/xen/centos/workaround-for-centos-7-with-grub2-and-xen-dom0-with-pv-grub/view
色々試したのですが、うまく行かず。

  • grub2のxen用を自分でビルドしてpygrubの代わりに使う

https://wiki.xen.org/wiki/PvGrub2
https://blog.xenproject.org/2015/01/07/using-grub-2-as-a-bootloader-for-xen-pv-guests/

結論から言えばGrub2(Pvgrub)をビルドすることでCentOS7に起動に成功したのですが、上記サイトの手順どおりではうまく行かない部分がありました。

  • configure時に'--prefix=/opt/grub2'を付ける

上記の参照ページには「付けた方が良いよ」くらいの感じですが、必ずつけて置かないとmake installした際にhost(Dom0)環境のオリジナルのgrub2を上書きしてしまうので忘れていけません。

https://build.opensuse.org/package/view_file/openSUSE:Factory/grub2/grub2-xen-linux16.patch?expand=1
パッチの内容はこのページに書いてあります。ソースのバーションが異なる様で、パッチに書いてある行と実際にパッチをあてる対象行がずれています。手動でソース内を検索して探します。4箇所の修正が書いてありますが、最初の「return grub_errno;」はこれを入れるべき場所が見つかりませんでした。
他のコードはソース内を検索すればすぐに見つかります。
これはgrub2のコマンドとしてlinux16とinitrd16というものが追加されておりCentOS7のgrub.cfgで使われているからです。grub.cfg側のlinux16とinitrd16を強引にlinuxとinitrdに書き換えても動きますが、後で色々不具合起きそうなのでXen用のgrub2側を修正しておきます。

  • grub-mkimageに食わせるgrub.cfgの内容を変更

grub-mkimageでXen用bootloaderを生成する際、上記のサイトでは

normal (xen/xvda,msdos1)/boot/grub/grub.cfg

という内容のcfgファイルを作ってgrub-mkimageに食わせる様に書いてあります。
CentOS7ではディスクイメージのパーティション構成が変わっており、rootファイルシステムは/dev/xvda3に、/bootは/dev/xvda1なのですが/dev/xvda1にはbootの直下から始まっています。またディレクトリ名も若干変わっています。従って下記内容のcfgファイルをgrub-mkimageに食わせる必要がありました。

normal (xen/xvda,msdos1)/grub2/grub.cfg

これで作ってgrub2のイメージファイルを使い、以下の様なxl.cfgを作ると無事CentOS7をDomUで起動することができました。

name = "centos7"
kernel = "/home/foo/grub-i386-xen.bin"
memory = 256
vcpus = 1
disk = [ 'file:/home/foo/centos7.img,xvda,w']
vif = [ 'mac=00:16:3e:00:00:02,bridge=xenbr0']

grub-i386-xen.binがgrub-mkimageで生成したgrub2 bootloaderで、これをkernelの代わりとして起動させます。


なお最初に試した際はCentOS7をstandard partitionでインストールしましたが、LVMでもOKでした。