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を作り直しになります。



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード