Android根文件系统初识

Android根文件系统初识

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

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

Linux Kernel需要一个根文件系统来启动用户程序init,这个最根本的文件系统叫做根文件系统。不单纯是Android,所有其它的基于Linux Kernel的系统都需要这个根文件系统,在Android系统中,它的表现为:
  • 在uboot bootargs中表现为ramfs
        bootargs=rootfstype=ramfs init=/init console=ttyS0,115200
  • 在系统中,挂载为rootfs
        rootfs / rootfs ro,seclabel 0 0
那么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/文件夹,以及一些这个文件夹下面最基本几个目录。
  1. ...
  2. drwxrwxr-x 2 xugangfeng xugangfeng 4096 11 23 13:37 system
  3. drwxrwxr-x 2 xugangfeng xugangfeng 4096 11 23 13:37 sys
  4. drwxrwxr-x 2 xugangfeng xugangfeng 4096 12 5 15:07 sbin
  5. drwxrwxr-x 2 xugangfeng xugangfeng 4096 11 23 13:37 proc
  6. drwxrwxr-x 2 xugangfeng xugangfeng 4096 11 23 13:37 oem
  7. drwxrwxr-x 2 xugangfeng xugangfeng 4096 11 23 13:38 boot
  8. ...
?具体如何安装生成的?
当Android的系统系统编译其它目录时,像system/core/init/就会直接把Init可执行文件安装到root目录下面。
整个源码编译完成之后,就执行打包程序,把root/目录打包成一个ramdisk.img的镜像文件,最后会跟Kernel Image一起打包到boot.img里面去。在out目录,也能看到ramdisk.img。
在device下面的项目Kernel.mk里面可以看到打包的过程
  1. ...
  2. 99 .PHONY: bootimage-quick
  3. 100 bootimage-quick: $(INTERMEDIATES_KERNEL)
  4. 101 cp -v $(INTERMEDIATES_KERNEL) $(INSTALLED_KERNEL_TARGET)
  5. 102 out/host/linux-x86/bin/mkbootfs $(PRODUCT_OUT)/root |
  6. 103 out/host/linux-x86/bin/minigzip > $(PRODUCT_OUT)/ramdisk.img
  7. 104 out/host/linux-x86/bin/mkbootimg --kernel $(INTERMEDIATES_KERNEL)
  8. 105 --base 0x0
  9. 106 --kernel_offset 0x1080000
  10. 107 --ramdisk $(PRODUCT_OUT)/ramdisk.img
  11. 108 $(BOARD_MKBOOTIMG_ARGS)
  12. 109 --output $(PRODUCT_OUT)/boot.img
  13. 110 ls -l $(PRODUCT_OUT)/boot.img
  14. 111 echo "Done building boot.img"
  15. ...
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,构建自己的根文件系统
TODO
http://whiteboard.ping.se/Android/Debian
TOP