Gentoo on Ubuntu+Xen

Xen dom0, domU ともUbuntuという環境では面白みがないので、ホスト (dom0) はUbuntuのままで、ゲスト (domU) をGentooという組み合わせを試してみました。Gentooアーカイブ展開+設定ファイル編集という方法でインストールできるので簡単に動かせると予想していましたが、Ubuntu上で作成したinitrdとGentooの起動スクリプトの組み合わせで発生した問題を追跡するのに多少手間取りました。

バージョン情報

作業メモ

  1. mkinitramfsを使って、Xen用のinitrdを作成 (参考: https://help.ubuntu.com/community/XenVirtualMachine/XenOnUbuntuEdgy)
  2. Xen domU用に作成したイメージファイル (ddコマンドで作成) を/mnt/gentooにマウント
  3. Gentoo Linux x86 ハンドブック のインストール手順に従って、/mnt/gentoo 以下にGentoo環境を構築 (ただし、ここではカーネルコンパイル/インストールは行わない)
  4. 作成したイメージファイルを仮想HDDの/dev/hda1に指定して、domUを起動 (xm create)

作成したXen設定ファイルはこんな感じ。

kernel = "/boot/xen0-linux-2.6.17-6-generic-xen0"
ramdisk = "/boot/xen0-linux-2.6.17-6-generic-xen0.initrd.img"
builder = "linux"
memory = 256
name = "gentoo"
vcpus = 1
vif = [ "bridge=xenbr0" ]
disk = [ "file:/data/xen-gentoo.ext3,hda1,w", "file:/data/swap_img,hda2,w" ]
root = "/dev/hda1 ro"

はまりポイント: /proc のマウントに失敗

これでxm createコマンドでdomUを起動すると、以下のようなエラーメッセージが出てブートに失敗しました。

 * Mounting proc at /proc ...[ oops ]
 * The "mount" command failed with error:
proc already mounted
 * Since this is a critical task, startup cannot continue.

Give root password for maintenance
(or type Control-D to continue): 

どうやら、マウント済みの /proc を二重にマウントしようとしていることが問題のようですが、

  • このエラーを出しているのはどこか
  • 最初に /proc をマウントしているのはどこか

を追跡するのに手間取りました。

解決編 (暫定)

結論としては、initrdの中で /proc (+ /sys) をマウントしており、その後でGentooの起動スクリプトの中で再度 /proc, /sys をマウントしようとしていることが原因と判明しました。initrdの中の処理を十分に把握できていないため、暫定的な措置として、Gentoo側で /proc, /sys をマウントする部分でエラーを無視するように修正しました。この修正でとりあえずdomUのブートに成功することを確認しました。

以下、作業メモ。

initrdの中で行っている処理を確認するため、initrdの内容を展開

% mkdir /tmp/initrd
% cd /tmp/initrd
% zcat /boot/xen0-linux-2.6.17-6-generic-xen0.initrd.img | cpio -id
30680 blocks
# ls -F
bin/  conf/  etc/  init*  lib/  modules/  sbin/  scripts/  usr/

展開したinitrdの中の起動スクリプトの内容を確認

% nl -ba init
...
     7  mount -t sysfs none /sys -onodev,noexec,nosuid
     8  mount -t proc none /proc -onodev,noexec,nosuid
...
   134  # Move virtual filesystems over to the real filesystem
   135  mount -n -o move /sys ${rootmnt}/sys
   136  mount -n -o move /proc ${rootmnt}/proc
...

Gentoo用イメージ中の起動スクリプトの内容を確認

% sudo mount xen-gentoo.ext3 /mnt/gentoo -o loop
% cd /mnt/gentoo
% cat etc/inittab
...
l3:3:wait:/sbin/rc default
...
% nl -ba sbin/rc
...
   212  ebegin "Mounting proc at /proc"
   213  if [[ ${RC_USE_FSTAB} = "yes" ]] ; then
   214    mntcmd=$(get_mount_fstab /proc)
   215  else
   216    unset mntcmd
   217  fi
   218  try mount -n ${mntcmd:--t proc proc /proc}
   219  eend $?
...
   228  ebegin "Mounting sysfs at /sys"
   229  if [[ ${RC_USE_FSTAB} = "yes" ]] ; then
   230    mntcmd=$(get_mount_fstab /sys)
   231  else
   232    unset mntcmd
   233  fi
   234  try mount -n ${mntcmd:--t sysfs sysfs /sys}
   235  eend $?
...

以上から、以下のような現象が発生していると判明。

  • (Xen domU用の) initrd の中で実行されるinitスクリプトの中で /proc, /sys がマウントされ、それがルートファイルシステムのマウント後にも引き継がれる。
  • Gentooの起動スクリプト /sbin/rc の中で /proc, /sys をマウントしようとしている。これらのディレクトリはマウント済みであるためマウントに失敗し、致命的なエラーとしてブート処理が中断する。

try()の引数として指定したコマンドでエラーが発生すると致命的なエラーとして扱うようなので、エラーを無視するように修正した。修正後の/sbin/rcの内容:

...
   218  mount -n ${mntcmd:--t proc proc /proc}
   219  eend 0
...
   234  mount -n ${mntcmd:--t sysfs sysfs /sys}
   235  eend 0
...