VAIO type P で SD カードから Debian をブートできるようにした

恩師に頂いた VAIO type P 二台のうち,直ちに Debian を入れて常用の端末となった Vista モデル (VGN-P70H) ではなく, XP だし残しておいたら何かと便利ではないかと放っておいたら便利屋さんとして確固たる地位を築いて消すに消せなくなってしまった XP モデル (VGN-P61S) の方を,さらにもう一段階便利屋さんとして深化させるべく, Debian とのデュアルブートにしてみた.
Debian 自体のコンフィギュレーションは前回書いたとおりなので,今回は起動までを目指して,省略.

導入

先日 RC2 の導入でうまくウィザードが動くことはわかっていたので, debian-6.0.1a-i386-DVD-1.iso を適当なミラーからダウンロードして DVD-R に焼き,適当な USB 接続の DVD ドライブからブートした. DVD ドライブとの相性が悪かったのか,「起動直後」は F11 を叩いてもブートメニューには入れず,いったん F2 で BIOS の設定画面を見てから,そこから再起動した後 F11 を叩く必要があった.
使用した SD カードは Transcend の 8GB (Class 6) のもの.インストール先のディスクを選ぶ画面では,

SCSI4 (0,0,1) (sdc) - 8.0 GB Sony USB HS-SD/MMC
   >     #1    primary       7.6 GB    B  K   ext2   /
   >     #5    logical     379.6 MB       F   swap   swap

このように sdc として見えていた SD カードを選択.ガイドは上のような比率で切ってくれたので,ファイルシステムext2 に,マウントオプションとして noatime をつけておいた. ext3 でもジャーナリングの設定を変えればアクセスを抑制できるそうだが,面倒くさかったのでこのような設定にした.そもそもこの手のチューニングに意味があるのかどうか甚だ疑問ではある.
あとは適当に手続きを進める. grub を /dev/sda に入れてしまうと Windows が残念なことになるので,そこだけ注意する.私は /dev/sdc に導入したが,後述するようにどうせうまく動かないので, /dev/sda にさえ入れなければどうしてもよい.いや,もしかすると, /dev/sda に入れればそれで何も問題なく幸せになれたのかもしれないが,あまり自信がなかったので私はそうしなかった.

起動…失敗

Windows が起動する. BIOS で External Device からの起動を優先させる設定が行えるが,これは USB 接続のデバイスのことらしく, SD カードは読みに行ってくれない模様.ブートローダを導入した USB メモリを刺せば起動できそうだが,それでは刺しっぱなしでも邪魔にならない SD カードに格納した意味がなくなってしまうのでパス.

XMB をハックする

VAIO type P にはクロスメディアバーボタンという小さなボタンがある.電源ボタンの代わりにこれを押すと,十秒ほどでインスタントモードという AV 機器っぽい機能を集めた小さな OS が起動する.この実体は Linux で, Windowsパーティション内 C:\InstantON\ 以下にそのイメージが格納され, C:\{initrd,kernel}.pam で具体的な Kernel と initrd が指定されている.これらを先に導入した Debian のものに置き換えてしまえば,いちいちブートローダの心配をせずとも,電源ボタンを Windows の, XMB ボタンを Debian の起動スイッチとして働かせることが出来そうだ.

カーネルを弄る

ところが面倒なことに, initrd 以外のイメージは ext2 そのままなのだが, initrd だけはよくわからない形式で保存されており,これを標準的な方法でこしらえた initrd に置換してもちゃんと展開してくれない.インスタントモードは C:\initrd.pam が何も指していなくても異常終了することはない仕様のようなので, initramfs の仕組みを使って rootfs をカーネルに組み込んでみる.
${TEMPDIR} を作業ディレクトリ,カーネルのバージョンを 2.6.xx とする.以下の作業は,適当な Debian 系 OS で行うと簡単でよい.私はたまたま Xeon E5540 を二つとメモリを 8GB も積んだ計算機の root を持っていたので,手元の Debian で debootstrap した minimum Debian をコピー, chroot してその中で作業を行った.カーネルのビルドは一晩かかる印象があったので, CONCURRENCY_LEVEL=16 並列とはいえわずか数分で終わってしまって隔世の感が.

% cd ${TEMPDIR}
% sudo apt-get build-dep linux-source-2.6
% sudo apt-get source linux-source-2.6
% cd linux-2.6-2.6.xx/
% sudo make menuconfig

コンフィギュレーションで気をつけるべきことは,

  • ext2 のサポートを有効にする
  • MMC/SD のサポートを有効にする

の二点だろう.後は好みで.

% sudo make-kpkg --revision=custom.0.1 --initrd kernel_image
% sudo dpkg -i ../linux-image-2.6.xx_custom.0.1_i386.deb

initrd のイメージは dpkg -i の際に mkinitrd で生成されるようなので,いったんビルドしたカーネルをインストールした後,生成された initrd を組み込んだ形でカーネルを再びビルドする.

% mkdir ../initrd/
% cd ../initrd/
% gunzip -c /boot/initrd.img-2.6.xx | cpio -i
% cd ../linux-2.6-2.6.xx/
% sudo dpkg -r linux-image-2.6.xx
% sudo sed -e 's:CONFIG_INITRAMFS_SOURCE="":CONFIG_INITRAMFS_SOURCE="${TEMPDIR}/initrd/":' -i .config
% sudo make-kpkg --revision=custom.0.2 --initrd kernel_image

% dpkg-deb --fsys-tarfile ../linux-image-2.6.xx_custom.0.2_i386.deb | tar xf - ./boot/vmlinuz-2.6.xx
% cp ./boot/vmlinuz-2.6.xx ${InstantON_DIR}

できあがった Kernel を,どこでもよいのだが,わかりやすく C:\InstantON\vmlinuz-2.6.xx に置く. C:\initrd.pam は空, C:\kernel.pam は

/InstantON/vmlinuz-2.6.xx root=UUID=********-****-****-****-************ rw vga=0x368

などとしておく. UUID は blkid などで調べることができる. root=/dev/sdc1 といった古い指定の方法でもよいが,現在は UUID が推奨されているらしいので,こちらの方がいいだろう. USB メモリなどを刺した状態で起動すると認識順の関係で名前が変わることは実際問題大いにあり得る.

というわけで

電源ボタンを押すと Windows XP (@HDD) が, XMB ボタンを押すと Debian squeeze (@SD) が起動するデュアルブートVAIO type P ができあがった.基本的には Windows XP を使い,必要なときは XP を休止状態にして Debian に切り替えシンクライアントとして使用できるという,いかにもよく遊びに行く誰かに貸すに適した仕様になったと言えよう.