組み込みシステム用Linuxを作ってみよう x86版(2)

前回の「組み込みシステム用Linuxを作ってみよう(1)」からの続きです

仮想マシンで実行することも考えましたが、仮想マシンで動いたところで動いてる実感に乏しかったので、実機をUSBメモリで起動する方法を解説していきます。当然、同様のことを仮想マシンで実行することも可能ですので、実機を準備するのが面倒な場合は仮想マシンで実行してみてください。

前回作成した、イメージをUSBメモリーに書き込んで、USBブート可能なPCで起動してみましょう。
まずは、USBメモリーのパーティショニングから

% sudo fdisk /dev/sdX

※ sdXは、USBメモリのデバイス名

Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-15196159, default 2048): (Enter)
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-15196159, default 15196159): (Enter)
Using default value 15196159
Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
Command (m for help): q

数値は、メモリによって異なりますが、とりあえず全体をLinuxで使用するように設定します。
続いてフォーマットと、メディアにデーターを書き込むことはないので、定期的なfsckの実行を抑制するためのパラメーターの設定をします。

% sudo mkfs -t ext2 /dev/sdb1
% sudo tune2fs -c -1 -L system /dev/sdb1

次に、MBRを書き込みます。これは、BIOSがセクター0を読み込んでOSを起動するまでのコードが格納されているコードです。このコードは前回ブートローダーにsyslinuxを選択したため、output/build/syslinux-6.03以下にビルドされています。

% sudo cat output/build/syslinux-6.03/bios/mbr/mbr.bin > /dev/sdb

MBRを書き込んだら、ファイルシステムをマウントして、MBR以降のブートローダーのコードを書き込みます。

% sudo mkdir /mnt/usb
% sudo mount -t ext2 /dev/sdb1 /mnt/usb
% sudo output/host/sbin/extlinux --install /mnt/usb

最後に、カーネルとRAMディスクイメージをコピーして、syslinuxのブートメニューを設定してUSBメモリーをアンマウントします。

% sudo cp output/images/bzImage /mnt/usb
% sudo cp output/images/rootfs.cpio.gz /mnt/usb
% sudo cat  << _EOF > /mnt/usb/extlinux.conf
> DEFAULT linux
> PROMPT 0
> LABEL linux
> LINUX bzImage
> INITRD rootfs.cpio.gz
> EOF
> _EOF
% sudo sync
% sudo umount /mnt/usb

これで、起動メディアの完成です。USBブート可能な、PCにメディアを刺して起動すると、今回作成したLinuxが起動するはずです。
起動したLinuxでは、rootでログインして、コマンドを消したり、変な設定をしても、USBメモリを書き込み可能でマウントしない限り、再起動すると元に戻ります。また、書き込み可能メディアをマウントしていないので、シャットダウン処理の必要もありません。(いきなり電源ケ