/* NOTES ** ** - see buffer-format.txt from the linux kernel docs for ** an explanation of this file format ** - dotfiles are ignored ** - directories named 'root' are ignored ** - device notes, pipes, etc are not supported (error) */
上面的信息说明了如下几点:
The full format of the initramfs buffer is defined by the following grammar, where: * is used to indicate "0 or more occurrences of" (|) indicates alternatives + indicates concatenation GZIP() indicates the gzip(1) of the operand ALGN(n) means padding with null bytes to an n-byte boundary initramfs := ("\0" | cpio_archive | cpio_gzip_archive)* cpio_gzip_archive := GZIP(cpio_archive) cpio_archive := cpio_file* + (<nothing> | cpio_trailer) cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data cpio_trailer := ALGN(4) + cpio_header + "TRAILER!!!\0" + ALGN(4)
2. 名为"."的文件会被忽略,不会进行打包。
lib_path=`readlink -f ./lib` bin_path=`readlink -f ./bin/` export LD_LIBRARY_PATH=${lib_path}:$LD_LIBRARY_PATH export PATH=${bin_path}:$PATH rm -f ramdisk.img ramdisk.cpio rm -rf ./tmp/ # pack pushd rootfs2 mkbootfs -f ../config.txt . | minigzip > ../ramdisk.img mkbootfs -f ../config.txt . > ../ramdisk.cpio popd # unpack mkdir -p tmp pushd tmp cpio -i < ../ramdisk.cpio popd
其中config.txt是一个配置文件,内容如下:
etc/init.d/rcS 0 0 0755 0 0 0744
第1行,把"etc/init.d/rcS"文件的uid设置为0,gid设置为0,权限设置为0755
/* Rules for directories. ** These rules are applied based on "first match", so they ** should start with the most specific path and work their ** way up to the root. */ static const struct fs_path_config android_dirs[] = { { 00770, AID_SYSTEM, AID_CACHE, 0, "cache" }, { 00500, AID_ROOT, AID_ROOT, 0, "config" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/app" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/app-private" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/app-ephemeral" }, { 00771, AID_ROOT, AID_ROOT, 0, "data/dalvik-cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/data" }, { 00771, AID_SHELL, AID_SHELL, 0, "data/local/tmp" }, { 00771, AID_SHELL, AID_SHELL, 0, "data/local" }, { 01771, AID_SYSTEM, AID_MISC, 0, "data/misc" }, { 00770, AID_DHCP, AID_DHCP, 0, "data/misc/dhcp" }, { 00771, AID_SHARED_RELRO, AID_SHARED_RELRO, 0, "data/misc/shared_relro" }, { 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media" }, { 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media/Music" }, { 00750, AID_ROOT, AID_SHELL, 0, "data/nativetest" }, { 00750, AID_ROOT, AID_SHELL, 0, "data/nativetest64" }, ... ...
针对其他文件的规则:
static const struct fs_path_config android_files[] = { { 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.rc" }, { 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.sh" }, { 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.ril" }, { 00555, AID_ROOT, AID_ROOT, 0, "system/etc/ppp/*" }, { 00555, AID_ROOT, AID_ROOT, 0, "system/etc/rc.*" }, { 00440, AID_ROOT, AID_ROOT, 0, "system/etc/recovery.img" }, { 00444, AID_ROOT, AID_ROOT, 0, conf_dir + 1 }, { 00444, AID_ROOT, AID_ROOT, 0, conf_file + 1 }, { 00644, AID_SYSTEM, AID_SYSTEM, 0, "data/app/*" }, { 00644, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media/*" }, { 00644, AID_SYSTEM, AID_SYSTEM, 0, "data/app-private/*" }, { 00644, AID_SYSTEM, AID_SYSTEM, 0, "data/app-ephemeral/*" }, { 00644, AID_APP, AID_APP, 0, "data/data/*" }, { 00640, AID_ROOT, AID_SHELL, 0, "data/nativetest/tests.txt" }, { 00640, AID_ROOT, AID_SHELL, 0, "data/nativetest64/tests.txt" }, ... ...
kernel_dir=./Linux-4.14.13 kernel_image=${kernel_dir}/arch/arm/boot/zImage dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb qemu_path=/home/pengdonglin/disk_ext/Qemu/qemu-3.1.0/build/install/bin ${qemu_path}/qemu-system-arm \ -M vexpress-a9 \ -m 1024M \ -smp 1 \ -kernel ${kernel_image} \ -nographic \ -append "root=/dev/ram0 rw rootfstype=ramfs console=ttyAMA0 init=/init ignore_loglevel" \ -initrd ./rootfs/ramdisk.img \ -dtb ${dtb_image}
[ 0.609270] Trying to unpack rootfs image as initramfs... [ 0.965940] Freeing initrd memory: 3616K
kernel_dir=./Linux-4.14.13 kernel_image=${kernel_dir}/arch/arm/boot/zImage dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb qemu_path=/home/pengdonglin/disk_ext/Qemu/qemu-3.1.0/build/install/bin ${qemu_path}/qemu-system-arm \ -M vexpress-a9 \ -m 1024M \ -smp 1 \ -kernel ${kernel_image} \ -nographic \ -append "root=/dev/ram0 rw rootfstype=ramfs console=ttyAMA0 init=/init ignore_loglevel" \ -initrd ./rootfs/ramdisk.cpio \ -dtb ${dtb_image}
[ 0.610055] Trying to unpack rootfs image as initramfs... [ 0.760468] Freeing initrd memory: 7040K
GEN usr/initramfs_data.cpio.gz GZIP kernel/config_data.gz CHK kernel/config_data.h UPD kernel/config_data.h CC kernel/configs.o AR kernel/built-in.o AS usr/initramfs_data.o AR usr/built-in.o
/bin/bash ./scripts/gen_initramfs_list.sh -o usr/initramfs_data.cpio.gz -u 0 -g 0 /home/pengdonglin/disk_ext/Qemu/aarch32/rootfs/rootfs
kernel_dir=./Linux-4.14.13 kernel_image=${kernel_dir}/arch/arm/boot/zImage dtb_image=${kernel_dir}/arch/arm/boot/dts/vexpress-v2p-ca9.dtb qemu_path=/home/pengdonglin/disk_ext/Qemu/qemu-3.1.0/build/install/bin ${qemu_path}/qemu-system-arm \ -M vexpress-a9 \ -m 1024M \ -smp 1 \ -kernel ${kernel_image} \ -nographic \ -append "root=/dev/ram0 rw rootfstype=ramfs console=ttyAMA0 init=/init ignore_loglevel" \ -dtb ${dtb_image}
185 #!/bin/sh 186 187 # Copyright 2006 Rob Landley <rob@landley.net> and TimeSys Corporation. 188 # Licensed under GPL version 2 189 190 if [ $# -ne 2 ] 191 then 192 echo "usage: mkinitramfs directory imagename.cpio.gz" 193 exit 1 194 fi 195 196 if [ -d "$1" ] 197 then 198 echo "creating $2 from $1" 199 (cd "$1"; find . | cpio -o -H newc | gzip) > "$2" 200 else 201 echo "First argument must be a directory" 202 exit 1 203 fi