Android系统中确保/system文件系统重启后初始化的机制分析与解决方法

12次阅读
没有评论

问题描述

最近遇到了一个令人困惑的问题。我有两台根后的Android 10三星设备。在这些设备上按照网上提供的指南使用了自解压恢复来创建和运行/system/etc/init/custom.rc文件,但由于某些原因,一台设备更改的文件会在重启后仍然保持不变,然而另一台设备则不会如此。重启至恢复模式可以保留之前做的改变。
问题核心在于理解是哪个层或特性使得这种现象发生,并且提供一个解决方案。

解决方案

请注意以下操作存在一定的安全风险,请备份重要数据后再按照步骤操作。

方案1:解决系统文件在重启后未更新的问题

操作步骤:

  1. 检查FEC功能
  2. 根据评论中的信息,怀疑是FEC(Forward Error Correction)导致了这一问题。但最终确定FEC配置与本次现象没有直接关联。
  3. 修改boot.img/ramdisk/fstab.qcom文件
    bash
    avbtool remove --name custom_avb --location 0 --file_path /system/etc/init/custom.rc --output_file /path/to/boot.img

    上述命令旨在移除avb验证检查,这解决了重启后文件未被更新的问题。

深入理解

  • Kernel和Stock Recovery的机制
  • Android系统使用了AVB2.0对 /system分区进行保护。avb工具通过校验文件的方式确认分区的一致性及完整性。
  • 当修改后恢复模式下重新读取,由于avb机制的存在,使得变更被自动回退至预设值。

  • System功能分析

  • 若未经过正确验证过程更改系统文件,即使操作成功了(例如创建新的rc 文件),AVB也会确保重启后对系统的配置进行复原。

方案2:手动管理恢复文件

通过其他方式处理

如果不想改动内核或系统文件的结构,可以通过在ramdisk中直接编辑相关配置来尝试解决此问题。

# 备份原有fstab.qcom内容
cp /path/to/origin/fstab.qcom /path/to/temporary/fstab.qcom_backup

# 编辑fstab.qcom进行必要的变动(例如添加或修改路径)
sed '/system/etc/init/custom\/rc/a 0    /system   ext4  ro,barrier=1  0  0' /path/to/fstab.qcom

上述方法中,手动调整fstab.qcom来确保正确的文件系统挂载顺序及权限。

总结与建议

  • 在进行任何重要系统的操作之前务必检查并备份相关数据。
  • 目前,通过移除某些avb验证或调整相关配置能够有效解决重启后文件未被更改为预设值的问题。但具体选择哪种方法应根据实际情况决定。
  • 对于系统更新频繁的设备而言,在开发阶段了解这些底层机制十分关键,以避免后续可能出现不可预测的行为。

正文完