根文件系统是Linux系统一种特殊的文件系统,Android是基于Linux的,当然也根文件系统,那么在Android平台上,根文件系统是如何实现的呢?

1,Android是使用busybox构建根文件系统

Linux Kernel需要一个根文件系统来启动用户程序init,这个最根本的文件系统叫做根文件系统。不单纯是Android,所有其它的基于Linux Kernel的系统都需要这个根文件系统,在Android系统中,它的表现为:

  • 在uboot bootargs中表现为ramfs
bootargs=rootfstype=ramfs init=/init console=ttyS0,115200

  • 在系统中,挂载为rootfs
rootfs / rootfs

那么ramfs与rootfs又是什么关系?

其实,ramfs是一类文件系统,像tmpfs,procfs等等都是属于ramfs,指是没有实际存储设备的一种内存文件系统。rootfs是ramfs的一种。

2,Android是如何构建rootfs的?

Android是通过使用busybox这个开源系统来构建根文件系统的。代码位于external/busybox。busybox在很多嵌入式系统使用为根文件系统。是一个跨平台,很优秀的开源项目。具体可以参考(https://www.busybox.net/ )。Android使用的busybox是一个bionic分支,应该是Android平台上的一个移植版本。

WARNING : THIS IS A BIONIC VERSION OF BUSYBOX, DO NOT USE “make” IN THIS TREE

编译这个目录会在out目录生成一个可执行文件busybox。

执行INSTALL之后,会在out目录生成一个root/文件夹,以及一些这个文件夹下面最基本几个目录。

...
drwxrwxr-x  2 xugangfeng xugangfeng   4096 11月 23 13:37 system
drwxrwxr-x  2 xugangfeng xugangfeng   4096 11月 23 13:37 sys
drwxrwxr-x  2 xugangfeng xugangfeng   4096 12月  5 15:07 sbin
drwxrwxr-x  2 xugangfeng xugangfeng   4096 11月 23 13:37 proc
drwxrwxr-x  2 xugangfeng xugangfeng   4096 11月 23 13:37 oem
drwxrwxr-x  2 xugangfeng xugangfeng   4096 11月 23 13:38 boot
...

?具体如何安装生成的?

当Android的系统系统编译其它目录时,像system/core/init/就会直接把Init可执行文件安装到root目录下面。

整个源码编译完成之后,就执行打包程序,把root/目录打包成一个ramdisk.img的镜像文件,最后会跟Kernel Image一起打包到boot.img里面去。在out目录,也能看到ramdisk.img。

在device下面的项目Kernel.mk里面可以看到打包的过程

...
 99 .PHONY: bootimage-quick
100 bootimage-quick: $(INTERMEDIATES_KERNEL)
101     cp -v $(INTERMEDIATES_KERNEL) $(INSTALLED_KERNEL_TARGET)
102     out/host/linux-x86/bin/mkbootfs $(PRODUCT_OUT)/root | 
103     out/host/linux-x86/bin/minigzip > $(PRODUCT_OUT)/ramdisk.img                                                                                                                         
104     out/host/linux-x86/bin/mkbootimg  --kernel $(INTERMEDIATES_KERNEL) 
105         --base 0x0 
106         --kernel_offset 0x1080000 
107         --ramdisk $(PRODUCT_OUT)/ramdisk.img 
108         $(BOARD_MKBOOTIMG_ARGS) 
109         --output $(PRODUCT_OUT)/boot.img
110     ls -l $(PRODUCT_OUT)/boot.img
111     echo "Done building boot.img"
...

3,Hack Ramdisk.img文件,用如下的步骤就能把ramdisk.img解压成root/目录了,修改一些文件,然后压缩即可。

解压缩命令
1)mv ramdisk.img ramdisk.img.gz                             //  gunzip 默认文件名必须为 .gz 后缀, 因此需要重命名为 .gz
2)  gunzip ramdisk.img.gz                                            //  将解压缩生成  ramdisk.img 文件
3)  mkdir  ramdisk_decompress
4) cd ramdisk_decompress
5) cpio -i -F ../ramdisk.img                                            // 所有ramdisk 文件将被解压在   ramdisk_decompress 目录
重新压缩生成 ramdisk.img
6)cpio -i -t -F ramdisk.img > list                                  //生成 ramdisk 文件列表
7)cpio -o -H newc -O ramdisk_new.img < list            // 生成新的 ramdisk
8)  gzip ramdisk_new.img  
9)  mv ramdisk_new.img.gx  ramdisk.img                    // 生成最终可以下载使用的 ramdisk.img

4,构建自己的根文件系统