Introduction
Typical Android system implementing fastboot (this includes FirefoxOS devices)
uses so called boot.img
images to run the kernel. It consist of the kernel
itself and a ramdisk that it used to populate root (/
) filesystem. Because
it’s often useful to edit this filesystem (especially to modify /default.prop
file), let’s look how we can manipulate this image. I already briefly described
how this can be done as part of my older post but now I’m going to
describe more advanced and standalone (you don’t need Android sources for it)
tool.
I assume that you have an image dump and it’s filename is /tmp/boot.img
. You
can dump it using commands like:
$ adb shell cat /dev/mtd/mtd0 >/mnt/sdcard/boot.img
$ adb pull /mnt/sdcard/boot.img /tmp/boot.img
You can read my older post to see how this can be done on Alcatel One Touch Fire.
Build abootimg tool
To do just about anything useful, you need proper tools. In this case, the tool
is called abootimg
. It’s quite easy to install:
git clone https://git.gitorious.org/ac100/abootimg.git
cd abootimg
make
This will create abootimg
executable which can be used right away (you don’t
have to copy it anywhere).
Extract boot.img content
In order to extract boot.img
, use -x
option followed with a path to the
file. This will create few files in the current directory:
mkdir boot
cd boot
../abootimg -x /tmp/boot.img
Edit ramdisk content
initrd.img
is a ramdisk file. It should be gzipped cpio file. To uncompress
it, use following command:
mkdir initrd
cd initrd
cat ../initrd.img | gunzip | cpio -vid
Then edit the files you want, most probably default.prop
. To recreate
ramdisk image, use:
cd initrd
find . | cpio --create --format='newc' | gzip > ../myinitrd.img
Repack boot.img
You may create new boot image using --create
option. You have to specify
config file (-f
option), kernel image (-k
option), and ramdisk image (-r
option):
../abootimg --create myboot.img -f bootimg.cfg -k zImage -r myinitrd.img
If you extracted existing boot.img
file, the config file was created for you.
I explain this file later.
You may also change boot.img
in place, using -u
option combined with -k
to change kernel image, -r
to change ramdisk image, -f
to change config
file or -c
to change specific config option only. For example to only change
ramdisk and set name
config option, you could use:
../abootimg -u /tmp/boot.img -c "name=rooted" -r myinitrd.img
Now you can boot this image with fastboot boot myboot.img
command or flash it
using fastboot flash myboot.img
.
Configuration file
You can get some basic information from the image without extracting it with
-i
option:
$ ../abootimg -i ~/BUILD/firefoxos/B2G-hamachi/hamachi-backup/boot.img
Android Boot Image Info:
* file name = /home/k/BUILD/firefoxos/B2G-hamachi/hamachi-backup/boot.img
* image size = 4616192 bytes (4.40 MB)
page size = 2048 bytes
* Boot Name = ""
* kernel size = 4274296 bytes (4.08 MB)
ramdisk size = 336854 bytes (0.32 MB)
* load addresses:
kernel: 0x00c5c004
ramdisk: 0x01f5c004
tags: 0x00c54104
* cmdline = androidboot.hardware=qcom loglevel=1
* id = 0x19964b91 0xd35aa078 0x953b011d 0x2804aab4 0xf7a3e4b3 0x00000000 0x00000000 0x00000000
Most of this information is stored in a bootimg.cfg
file and it’s used when
recreating the image file. In some cases, you may want to change them. Here’s
its example content:
$ cat bootimg.cfg
bootsize = 0xa00000
pagesize = 0x800
kerneladdr = 0xc5c004
ramdiskaddr = 0x1c54004
secondaddr = 0x1b54004
tagsaddr = 0xc54104
name =
cmdline = androidboot.hardware=qcom loglevel=1
-
bootsize
- size of the boot image; should be multiple ofpagesize
. It can never be smaller than the actual produced image file otherwise system won’t boot. You can remove this line andabootimage
will calculate it for you. Of course, this can’t be bigger than your boot partition on the device. -
pagesize
- it’s the size of a NAND page. You probably don’t want to change that. -
kerneladdr
,ramdiskaddr
,secondaddr
,tagsaddr
- specifies where in memory should each image be put byfastboot
when flashing the image. You may want to change this if you want to change kernel in your image.
Note that those addresses are only used when you flash the image (fastboot
flash
command), if you boot it (fastboot boot
) they will be calculated like
this (typical base
address is 0x10000000, it can be changed by -b
fastboot
parameter):
hdr->kernel_addr = base + 0x00008000;
hdr->ramdisk_addr = base + 0x01000000;
hdr->second_addr = base + 0x00F00000;
hdr->tags_addr = base + 0x00000100;
I believe that the base
address should be the same as CONFIG_PHYS_OFFSET
in your kernel config.
-
name
is not used by bootloader but it can be displayed with-i
option so you may want to use it to specify the purpose of each image, for example. -
cmdline
contains command line passed to the kernel.