2012年03月09日
Buildrootで作ったルートファイルシステムをinitramfsでカーネルに組み込む
Buildrootを使って簡単に最小限のルートファイルシステムを作ることができます。今回は、Linuxカーネルのinitramfsの機能を使ってこれをカーネルに組み込んで動かしてみました。
Buildrootでルートファイルシステムのcpioアーカイブを作成する
buildrootのmenuconfigで以下を追加します。(前回からの差分のみ。)
Filesystem images ---> [*] cpio the root filesystem Compression method (no compression) --->
これでビルドすると以下のようにcpioアーカイブができます。
$ ls -l output/images/rootfs.cpio -rw-r--r-- 1 koba koba 1230336 2012-03-09 11:56 output/images/rootfs.cpio $ file output/images/rootfs.cpio output/images/rootfs.cpio: ASCII cpio archive (SVR4 with no CRC)
これはuclibcでbusyboxのみで構成したルートファイルシステムです。
ルートファイルシステムをカーネルに組み込む
カーネルのmenuconfigで以下を指定します
General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (/path/to/output/images/rootfs.cpio) Initramfs source file(s)
カーネルのサイズの比較
組み込む前のカーネルのサイズ
$ size vmlinux text data bss dec hex filename 4045091 179264 691288 4915643 4b01bb vmlinux
initramfsを組み込んだカーネルのサイズ
$ size vmlinux text data bss dec hex filename 5275011 179264 691288 6145563 5dc61b vmlinux
rootfs.cpioのサイズとtextの増分が同じくらいです。圧縮されずにそのまま組み込まれたようです。(圧縮することもできました。後述。)
起動
カーネルのブートパラメータ
rdinit=/linuxrc mem=129M@0x40000000 mem=256M@0x50000000 \ console=ttyS1,115200n8n
initramfsでは /init がデフォルトの起動プログラムです。これを変更するために rdinit= を使用します。
(追記: Buildrootが/initのシンボリックリンクを生成していたので、rdinit=/linuxrc は不要でした。)
起動ログ
... [ 1.450000] Starting sound codec. [ 1.450000] ALSA device list: [ 1.460000] #0: sound codec (emxx mixer) [ 1.460000] oprofile: using arm/armv7-ca9 [ 1.470000] TCP cubic registered [ 1.470000] NET: Registered protocol family 17 [ 1.470000] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 1 [ 1.480000] emxx-rtc 0-0051: setting system clock to 2000-01-01 02:00:10 UTC (946692010) [ 1.490000] Freeing init memory: 1328K Starting logging: OK Initializing random number generator... [ 1.560000] mmc0: new high speed MMC card at address 0001 [ 1.570000] mmcblk0: mmc0:0001 000000 3.82 GiB [ 1.570000] mmcblk0: p1 p2 p3 done. Starting network... Welcome to Buildroot buildroot login:
rootでパスワード無しでログインできます。
カーネルをいろいろいじっているときには、カーネルとテストプログラムを一体化してロードして起動できるので便利です。
追記:ルートファイルシステムを圧縮して組み込む
カーネルのコンフィグの中に以下のようにcompressionの項目があったので試してみました。
General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support (/path/to/output/images/rootfs.cpio) Initramfs source file(s) Built-in initramfs compression mode (Gzip) --->
$ size vmlinux text data bss dec hex filename 4636651 179264 691288 5507203 540883 vmlinux
textの増分が半減しました。
それ以外は何も変更せずに起動することができました。
ルートファイルシステムの更新
output/target 以下のファイルを更新してから
- Buildroot を make (cpioアーカイブを更新)
- Kernel を make (上記アーカイブをカーネルに組み込む)
当然のことながら、起動後にターゲット側で発生したファイルの変更は何か工夫しないと再起動した時点でクリアされてしまいます。そのためsshdを使おうとすると起動のたびにssh keyを作り直しになります。