Gentoo on Ubuntu+Xen
Xen dom0, domU ともUbuntuという環境では面白みがないので、ホスト (dom0) はUbuntuのままで、ゲスト (domU) をGentooという組み合わせを試してみました。Gentooはアーカイブ展開+設定ファイル編集という方法でインストールできるので簡単に動かせると予想していましたが、Ubuntu上で作成したinitrdとGentooの起動スクリプトの組み合わせで発生した問題を追跡するのに多少手間取りました。
バージョン情報
- dom0 (ホスト): Ubuntu Linux 6.10
- domU (ゲスト): Gentoo Linux 2006.1
作業メモ
- mkinitramfsを使って、Xen用のinitrdを作成 (参考: https://help.ubuntu.com/community/XenVirtualMachine/XenOnUbuntuEdgy)
- Xen domU用に作成したイメージファイル (ddコマンドで作成) を/mnt/gentooにマウント
- Gentoo Linux x86 ハンドブック のインストール手順に従って、/mnt/gentoo 以下にGentoo環境を構築 (ただし、ここではカーネルのコンパイル/インストールは行わない)
- 作成したイメージファイルを仮想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 ...
% 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 ...