2013年4月4日木曜日

initramfs

TI製チップAM3352 ARM Cortex-A8プロセッサ上でLinuxを走らせようとしている時のメモ。

initramfsについてはこちらを参照
http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ramfs-rootfs-initramfs.txt.html
http://www.gcd.org/blog/2007/09/129/

現状kernelからブートデバイスが認識できない状態で、それでも取りあえず起動だけでも行うための手順。

u-bootからkernelとinitramfsのイメージをブートデバイスからメモリにコピーしkernel起動。
#u-bootはブートデバイスにアクセスできてる

> sf probe 0
> sf read 0x82000000 0x400000 0x400000  <- ここでkernelイメージの読み出し
> sf read 0x83000000 0x800000 0x400000  <- ここでinitramfsの読み出し
> setenv bootargs initrd=0x83000000,0x3c112233  <- kernelに渡す引数 initramfsのメモリ番地とサイズを指定する
> bootm 0x82000000      <- kernelの起動

ここでハマったのが、bootargsでinitramfsのイメージサイズ(↑の場合は0x3c112233)を正しく指定しないとinitramfsではなくinitrdで起動しようとすること。

kernelの起動ログに
「Initramfs unpacking failing: junk in compressed archive」とでてくる。

使用したのはcpio+gzipイメージなのだが、サイズを大きく指定すると(当初は0x400000としていた)上のようなログを吐く。

initramfsのイメージサイズは作るたびに変わるし、それをいちいちu-boot-envで設定しておくのはちょっと面倒なので結局initramfsではなくcramfsを使うことにした。
※initramfsイメージをmkimageでu-boot用イメージにしてbootmでサイズ指定なしでできる

cramfs自体が自身のサイズを持ってるので、サイズの指定は適当でよくなる。
この場合は「root=」の指定が必要になる。
> setenv bootargs root=/dev/ram0 ro initrd=0x83000000,4M rootfstype=cramfs