Parallelsからトリプルブート環境のLinuxを起動

昨日(id:NeoCat:20080420) rEFItを使って構築したトリプルブート環境(Boot Camp)用のLinuxを、Parallelsから起動できるようにする方法を考えてみました。
Parallels内蔵のBIOSがHDDをうまく読めないため(?)、CD-ROMイメージを使ったhackが必要なようです。

以下の説明の前提として、ここではFedora 8 i386版を、3番目のext3フォーマットのパーティションに入れているものとします(←間違ってx86_64版を入れてしまったので再インストールした…)。なお、3番目とはMacからみると /dev/disk0s3 、Linuxからみると /dev/sda3 に見えることを意味します。

パーティションの設定

普通に考えると/dev/sda3には既にGRUBが入っているのだから、Parallelsパーティションさえ設定すれば起動しそうに思えますが、Parallelsが提供している仮想BIOSLinuxのHDDから起動することができないようです。
とりあえず、パーティションを設定するにはこちらのサイトを参考に、次のように設定します。
まず、適当にLinux起動用のVMParallels上に作ります。その後、編集メニューの「仮想マシン」で、HDDの設定をBoot Campに設定し、いったんParallesを閉じます。
すると ~/Documents/Parallels/VM名/VM名.pvs に設定ファイルができますので、これをテキストエディタで開いて編集します。

Disk 0:0 image = Boot Camp

という部分を探し、これを

Disk 0:0 image = Boot Camp;disk0s3

に書き換えます。

しかしこれだけでは、残念ながら「OSが入っていない」というエラーになったり、GRUBを起動しようとした際にハングアップしてしまうようです。惜しい。

どうやらHDD内のGRUB(stage2)を正しく読めていない雰囲気…。INT13h AH=4x命令に対応してないのかもしれません。

GRUB & カーネル起動用CD-ROMイメージの作成

そこで、仮想CD-ROMイメージにGRUBカーネルイメージを入れてしまい、そこから起動するという手段をとります。ちょっと強引。
(当初GRUBだけ入れたのですが、それだけだと「Error 18: Selected cylinder exceeds maximum supported by BIOS」と表示されてしまい、起動しませんでした。下図参照)

GRUBのCD-ROM作成作業にはインストールしたカーネルイメージが必要なので、rEFItで直接起動したLinux上で行います。

GRUBのマニュアルのCD-ROM編を参考に、ISOを作成。コマンドはこんな感じ。

$ mkdir iso
$ mkdir -p iso/boot/grub
$ sudo cp /boot/{vmlinuz-2.6.24.4-64.fc8,initrd-2.6.24.4-64.fc8.img} iso/boot/
$ cp /usr/lib/grub/i386-pc/stage2_eltorito iso/boot/grub
$ sudo cp /boot/grub/splash.xpm.gz iso/boot/grub
$ sudo cp /boot/grub/grub.conf iso/boot/grub
$ emacs iso/boot/grub/grub.conf

そして、iso/boot/grub/grub.conf内の (hd0,2) などとなっている部分を (cd) に置き換えてしまいます。また、コピーしていないカーネルの指定は不要なので消しておきましょう。例えばこんな感じ。

# grub.conf - load kernel from CD and boot into HDD
default=0
timeout=5
splashimage=(cd)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.24.4-64.fc8)
	root (cd)
	kernel /boot/vmlinuz-2.6.24.4-64.fc8 ro root=LABEL=/ rhgb vga=789
	initrd /boot/initrd-2.6.24.4-64.fc8.img

これで、HDDではなく、CDイメージ内のGRUBが、CDにコピーしたカーネルを読み込んでメモリ上に配置した後、initrd内の指示に従ってHDDからブートしてくれます。
最後に、ISOイメージを作ります。

$ mkisofs -R -b boot/grub/stage2_eltorito -no-emul-boot \
  -boot-load-size 4 -boot-info-table -o  grub.iso iso

できたイメージは適当な方法(ネットワークコピーとか)を使ってMacに転送しておきましょう。

作成したCD-ROMイメージからの起動

そして、Macを再起動し、ParallelsVMの設定を行います。先ほどLinux上で作ったgrub.isoをCD-ROMイメージとして指定します。さらに、オプション>ブートから、CDを優先して起動するように設定しましょう。

この状態でVMを起動すると、作業がうまく行っていれば、CD-ROMイメージからGRUBが立ち上がり、次いでLinuxが起動されます。



なお、このイメージは起動にしか使わないので、起動後は(仮想的に)引っこ抜いても全く問題ありません。
MacBook Proを使っていてFedora8にlivnaなどからnVIDIAドライバを入れている場合、毎回Xの起動がいったんこけてしまいますが、ま、そのへんはご愛嬌。画面の指示に従ってreconfigureすれば、ちゃんと立ち上がります。