buildrootを用いてusbブートのLinuxをビルドする。

ネット上の様々な有用情報を頼りにして、buildrootとLinuxカーネルのソースコードから、usbブート可能なLinuxをビルドし、usbにgrubとともにインストールすることができました。一連の行程を備忘録として残しておきます。

USBから起動できる最小構成のLinuxをビルド。

<参考Web site>

<(0)開発環境>
Vine Linux 5.1 on Let's note CF-T7
ユーザー名:kappa

※今回作成するMinuxというネーミングはhttp://plaza.rakuten.co.jp/slothstyle/diary/201105150000/のブログのものです。すばらしい内容で大部分を参考にさせていただきましたので、敬意を込めてそのままの名前を使用させていただきます。

<(1)ルートファイルシステムの作成>
Buildrootというソフトウェアを利用/buildrootとはルートファイルシステムを作成するためのtoolchan。uClibcやbusyboxをはじめとする様々なプログラムをビルドするためのMakefileやpatchで構成されている。
###Buildroot(buildroot-2011.02.tar.gz)をダウンロードする。
$ pwd
/home/kappa
$ mkdir minux
$ cd ./minux
$ wget http://buildroot.uclibc.org/downloads/buildroot-2011.02.tar.gz
$ tar -zxvf buildroot-2011.02.tar.gz

###Buildrootのソースコードダウンロード先ディレクトリを作成。Buildrootの設定でダウンロード先を指定することで、ダウンロードファイルを一箇所にまとめて共通化が可能。
$ pwd
/home/kappa/minux
$ mkdir buildroot-dl

###ビルドディレクトリを作成。 "minux" を親ディレクトリとし、Buildroot用に "br" という子ディレクトリを作成。
$ pwd
/home/kappa/minux
$ mkdir br

###"allnoconfig" でBuildrootの設定を初期化します。
$ pwd
/home/kappa/minux
$ make -C  /home/kappa/buildroot-2011.02 O=/home/kappa/br allnoconfig

###Buildrootの設定
$ cd ./br
$ make menuconfig

以下のようにオプションを設定。

(a)
Build options -> Download dirの
"$(TOPDIR)/dl"
"/home/admin/minux/buildroot-dl"
に変更。

(b)
BusyBoxをビルドするように設定。
Package Selection for the target -> BusyBox /// ON

(c)
ルートファイルシステムのイメージファイルをcpio形式に指定。
Target filesystem options -> cpio root filesystem /// ON

exitした後、ビルドする。
(1時間ほどかかりました。自分の環境 core 2 duo, 1.20GHz。ファイルダウンロードが行われるため、インターネット接続は必須です。)

$ make all

### fakeroot_1.9.5..tar.gzがダウンロードできないことが理由でインストールが止まるので、該当ファイルをダウンロードし適切な位置に配置
$ mv fakeroot_1.9.5.tar.gz /home/kappa/minux/buildroot-dl/
$ make all

ビルドに成功すると、/br/images/rootfs.cpio" というファイルが作成されます。これがcpio形式でアーカイブされたルートファイルシステムのイメージファイルになる。
###ルートファイルシステム(rootfs.cpio)を圧縮し、/home/kappa/minuxにinitrdという名前でコピーしておく。
$ gzip /home/kappa/minux/br/images/rootfs.cpio
$ cp /home/kappa/minux/br/images/rootfs.cpio.gz /home/kappa/minux/initrd

<(2)最小構成でkernelをビルド>
続いてUSBブートするための最小構成のカーネルをビルドする。
###linux-2.6.37.2のソースコードをダウンロードしてビルドした。
 $ pwd
/home/kappa/minux/
$ wget http://www.kernel.org/pub/linux/kernel/v2.6//linux-2.6.37.2.tar.bz2
$ tar jxf linux-2.6.37.2.tar.bz2
$ mkdir kernel

###allnoconfigで設定を初期化を行う。
$ make -C ./linux-2.6.37.2 O=/home/kappa/minux/kernel allnoconfig
$ cd kernel
$ make menuconfig

###以下のオプションを有効化する。モジュール化はせず、カーネルに組み込む。(モジュールはallnoconfigで無効になっている。)

・General setup -> Initial RAM filesystem and RAM disk (initramfs/initrd) support /// ON
!!圧縮ファイルの展開関連のオプションも自動的に有効化される。!!

・Executable file formats / Emulations
-> Kernel support for ELF binaries /// ON
-> Write ELF core dumps with partial segments /// ON (auto)

###ビルドします。"bzImage"が生成されれば成功。

$ make bzImage
...
Setup is 14008 bytes (padded to 14336 bytes).
System is 770 kB
CRC 5b2917a6
Kernel: arch/x86/boot/bzImage is ready (#1)
のように表示が出れば成功。




<(3)USBメモリ(/dev/sdb)へのMinimal Linux の導入>

###まずはusbをフォーマット
$ su 
# fdisk /dev/sdb
p (パーティション内容の表示)
d (パーティションの削除)
n (パーティションの作成. デフォルトで/dev/sdb1というパーティションが生成する。)

###usbの/dev/sdb1をext3でフォーマット
# mkfs.ext3 /dev/sdb1

###usbをアマウントして再度場所を変えて(/mnt/usb)マウント(わかりやすくするためである)
# umont /dev/sdb1
# mount /dev/sdb1 /mnt/usb


###grubをインストールする。
# mkdir /mnt/usb/grub
# cp /boot/grub/stage* /boot/grub/e2fs_stage1_5 /mnt/usb/grub/
# umount /mnt/usb

###/dev/sdb1にMBR(master boot record)をインストールする。MBRはブート処理専用としてデバイス上に各区帆された512byteの非表示領域である。MBRのインストールには、GRUB関連の処理を行うシンプルなコマンドシェル、GRUBシェルを使用する。
# grub
grub> device (hd0) /dev/sdb
grub> root (hd0, 0)
grub> setup (hd0)
grub> quit

###usbの/dev/sdb1にビルドしたルートシステム(/home/kappa/minux/initrd)とカーネルイメージ(/home/kappa/minux/kernel/arch/i386/boot/bzImage)を/dev/sdb1のルート(/mnt/usbにマウントした状態では、ビルド環境のマシーンから見ると/mnt/usb/がルートディレクトリ)にコピーしていく。
# mount /dev/sdb1 on /mnt/usb
# cp /home/kappa/minux/initrd /mnt/usb/
# cp /home/kappa/minux/kernel/arch/i386/boot/bzImage /mnt/usb/


###grubの設定ファイルに、/dev/sdb1の構成を書き込む。 bzImage及び、initrdが/dev/sdb1のルートディレクトリにおいてあるだけのので、素直にその旨を記述する。
# vim /boot/grub/menu.lst

////////////////////////////////////
title Minimal Linux
kernel /bzImage root=/dev/sdb
initrd /initrd
////////////////////////////////////

<(4)おわり>
再起起動すれば、BIOSの設定がUSB起動になっていれば、CUIでLinuxが起動する。
"root" ユーザーでログイン可能。
パスワードは未設定である。