SWUpdate配置MMC设备地址异常:指定/dev/mmcblk3p1却写入/dev/mmcblk3p2
问题产生原因
- sw-description语法错误:你提供的配置片段里,
imx6dl-sabresd.dtb对应的path = "/imx6dl-sabresd.dtb"行末尾缺少逗号,会导致SWUpdate解析配置时字段错位,后续的device参数无法被正确识别,最终使用默认的分区配置或其他继承的分区参数。
- sw-description语法错误:你提供的配置片段里,
- 双分区冗余升级机制触发:如果你的SWUpdate编译时开启了A/B双分区冗余功能,或者sw-description全局配置段设置了
dual-copy = true,SWUpdate会自动将升级内容写入当前未激活的备用分区,忽略单文件层级的device参数。比如当前系统从/dev/mmcblk3p1启动,就会默认把升级内容写入备用的/dev/mmcblk3p2。
- 双分区冗余升级机制触发:如果你的SWUpdate编译时开启了A/B双分区冗余功能,或者sw-description全局配置段设置了
- 升级钩子/脚本重写了设备路径:如果你在SWUpdate的pre-install、install阶段配置了自定义Lua脚本或Shell钩子,可能存在根据当前运行分区自动替换目标device的逻辑,覆盖了配置文件里写死的参数。
- SWU升级包未正确更新:修改sw-description后没有重新打包生成新的SWU包,升级时使用的还是旧版本的配置文件。
- 系统设备名映射异常:udev规则或内核分区识别逻辑导致实际的分区设备名和你预期的不符,比如/dev/mmcblk3p1实际对应物理分区2,/dev/mmcblk3p2对应物理分区1。
排查解决步骤
- 第一步:修正配置语法错误,给
path = "/imx6dl-sabresd.dtb"行末尾添加逗号,修正后配置如下:
files: ( { filename = "zImage"; path = "/zImage"; device = "/dev/mmcblk3p1"; }, { filename = "imx6dl-sabresd.dtb"; path = "/imx6dl-sabresd.dtb"; device = "/dev/mmcblk3p1"; } );
- 第二步:开启SWUpdate调试日志复现问题,执行升级命令时添加
-v -v参数,查看日志中每个升级文件解析到的目标device值,确认是配置解析失败还是后续逻辑被修改。 - 第三步:检查双分区相关配置:
- 查看SWUpdate编译配置文件,确认
CONFIG_SWUPDATE_DUALCOPY等双分区相关选项是否开启 - 检查sw-description全局配置段是否存在
dual-copy = true配置 - 查看U-Boot环境变量中当前激活分区的标记位,确认是否触发了自动写入备用分区的逻辑
如果不需要双分区冗余功能,直接关闭对应配置即可;如果需要保留双分区,又要强制写入指定分区,可以在全局配置中添加force-install-to = "/dev/mmcblk3p1"参数。
- 查看SWUpdate编译配置文件,确认
- 第四步:检查所有自定义升级脚本,确认是否存在强制替换device路径的逻辑,按需调整即可。
- 第五步:验证当前使用的SWU包,执行
cpio -idmv < 你的升级包.swu解压包,确认里面的sw-description文件内容是修改后的版本。 - 第六步:排查设备名映射问题,直接在系统执行
lsblk和blkid命令,确认各分区的设备名、UUID和实际挂载情况,排除分区识别异常的问题。
内容的提问来源于stack exchange,提问作者Halo_313
相关产品推荐
相关产品推荐

