在我的平台上,u-boot 环境变量始终可以修改。目前,我将的值更改为force_ro
“1”,这将权限模式设置为只读。此更改反映在命令的输出中lsblk
。但是,即使在重新启动设备后,我仍然可以将值写入启动分区,并且更改仍然存在。
以下是我的测试结果:
$ cat /sys/block/mmcblk0boot1/force_ro
1
$ fw_setenv primary 2
$ fw_printenv primary
2
以下是有关我的平台的一些详细信息:
- 交叉编译器:Yocto EL40(Kirkstone)
- 引导加载程序:u-boot
- U-boot 来源:git://github.com/nxp-imx/uboot-imx.git;protocol=https
- U-boot 源码分支:lf_v2022.04
fw_setenv
以及fw_printenv
Yocto 中的软件包版本:libubootenv_0.3.2
硬件详细信息:
- 系统架构:arm
- CPU:armv8
- SoC:imx8m
有人能根据 的值建议一个解决方案来使我的启动分区变为只读吗force_ro
?
我检查了所有的 u-boot 配置,尝试了多次测试
答案1
无论 force_ro 值如何,u-boot 分区环境变量始终可写
这是你未经证实的假设,可能无关紧要。
如果我们简单地假设 U-Boot 环境存储在/dev/mmcblk0boot1,然后“我的测试结果“是完全合理的。
U-Boot 环境实际上存储在哪里
?/etc/fw_env.config文件?
您是否尝试使用斯特拉斯命令检查哪个设备fw_setenv命令测试“实际上被访问了吗?
换句话说,您是否在实际存储环境变量的正确分区上实施保护?
或者环境可能在其他地方,例如文件或原始扇区中?
你没有提供任何证据证明这一点”启动分区“是 U-Boot 环境的存储位置。
您尚未令人信服地证明该force_ro
属性无法正常运行。
有人可以根据 force_ro 的值建议一个解决方案来使我的启动分区变为只读吗?
为什么?
系统用这个干什么?”启动分区“ 为了?
你的情况和问题似乎都基于一个(错误的)前提,即/dev/mmcblk0boot1eMMC 的硬件启动分区是 U-Boot 环境的容器。
这两个名称中的“boot”一词是否让你觉得认为那个(不正确的)关联?
答案2
这个问题的原因是libubootenv犯罪:https://github.com/sbabic/libubootenv/commit/92949816720d7af2ac722016e7a5b9a85ff141bc. 绕过 force_ro 保护进行写入。因此,对于我的平台,我将编辑 libubootenv 的源代码
- 关于该线程的最后一次重播,是的,我确信环境变量存储在
/dev/mmcblk0boot1
[dd if=/xx/<uboot>.img of=/dev/mmcblk0boot1 conv=notrunc seek=xx bs=1k
] cat /etc/fw_env.config
有条目为/dev/mmcblk0boot1 xx xx
- fw_setenv 的 strac 命令显示为
openat(AT_FDCWD, "/dev/mmcblk0boot1",enter code here
无论如何,问题的根本原因已经找到并解决。