SDSoC 2016.3に含まれる ZYBO 向け Software Platform からカーネル、 rootfs、/proc/config を取り出したかったので取り出した。
そもそも image.ub ってなんだ
ARMで使えるブートローダu-bootが扱うイメージフォーマットらしい。
$ mkimage -l image.ub FIT description: PetaLinux arm uImage with single Linux kernel and FDT blob Created: Fri Nov 18 04:07:34 2016 Image 0 (kernel@1) Description: PetaLinux Kernel Created: Fri Nov 18 04:07:34 2016 Type: Kernel Image Compression: gzip compressed Data Size: 8747883 Bytes = 8542.85 kB = 8.34 MB Architecture: ARM OS: Linux Load Address: 0x00008000 Entry Point: 0x00008000 Hash algo: crc32 Hash value: 252654ca Image 1 (fdt@1) Description: Flattened Device Tree blob Created: Fri Nov 18 04:07:34 2016 Type: Flat Device Tree Compression: uncompressed Data Size: 13962 Bytes = 13.63 kB = 0.01 MB Architecture: ARM Hash algo: crc32 Hash value: 66629950 Default Configuration: 'conf@1' Configuration 0 (conf@1) Description: PetaLinux Boot Linux kernel with FDT blob Kernel: kernel@1 FDT: fdt@1
カーネルを取り出す
まずこのイメージからカーネルを取り出す。 mkimage -l の結果から gzip compressed であることがわかっているので、 magic を頼りに探すと 240バイト目から gzip データがあることがわかる。 mkimage の結果からファイルは 8747883 バイトであることがわかる。
$ grep -P -a -b --only-matching $'\x1F\x8B\x08' image.ub 240:
なので
$ dd if=image.ub of=linux.bin.gz bs=1 skip=240 count=8747883 8747883+0 records in 8747883+0 records out 8747883 bytes (8.7 MB, 8.3 MiB) copied, 6.91697 s, 1.3 MB/s $ file linux.bin.gz linux.bin.gz: gzip compressed data, was "linux.bin", last modified: Thu Nov 17 19:07:33 2016, max compression, from Unix
カーネルの中から gzip データを取り出す
さらにこのアーカイブの中にrootfsが含まれている。cpioフォーマットで入っているかと思い、cpioフォーマットのヘッダである"070707"をgrepしたら発見... と思ったがハズレだった。これはcpioアーカイブじゃなくてcpioアーカイブを探すプログラムが参照している文字列っぽい。ということは...
$ grep -P -a -b --only-matching $'\x1F\x8B\x08' linux.bin 6278680: 8588960: 9923536:
gzip のヘッダらしきものが3つ見つかった。まずひとつ目は...
$ dd if=linux.bin skip=6278680 bs=1 | gzip -dc > hoge gzip: stdin: decompression OK, trailing garbage ignored toor@gpusv:~/zynq7/extract_initramfs$ file hoge hoge: Linux make config build file, ASCII text
ASCIIだと!?
$ head hoge # # Automatically generated file; DO NOT EDIT. # Linux/arm 4.6.0 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y CONFIG_MIGHT_HAVE_PCI=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y CONFIG_HAVE_PROC_CPU=y CONFIG_NO_IOPORT_MAP=y
...config.gz だった。まあ、ついでなので保存。
$ mv hoge config
では次。
$ dd if=linux.bin skip=8588960 bs=1 | gzip -dc > hoge gzip: stdin: decompression OK, trailing garbage ignored toor@gpusv:~/zynq7/extract_initramfs$ file hoge hoge: ASCII cpio archive (SVR4 with no CRC) toor@gpusv:~/zynq7/extract_initramfs$ cat hoge | cpio -it | head cpio: Substituting `.' for empty member name . dev dev/pts etc etc/opkg etc/opkg/arch etc/rpm etc/rpm/sysinfo etc/rpm-postinsts etc/network
今回は間違いなくinitrdイメージだ。
$ mv hoge initrd
目的な達成したけど、3つめはなんじゃらほい。
dd if=linux.bin skip=9923536 bs=1 | gzip -dc > hoge gzip: stdin has flags 0xce -- not supported
これは有効なgzipじゃなかった。"070707" 同様に gzip をデコードするルーチンが参照している定数かも。