首先我们知道init进程在运行时会调用自身,所以init进程分为stage1和stage2两个阶段,而分区挂载操作也分为两个阶段:

stage1挂载操作是利用device tree中的配置项来读取配置挂载的;stage2挂载操作则是我们常见的利用fstab配置文件来挂载的。

在Android O之后的版本中,我们知道很多ko被从kernel中提取出来,移动到system分区和vendor分区中保存。那么系统启动在服务加载之前首先需要把内核驱动模块全部加载起来才可以,所以我们的system分区和vendor分区必须要先挂载起来。

A/B system

我们知道使能了A/B system的系统,它的rootfs是集成到system.img中的,而kernel的运行必须要依赖rootfs,所以我们需要在很早就要把rootfs挂载起来,实际上UEFI在启动kernel的时候会通过cmdline传入参数告知rootfs所在分区,这样kernel就能够在一启动就可以挂载rootfs,也就是我们的system分区。熟悉嵌入式的应该知道cmdline中有root参数,比如CONFIG_CMDLINE=”root=/dev/mtdblock2…”

而对于vendor分区,由于其中包含很多厂商自己的ko,所以需要在init的stage1进行挂载,那么就需要在devicetree中进行挂载配置,init进程会去解析dtb中的相关信息并挂载对应的分区。

  • rootfs在system.img中,实际上system会被挂载到/目录上

  • system分区挂载信息有uefi通过cmdline传递给kernel,由kernel挂载

  • vendor分区挂载信息在dts中配置,并且有init stage1解析并挂载

Non A/B system

对于非A/B system的系统来说,rootfs是在boot.img中的,而决定rootfs在哪个分区,在android编译系统中有如下宏来决定的

BOARD_BUILD_SYSTEM_ROOT_IMAGE=false

如上所示,这样配置的系统,将会吧ramdisk编译到boot.img中。这样uefi启动时只需要传入boot.img中的ramdisk作为rootfs即可启动kernel。而对于其他非root分区的挂载则有init进程来完成。既然是init来完成,那么就涉及到stage1和stage2两个阶段了。

对于system/vendor这两个分区来说,由于其中包含有很多ko以及selinux配置,所以必须要在stage1完成挂载,然后才能进行后续的服务启动。所以system/vendor的挂载配置需要在devicetree中进行配置。

  • rootfs在boot.img中

  • system分区挂载信息在dts中配置,并且有init stage1解析并挂载

  • vendor分区挂载信息在dts中配置,并且有init stage1解析并挂载

devicetree分区配置

一般来说,我们理解的devicetree中的配置都是给kernel使用的,但是这里需要我们特别注意的是,devicetree中的分区配置并不是给kernel使用的,而是后续由init进程读取挂载分区的。

fstab中的问题

device/qcom/sdm660/fstab_AB_variant.qcom:

 #<src>                                               <mnt_point>        <type>  <mnt_flags and options>                            <fs_mgr_flags>/dev/block/bootdevice/by-name/system                    /                  ext4    ro,barrier=1,discard                           wait,slotselect,avb

由前文我们知道,在A/B system中,system挂载到根分区,是由UEFI传入分区配置来挂载的,在non A/B system中,system挂载在/system是由devicetree来配置完成的,无论是否采用A/B system,都不可能在fstab中挂载system分区。那么如上的配置项目为什么还存在与fstab中呢?实际上,在init/fs_mgr的实现中,它会检测并且过滤/目录的挂载,所以上述配置中的第一行实际上是没有起作用的。

备注:使能了A/B system的系统,rootfs都必须要放到system.img中,不管是哪个android版本。

system和vendor分区挂载解析(Android O)相关推荐

  1. RK3399 Android7/8 system vendor分区挂载参数

    以往Android系统,所有分区挂载都是修改fstab* 的文件,可能自从Android实现AB system后,ramdisk被打包在system里面后,system的挂载参数就不能在ramdisk ...

  2. android动态分区AB升级,Android A/B System OTA分析(四)系统的启动和升级

    Android从7.0开始引入新的OTA升级方式,A/B System Updates,这里将其叫做A/B系统,涉及的内容较多,分多篇对A/B系统的各个方面进行分析.本文为第四篇,系统的启动和升级. ...

  3. linux7设备的挂载,centos7磁盘分区与挂载解析

    Linux系统在磁盘.U盘以及光盘等设备分区和挂载操做才能使用.centos 1.磁盘分区原理与规则ui 磁盘分区类型:主分区,扩展分区,逻辑分区this 分区规则:centos7 一.主分区+扩展分 ...

  4. android8.1新建分区并挂载,Android8.1 MTK Vendor分区大小调整无效分析

    最近想修改一下MTK Vendor分区大小,结果被 坑.只能说MTK真的太laji. 查找资料,正规的流程是: 1.  device/mediatek/build/build/tools/ptgen/ ...

  5. 从源码角度解析Android中APK安装过程

    从源码角度解析Android中APK的安装过程 1. Android中APK简介 Android应用Apk的安装有如下四种方式: 1.1 系统应用安装 没有安装界面,在开机时自动完成 1.2 网络下载 ...

  6. 从源码解析-Android系统启动流程概述 init进程zygote进程SystemServer进程启动流程

    Android系统启动流程 启动流程 Loader Kernel Native Framework Application init进程 启动 rc文件规则 Actions Commands Serv ...

  7. 分区表修改和分区挂载流

    分区表修改和分区挂载流程总结 项目: MTK平台项目 二.分区的挂载 首先介绍fstab文件,这个文件描述系统中各种文件系统的信息,在这个文件中,每个文件系统用一行来描述,在每一行中,用空格或TAB符 ...

  8. Android程序暂停sh,init进程 解析Android启动脚本init.rc 修改它使不启动android init.rc中启动一个sh文件...

    Android启动后,系统执行的第一个进程是一个名称为init 的可执行程序.提供了以下的功能:设备管理.解析启动脚本.执行基本的功能.启动各种服务.代码的路径: system/core/init,编 ...

  9. 28. 文件挂载,卸载,mount,语法选项示例,挂载光盘,挂载分区,挂载u盘,挂载移动硬盘,卸载,fuser等使用和示例

    本章详细讲解:文件挂载,卸载,mount,语法选项示例,挂载光盘,挂载分区,挂载u盘,挂载移动硬盘,卸载,fuser的使用和示例 文章目录 mount 语法选项 fstab文件 /etc/fstab文 ...

最新文章

  1. 关肇直 automation lingjunrenwu
  2. 数学图形(1.32) 鸡蛋
  3. linux 报错 kernel: nf_conntrack: falling back to vmalloc 解决方法
  4. Linux jdk配置
  5. 推荐一些能提高生产力的 Python 库
  6. 数组中有一个数字出现的次数超过数组长度的一半
  7. 2018年第九届蓝桥杯C/C++ A组国赛 —— 第四题:约瑟夫环
  8. asp.net mvc 用Redis实现分布式集群共享Session。
  9. 可以直接进行运算么_WORD办公技巧:如何直接在WORD中进行加法、乘法运算?
  10. new/delete和malloc/free的区别一般汇总
  11. 爬虫-13-认识代理
  12. JZOJ 1667【AHOI2009】中国象棋——dp
  13. c语言 字符串字符反向储存_C ++中的反向字符串
  14. 【OpenCV入门教程之六】 创建Trackbar 图像对比度、亮度值调整(转)
  15. 焊接工时简便计算工具_焊接工时计算表
  16. Nacos中Distro协议梳理
  17. PhotoShop 之移动选区
  18. UIautomator2:APP自动化测试方法与小技巧记录(文末附实用APP测试脚本编写模板)
  19. 拉网小调(民歌介绍)
  20. python展望_python学习的一点随想与展望

热门文章

  1. 超算对我们的生活有着什么样的影响?
  2. 居家办公小妙招、前后端在远程服务器上部署完成后怎么启动?
  3. 三相有功无功电流检测方法
  4. Linux下CGroup进行CPU内存等资源控制
  5. javaScript算术题(经典案例)
  6. #小何不断努力#8.18
  7. java 将set转成数组,Java程序将Set转换为数组
  8. Nginx 优化及原理
  9. JVM之运行时数据区(方法区)
  10. MySQL索引底层实现原理 MyISAM非聚簇索引 vs. InnoDB聚簇索引