Android 14 vold 分析(1)启动

1.启动

它是从rc文件中启动的,rc文件是second stage init才会解析的,也就是说vold主要作用做second stage mount,那first stage mount是怎么做的呢,第一阶段实际上直接调用的是fs_mgr进行的mount,fs_mgr_do_mount_one()

system/core/rootdir/init.rc
584 on early-fs
585     # Once metadata has been mounted, we'll need vold to deal with userdata checkpointing
586     start vold
2. vold main()分析 这里省略不中要的代码

65  int main(int argc, char** argv) {
....
74      LOG(DEBUG) << "Detected support for:"   ---> 这里log输出内核支持的文件系统,结果来自/proc/filesystems见2.1
75                 << (android::vold::IsFilesystemSupported("ext4") ? " ext4" : "")
76                 << (android::vold::IsFilesystemSupported("f2fs") ? " f2fs" : "")
77                 << (android::vold::IsFilesystemSupported("vfat") ? " vfat" : "")
78                 << (android::vold::IsFilesystemSupported("texfat") ? " texfat" : "")
79                 << (android::vold::IsFilesystemSupported("exfat") ? " exfat" : "");
80  
81      VolumeManager* vm;                      ---> vold中两个主要的组件VolumeManager和NetlinkManager
82      NetlinkManager* nm;                     ---> VolumeManager负责volume的管理, NetlinkManager 负责block device uevent的管理
.........  
93      mkdir("/dev/block/vold", 0755);
94  
95      /* For when cryptfs checks and mounts an encrypted filesystem */
96      klog_set_level(6);                  ---> 设置kernel log输出level 默认是KLOG_INFO_LEVEL = 6
97  
98      /* Create our singleton managers */
99      if (!(vm = VolumeManager::Instance())) {    ---> 为 VolumeManager 创建实例
100          LOG(ERROR) << "Unable to create VolumeManager";
101          exit(1);
102      }
103  
104      if (!(nm = NetlinkManager::Instance())) {   ---> 为 NetlinkManager 创建实例
105          LOG(ERROR) << "Unable to create NetlinkManager";
106          exit(1);
107      }
108  
109      if (android::base::GetBoolProperty("vold.debug", false)) { ---> vold.debug可以用来打开log, 用作显示block device uevent的发生
110          vm->setDebug(true);
111      }
112  
113      if (vm->start()) {            --->  VolumeManager 做初始化的操作
114          PLOG(ERROR) << "Unable to start VolumeManager";
115          exit(1);
116      }
117  
118      VoldConfigs configs = {};
119      if (process_config(vm, &configs)) {  --->  获取volume的config信息, 其实config信息解析自fstab中的flags,见2.2
120          PLOG(ERROR) << "Error reading configuration... continuing anyways";
121      }
122  
123      android::hardware::configureRpcThreadpool(1, false /* callerWillJoin */);
124  
125      ATRACE_BEGIN("VoldNativeService::start");  --->  VoldNativeService是Ivold的实现,作为binder server,创建实例并加入到ServiceManager里
126      if (android::vold::VoldNativeService::start() != android::OK) {
127          LOG(ERROR) << "Unable to start VoldNativeService";
128          exit(1);
129      }
130      ATRACE_END();
131  
132      LOG(DEBUG) << "VoldNativeService::start() completed OK";
133  
134      ATRACE_BEGIN("NetlinkManager::start");
135      if (nm->start()) {                --->  NetlinkManager 做初始化的操作
136          PLOG(ERROR) << "Unable to start NetlinkManager";
137          exit(1);
138      }
139      ATRACE_END();
140  
141      // This call should go after listeners are started to avoid
142      // a deadlock between vold and init (see b/34278978 for details)  ---> 从volume的config信息设置property
143      android::base::SetProperty("vold.has_adoptable", configs.has_adoptable ? "1" : "0");
144      android::base::SetProperty("vold.has_quota", configs.has_quota ? "1" : "0");
145      android::base::SetProperty("vold.has_reserved", configs.has_reserved ? "1" : "0");
146      android::base::SetProperty("vold.has_compress", configs.has_compress ? "1" : "0");
147  
148      // Do coldboot here so it won't block booting,
149      // also the cold boot is needed in case we have flash drive
150      // connected before Vold launched
151      coldboot("/sys/block");      ---> 重新触发一下block device uevent和init进程的RegenerateUevents()类似,见2.3
152  
153      ATRACE_END();    
154  
155      android::IPCThreadState::self()->joinThreadPool();  ------> 开启主线程 binder looper
156      LOG(INFO) << "vold shutting down";
157  
158      exit(0);
159  }
    2.1 cat proc/filesystems nodev代表vfs, 好多啊 头大 搞那么多VFS我是真的服
    nodev    sysfsnodev    tmpfsnodev    bdevnodev    procnodev    cgroupnodev    cgroup2nodev    cpusetnodev    binfmt_miscnodev    configfsnodev    debugfsnodev    tracefsnodev    securityfsnodev    sockfsnodev    bpfnodev    pipefsnodev    ramfsnodev    devptsext3ext2ext4vfatmsdosexfatfuseblknodev    fusenodev    fusectlnodev    virtiofsnodev    overlaynodev    incremental-fsf2fserofsnodev    selinuxfsnodev    bindernodev    pstorenodev    functionfs

    2.2 process_config()
    229  static int process_config(VolumeManager* vm, VoldConfigs* configs) {230      ATRACE_NAME("process_config");231  232      if (!ReadDefaultFstab(&fstab_default)) {  -------> 读取fstab233          PLOG(ERROR) << "Failed to open default fstab";234          return -1;235      }236  237      /* Loop through entries looking for ones that vold manages */238      configs->has_adoptable = false;239      configs->has_quota = false;240      configs->has_reserved = false;241      configs->has_compress = false;242      for (auto& entry : fstab_default) {243          if (entry.fs_mgr_flags.quota) {244              configs->has_quota = true;245          }246          if (entry.reserved_size > 0) {247              configs->has_reserved = true;  --------> userdata分区是有reserved size的,所以你的手机存储满了还是可以运行的248          }249          if (entry.fs_mgr_flags.fs_compress) {250              configs->has_compress = true;251          }252  253          /* Make sure logical partitions have an updated blk_device. */254          if (entry.fs_mgr_flags.logical && !fs_mgr_update_logical_partition(&entry) &&255              !entry.fs_mgr_flags.no_fail) {256              PLOG(FATAL) << "could not find logical partition " << entry.blk_device;257          }258  259          if (entry.mount_point == "/data" && !entry.metadata_key_dir.empty()) {260              // Pre-populate userdata dm-devices since the uevents are asynchronous (b/198405417).261              android::vold::defaultkey_precreate_dm_device();  ------> 这个好像有点内容,我还没看262          }263  264          if (entry.fs_mgr_flags.vold_managed) {  ----> 就两个 /storage/sdcard1  /storage/usbotg  wait,voldmanaged=sdcard1:auto265              if (entry.fs_mgr_flags.nonremovable) {266                  LOG(WARNING) << "nonremovable no longer supported; ignoring volume";267                  continue;268              }269  270              std::string sysPattern(entry.blk_device);271              std::string nickname(entry.label);272              int flags = 0;273  274              if (entry.is_encryptable()) {275                  flags |= android::vold::Disk::Flags::kAdoptable;   ----> sdcard 作为adoptable storage, 能卡死..呵呵..笑了276                  configs->has_adoptable = true;277              }278              if (entry.fs_mgr_flags.no_emulated_sd ||279                  android::base::GetBoolProperty("vold.debug.default_primary", false)) {280                  flags |= android::vold::Disk::Flags::kDefaultPrimary;281              }282  283              vm->addDiskSource(std::shared_ptr<VolumeManager::DiskSource>( ----> 申明voldmanaged的这俩,被vm添加到了mDisksource284                  new VolumeManager::DiskSource(sysPattern, nickname, flags)));285          }286      }287      return 0;288  }
    2.3 do_coldboot()
 
    188  static void do_coldboot(DIR* d, int lvl) {189      struct dirent* de;190      int dfd, fd;191  192      dfd = dirfd(d);193  194      fd = openat(dfd, "uevent", O_WRONLY | O_CLOEXEC);195      if (fd >= 0) {196          write(fd, "add\n", 4);  --------> 因为vold启动前就已经有block device add了,所以需要重新触发 add block device uevent197          close(fd);198      }199  200      while ((de = readdir(d))) {201          DIR* d2;202  203          if (de->d_name[0] == '.') continue;204  205          if (de->d_type != DT_DIR && lvl > 0) continue;206  207          fd = openat(dfd, de->d_name, O_RDONLY | O_DIRECTORY | O_CLOEXEC);208          if (fd < 0) continue;209  210          d2 = fdopendir(fd);  211          if (d2 == 0)212              close(fd);213          else {214              do_coldboot(d2, lvl + 1); --------> sys/block/没有找到uevent文件,递归往子目录查找215              closedir(d2);216          }217      }218  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云原生:5分钟了解一下Kubernetes是什么

在当今的云计算时代&#xff0c;容器化技术变得越来越重要。它能够帮助开发者更高效地部署和管理应用程序。而Kubernetes&#xff0c;作为容器编排领域的领军者&#xff0c;正逐渐成为企业构建和管理云原生应用的核心工具。 近期将持续为大家分享Kubernetes相关知识&#xff…

【C语言】共用体union

【C语言】共用体union&#xff1a; 也称联合体。同一个内存空间用于多个数据的存储。同一时间只能存储一个成员数据。使用内存覆盖技术。新的成员数据会覆盖原来的成员数据。内存大小是最大的成员占用内存大小&#xff0c;且是最大对齐数的整数倍&#xff0c;若不足整数倍&…

sql基础语法

sql基础语法 1. 什么是MySQL1.1 RDBMS 特点1.2 sql分类1.3 数据类型1.4 适应MySQL 2. 代码顺序与后台执行顺序2.1 代码撰写顺序2.2 后台执行顺序 3. 基础查询4. 条件检索5. 分组6. 多表查询6.1 子查询&#xff08;几乎不用&#xff09;6.2 连接查询 7. 常用函数 前同事培训过相…

GitHub 仓库 (repository) Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub 仓库 [repository] Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clo…

前端处理axios请求下载后端返回的文件流

需求&#xff1a;点击按钮下载文件&#xff0c;请求后端接口&#xff0c;后端返回文件流&#xff0c;如果遇到错误信息并不能简单的res.message拿到错误提示&#xff0c;而且想要正常下载前端也需要做些处理。 1.请求接口要加上响应类型为blob&#xff0c; responseType: ‘blo…

FreeGPT3.5 开源软件

GPT-3.5不需要付费&#xff0c;也不需要注册用户&#xff0c;可以直接使用了&#xff0c;官方彻底开放了API接口。 该API政策一放开&#xff0c;GitHub很快就已经出现了一个开源项目FreeGPT35&#xff0c;可以自动生成key调用GPT3.5的API接口&#xff0c;再也用不着注册账号和申…

服务器数据恢复—V7000存储raid5数据恢复案例

服务器数据恢复环境&#xff1a; P740AIXSybaseV7000存储阵列柜&#xff0c;阵列柜上有12块SAS机械硬盘&#xff08;包括1块热备盘&#xff09;。 服务器故障&#xff1a; 管理员在日常巡检过程中发现阵列柜中有一块磁盘发生故障&#xff0c;于是更换磁盘并同步数据&#xff0…

二分法(蓝桥杯Python组)

二分法 二分法(Binary Search)主要用于在有序数组中搜索恰好满足某一边界条件的元素。如果题目所求的答案具有是或者不是两种状态&#xff0c;则说明其可能是二分法的题目。同时还需要注意蓝桥杯通常不会直接出题考察二分法&#xff0c;而是将其内嵌到其他算法中联合考察&#…

kafka客户端常用命令

kafka-topics.sh 相关的命令 Command Usage: create: enable rack strategy: kafka-topics.sh --create --topic --partitions <Integer: the number of partitions> --replication-factor <Integer: replication factor> --zookeeper <ZK_IP1:ZK_PORT,ZK_IP2:…

快速熟悉torchdiffeq用法,从数理逻辑到完整案例【第二部分】

本系列文章板块规划 提示&#xff1a;以下内容仅为个人学习感悟&#xff0c;无法保证完全的正确和权威&#xff0c;大家酌情食用谢谢。 第一部分 torchdiffeq背后的数理逻辑 第二部分 torchdiffeq的基本用法 第三部分 trochdiffeq的升级用法 第四部分 torchdifffeq的案例和代码…

C++11:function包装器

包装器&#xff0c;体现了C11中的封装性&#xff0c;包装器可以应用于&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda 而包装器function的出现刚好也弥补了上述三种语法的不足之处 函数指针写起来较为复杂&#xff0c;而仿函数之间类型不同&#xff0c;lambda则在…

数学建模笔记(10)整数规划和0-1规划

前由 显然通关次数不能是小数&#xff0c;这就涉及到了整数问题。 定义 例题

最新mysql8.3 保姆级 主从复制搭建教程

mysql 主从复制搭建 服务器配置表 机器ip操作系统主机192.168.31.25华为openEuler-22.03-LTS-SP3从机192.168.31.184华为openEuler-22.03-LTS-SP3从机192.168.31.228华为openEuler-22.03-LTS-SP3 1、在3台机器上安装独立的 mysql 1.1 创建myql文件夹用来存放mysql包 mkdir…

python-可视化篇-turtle-画爱心

文章目录 原效果替换关键字5为8&#xff0c;看看效果改下颜色 原效果 import turtle as tt.color(red,pink) t.begin_fill() t.width(5) t.left(135) t.fd(100) t.right(180) t.circle(50,-180) t.left(90) t.circle(50,-180) t.right(180) t.fd(100) t.pu() t.goto(50,-30) t…

开发语言漫谈-C#

C#的#&#xff0c;字面上的意思就是&#xff0c;也就是把C再。微软只所以搞C#就是要抗衡Java。微软当时搞了个J&#xff0c;被Java告了&#xff0c;没办法了只能另取炉灶。从纯技术角度来看&#xff0c;C#设计非常优秀&#xff0c;可以覆盖所有领域&#xff0c;是几乎唯一的全栈…

【用户案例】太美医疗基于Apache DolphinScheduler的应用实践

大家好&#xff0c;我叫杨佳豪&#xff0c;来自于太美医疗。今天我为大家分享的是Apache DolphinScheduler在太美医疗的应用实践。今天的分享主要分为四个部分&#xff1a; 使用历程及选择理由稳定性的改造功能定制与自动化部署运维巡检与优化 使用历程及选择理由 公司介绍 …

.Net <% %>

<% %> 语法 : <% import namespace"system.data"%> 用来导入后台命名空间 指令用于指定当页和用户控件编译器处理 ASP.NET Web 窗体页 (.aspx) 和用户控件 (.ascx) 文件时所使用的设置。<% %> 语法 : <% name %> <% getstr() %&g…

修改el-button按钮背景色后,按钮失去了elementUI原有的hover和active的效果

应完整修改为&#xff1a; <el-button type"primary" icon"el-icon-plus" click"addUser">新增用户</el-button>.el-button--primary:not(.is-disabled) {background-color: #1174de;border-color: #1174de;&:hover {&:not…

尝试在手机上运行google 最新开源的gpt模型 gemma

Gemma介绍 Gemma简介 Gemma是谷歌于2024年2月21日发布的一系列轻量级、最先进的开放语言模型&#xff0c;使用了与创建Gemini模型相同的研究和技术。由Google DeepMind和Google其他团队共同开发。 Gemma提供两种尺寸的模型权重&#xff1a;2B和7B。每种尺寸都带有经过预训练&a…

【iOS ARKit】AR Quick Look 概述

为更好地传播共享 AR 体验&#xff0c;苹果公司引入了 AR Quick Look&#xff0c;并在iOS 12及以上版本系统中深度集成了 AR Quick Look&#xff0c;因此可以通过iMessage、Mail、Notes、 News、 Safari 和 Files 直接体验 AR&#xff0c;AR Quick Look提供了在 iPhone 和iPad …