根文件系统是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,构建自己的根文件系统