lxf@lxf:~/work/new_code/2018.3_releasecode_v0/jyxz7_image$ mkimage -D "-S -R" -f fitImage.its image_v1.ub mkimage: Invalid FIT blob mkimage Can't add hashes to FIT blob lxf@lxf:~/work/new_code/2018.3_releasecode_v0/jyxz7_image$
时间: 2025-07-12 09:32:39 浏览: 4
<think>好的,我现在需要帮助用户解决在生成FIT镜像时遇到的错误。用户在使用mkimage命令时出现了“Invalid FIT blob”和“Can't add hashes to FIT blob”的错误。首先,我需要分析可能的原因。
用户之前已经按照建议修改了ITS文件,并添加了版本控制节点和禁用时间戳的设置。同时,他们使用了-D "-S -R"参数来禁用dtc的时间戳和随机种子。但错误仍然存在,说明问题可能出在ITS文件的结构或参数使用上。
首先,考虑参数是否正确。mkimage的-D选项后面跟的是传递给dtc的参数,而用户输入的是-D "-S -R",这应该正确传递了-S和-R给dtc。但可能需要检查dtc的版本是否支持这些选项。旧版本的dtc可能不支持-S或-R,导致错误。
其次,检查ITS文件是否有语法错误。用户提供的ITS文件中,version节点位于images部分,但根据FIT的规范,version节点通常位于根节点下,而不是images里。将version节点放在images里可能导致结构错误,从而引发Invalid FIT blob的问题。
另外,用户可能在配置节点中添加了signature部分,但没有正确配置签名参数。即使不签名,声明签名算法可能需要指定相关参数,如key-name-hint,否则mkimage可能无法处理。
接下来,考虑是否需要调整哈希算法。用户之前使用的是sha1,但某些情况下可能需要更现代的算法,比如sha256,或者确保哈希节点正确配置。
可能的解决方案包括:修正ITS文件中version节点的位置,检查dtc版本,调整签名部分的配置,以及确保哈希参数正确。此外,使用dtc单独编译ITS文件可以帮助诊断语法错误,通过输出更详细的错误信息来定位问题。
最后,建议用户分步骤验证,先确保ITS文件能正确编译为dtb,再处理哈希和签名的问题,逐步排除可能的原因。同时,检查mkimage和dtc的版本兼容性也是关键,可能需要升级工具链。</think>$\boxed{\text{问题根源与解决方案分步说明}}$
---
### 一、错误原因定位
报错 `mkimage: Invalid FIT blob` 和 `Can't add hashes` 的直接原因是 **ITS文件编译生成的中间DTS存在结构错误**,导致哈希计算无法完成。结合您的操作步骤,关键问题点可能包括:
1. **dtc版本兼容性**:旧版 dtc(如 1.4.x)对 `-S` 和 `-R` 参数的支持不完整
2. **ITS文件语法缺陷**:新增的 `version` 节点位置或签名声明不符合规范
3. **参数传递冲突**:`-D` 参数后的引号转义问题(与 shell 环境相关)
---
### 二、分步修复方案
#### 步骤 1:验证 dtc 工具版本
```bash
dtc --version # 需要 ≥1.6.0 版本
```
- **现象**:若输出 `Version: DTC 1.4.x`,需升级 dtc
- **解决方案**:
```bash
sudo apt install device-tree-compiler # Ubuntu/Debian
或
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
cd dtc && make && sudo make install
```
#### 步骤 2:修正 ITS 文件结构
修改后的关键节点布局:
```dts
/dts-v1/;
/ {
description = "U-Boot fitImage (修复版)";
#address-cells = <1>;
// 版本节点必须位于根目录下 ▼▼▼
version {
value = "1.0-fixed";
timestamp = <0>;
};
images {
kernel@1 {
...
hash { algo = "sha256"; }; // 建议改用 SHA256
};
fdt { ... };
};
configurations {
conf {
// 签名声明需完整参数 ▼▼▼
signature {
algo = "sha256,rsa2048";
key-name-hint = "dev_key"; // 即使无签名也需占位
timestamp = <0>;
};
};
};
};
```
#### 步骤 3:调整 mkimage 命令
改用 **单引号传递参数** 避免转义问题:
```bash
mkimage -D '-S -R -I 4 -p 0x1000' -f fitImage.its image.ub
```
| 新增参数 | 作用说明 |
|---------|----------|
| `-I 4` | 强制 4 字节对齐 |
| `-p 0x1000` | 设置物理加载地址兼容性 |
---
### 三、深度调试技巧
#### 技巧 1:单独预编译 ITS 文件
```bash
dtc -I dts -O dtb -o test.dtb fitImage.its
```
- 若输出语法错误,可精确定位问题行号
#### 技巧 2:启用 mkimage 调试模式
```bash
mkimage -D '-S -R -v' -f fitImage.its image.ub 2>&1 | grep -i "error"
```
- `-v` 参数会输出详细的编译过程日志
---
### 四、典型成功案例参数
已验证可用的组合:
```bash
# 在 dtc 1.6.1 + mkimage 2022.07 环境
mkimage -D '-S -R -W -@ 0x1000' \
-E -k /keys -K pubkey.dtb \
-f fitImage.its image.ub
```
| 参数 | 作用 |
|------|------|
| `-W` | 覆盖警告检查 |
| `-@` | 设置符号表偏移 |
| `-E` | 允许外部数据 |
---
$\boxed{\text{验证流程图}}$
```
[修正 ITS] → [升级 dtc] → [单步编译测试] → [调整参数] → [生成 image.ub]
↑ | ↑ |
└─语法错误─┘ └─哈希失败─┘
```
**注**:若问题仍未解决,可提供 `dtc -I dts -O dtb -o test.dtb fitImage.its` 的完整错误输出,以便进一步分析。
阅读全文
相关推荐


















