经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
fs_tab文件的解析
来源:cnblogs  作者:liutimo  时间:2020/12/8 8:45:38  对本文有异议

fstab 文件保存在哪

按照android文档,Android 4.3 及更高版本,init、vold和recovery所用到的都是/fstab.<device>文件。但是在AndroidO 的中,似乎发生了变化。

fsmgr中,fstab 的来源有两个,一个是device tree中指定,另一个则是从fstab.<device>文件中加载。这两个来源的中的fstab配置最终会被合并到一起。

image-20201124200046658

  1. fstab 文件

    可以看出,AndroidO中配置 fstab文件的地方有三个: /odm/etc//vendor/etc//,优先级由大变小。

fstab. 中的 device 值就是属性 ro.boot.hardware 的值,如果没有配置该属性,就会去/proc/cmdline中读取hardware的值,还读不到就去查找 device tree。

image-20201124200547339

在Rockchip平台上,fstab.rk30board直接保存到了根目录。不太清楚为啥不按照安卓标准,放在/vendor/etc目录下面额。

  1. 设备树中的配置

    通过查看RK339的设备树文件,可以看到systemvendor分区的配置是在设备树中配置的。

    image-20201125000826082

解析fstab

fstab的基本格式如下:

  1. <src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: sysfs(/sys)下可以的设备的路径。路径必须以/开头,设备的实际路径是/sys$(src)
  • mnt_point: 设备挂载路径。
  • type: 该设备的上的卷的文件类型。
  • mnt_flags:Vold会忽略该字段,所以,对于由vold管理的设备,该字段可以设置为defaults
  • fs_mgr_flagsfs_mgr_flagsVold 会忽略此字段中不包含 voldmanaged= 标记的统一的 fstab 中的任何行。该标记必须后跟描述卡的标签,以及分区号或字词 auto。例如:voldmanaged=sdcard:auto

fs_msg中,使用 struct fstab来表示fstab文件中的数据,使用struct fstab_rec来表示fstab中的每一条记录。

  1. struct fstab {
  2. int num_entries; // fstab中的记录数
  3. struct fstab_rec* recs; // fstab中的所有条目
  4. char* fstab_filename; // fstab的文件路径
  5. };
  6. struct fstab_rec {
  7. char* blk_device; // 对一个 <src>
  8. char* mount_point; // 对应 <mnt_point>
  9. char* fs_type; // 对应 <type>
  10. unsigned long flags; // 对应 <mnt_flags>
  11. char* fs_options; // <mnt_flags>中未记录在struct flag_list mount_flags中的字段
  12. int fs_mgr_flags; // 对应 <fs_mgr_flags>
  13. // -----------------------------------------------------
  14. char* key_loc;
  15. char* key_dir;
  16. char* verity_loc;
  17. long long length; // length=
  18. char* label; // voldmanaged=sdcard:3 label=sdcard
  19. int partnum; // voldmanaged=sdcard:3 partnum = 3 auto partnum = 1
  20. int swap_prio; // swapprio=
  21. int max_comp_streams;
  22. unsigned int zram_size;
  23. uint64_t reserved_size;
  24. unsigned int file_contents_mode;
  25. unsigned int file_names_mode;
  26. unsigned int erase_blk_size;
  27. unsigned int logical_blk_size;
  28. };

struct fstab_rec的前6个,就分别对应fstab中记录项。后面的就是记录fs_mgr_flags中的参数的值。

struct fstab_rec->fs_options 比较特殊,其记录的是 mnt_flags中,未记录的参数类型。当执行mount的时候,他将直接作为参数传递过去。

  1. static struct flag_list mount_flags[] = {
  2. { "noatime", MS_NOATIME },
  3. { "noexec", MS_NOEXEC },
  4. { "nosuid", MS_NOSUID },
  5. { "nodev", MS_NODEV },
  6. { "nodiratime", MS_NODIRATIME },
  7. { "ro", MS_RDONLY },
  8. { "rw", 0 },
  9. { "remount", MS_REMOUNT },
  10. { "bind", MS_BIND },
  11. { "rec", MS_REC },
  12. { "unbindable", MS_UNBINDABLE },
  13. { "private", MS_PRIVATE },
  14. { "slave", MS_SLAVE },
  15. { "shared", MS_SHARED },
  16. { "defaults", 0 },
  17. { 0, 0 },
  18. };

从fstab文件解析

实际解析过程就是逐行解析,然后分割字符串。没啥好记录的,代码太长就不贴了。可以看一下解析函数:

  1. static struct fstab *fs_mgr_read_fstab_file(FILE *fstab_file) {
  2. // [1] 统计行数
  3. // [2] 分配 fstab 内存和 fstab_rec 内存
  4. // [3] 逐行解析
  5. }

从设备树解析

内核DTS中的配置,最终都会在目录/proc/device-tree下体现,android也有一些自有配置,其目录是/proc/device-tree/firmware/android。其中fstab就记录在该目录下(完整目录就是/proc/device-tree/firmware/android/fstab)。

结合前面的 DTS截图,最终fstab生成的目录结构如下:

  1. /proc/device-tree/firmware/android/fstab/
  2. system
  3. status
  4. dev
  5. type
  6. mnt_flags
  7. fsmgr_flags
  8. vendor
  9. status
  10. dev
  11. type
  12. mnt_flags
  13. fsmgr_flags

fs_mgr对其的解析过程就是遍历/proc/device-tree/firmware/android/fstab/,一次读取其每个子目录的所有节点数据,每个目录构建成一个<dev> <mnt_point> <type> <mnt_flags> <fsmgr_flags>\n形式的字符串。然后拼接。

image-20201125125137257

? 最后,将read_fstab_from_dt返回的字符串转换成FILE*调用函数fs_mgr_read_fstab_file完成解析。

image-20201125125338130

合并fstab

前面提到fs_mgr会将fstab文件和DTS中的配置信息合并。合并过程也很简单,就是创建一片内存,将两个部分的数据拷贝过去。

image-20201125125737739

如果 fstab文件和 DTS 中的 配置项存在重复,fs_mgr 是怎么处理。

原文链接:http://www.cnblogs.com/liutimo/p/14032429.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号