解决方案
问题概况
您拥有一个64MB的EXT4格式磁盘镜像文件,并尝试通过环形设备进行挂载和写入操作。尽管e2fsck
检测没有发现问题,但在实际挂载过程中遇到的问题却阻碍了您的工作流程。尤其在读取(mount)和写入之间存在着明显的权限问题,表现为系统在您试图写入数据时将其切换为只读模式。
问题排查
根据提供的信息,已经进行了多方面的检查:
- 文件的访问权限。
- 环形设备(块设备)及目的目录本身的访问权限。
- 手动创建环形设备的操作,并使用
losetup
进行设置配置。 - 调试参数和选项,以及SELinux策略的支持模式。
然而,尽管这些尝试未能解决问题,您还发现了在存储路径位于 /sdcard
或者 mount
操作发生在Zygote启动或在恢复模式中时的情况有所不同,并且只能够在某些特定条件下(如通过 sdcardfs
文件系统挂载)成功实现写入操作。
SELinux 与 vold 的影响
进一步的测试揭示了问题可能与SELinux策略以及 vold
服务和文件系统的配置有关。关键点包括:
- 目标设备与能够正常工作设备之间的SELinux策略差异,在某些关键上下文下可能缺少必要的许可规则。
- 尽管一些尝试通过修改目标路径的权限尝试解决,但并未取得成功。
解决步骤建议
鉴于上述问题情况,以下是一些建议来解决您遇到的问题:
深入分析 SELinux 策略:进一步检查SELinux策略文档或使用
sestatus -v
命令获取详细信息,了解设备与正常工作的设备之间的主要差别。特别注意vold
服务在相关操作中涉及的策略配置。修改 vold 权限配置文件:考虑直接编辑位于
/system/etc/vold.fstab
或者其他相关配置文件(具体位置可能依赖于您的系统)来尝试添加或调整块设备相关的访问权限条目。可以尝试增加与blk_file
对象进行的ioctl read write create getattr setattr lock append
等操作集相关的规则。动态调整运行时策略:如果静态更改不可行,可以考虑在特定情况下使用
audit2allow
工具根据实际的失败审计记录自动生成必要的SELinux策略模块来允许这些操作临时执行。这种方法可能需要配合grep -i deny /var/log/audit/audit.log | audit2allow
命令使用。测试与验证:任何更改后,都需要彻底测试以确保新的配置不仅解决了当前问题,还不会引入其他意外行为或安全漏洞。
通过上述步骤,结合实际系统细节进行调整和实验,有可能找到解决挂载及写入权限问题的方法。值得注意的是,在正式部署之前应当仔细评估所有变通方案,尤其是在操作涉及根文件系统的修改时。