4. 使用cbfstool操作固件镜像

任务目标

使用 cbfstool 对 Coreboot 固件镜像执行四种基本操作:查看镜像内文件列表、向镜像添加新文件、从镜像删除文件、从镜像提取文件。本案例使用 Coreboot 源码树中编译生成的 cbfstool 可执行文件,并构造一个最小可用的测试镜像来完成操作闭环。

环境准备

需要已编译的 cbfstool(位于 Coreboot 源码目录 util/cbfstool/cbfstool)以及一个 Coreboot 镜像文件(如 build/coreboot.rom)。若暂无真实镜像,可用以下命令从现有镜像中截取或直接使用任意 Coreboot 构建产物。本案例假设镜像文件路径为 ./coreboot.rom。

关键完整代码

以下脚本封装了 cbfstool 的四种核心操作,并附带验证逻辑:

```bash #!/bin/bash # cbfstool_operations.sh — 使用 cbfstool 操作固件镜像 set -euo pipefail CBFS_TOOL="./cbfstool" ROM_IMAGE="./coreboot.rom" TEST_FILE="./test_data.bin" TEST_NAME="test/logo.bin" # 准备测试文件(若不存在) if [ ! -f "$TEST_FILE" ]; then echo "Create test file: $TEST_FILE" dd if=/dev/urandom of="$TEST_FILE" bs=256 count=1 2>/dev/null fi echo "=== 1. 查看镜像内容 ===" "$CBFS_TOOL" -I "$ROM_IMAGE" || "$CBFS_TOOL" -i "$ROM_IMAGE" echo "" echo "=== 2. 添加文件 ===" "$CBFS_TOOL" -a "$ROM_IMAGE" -n "$TEST_NAME" -t raw -f "$TEST_FILE" echo "添加完成: $TEST_NAME" echo "" echo "=== 3. 验证添加结果 ===" "$CBFS_TOOL" -l "$ROM_IMAGE" | grep "$TEST_NAME" || { echo "错误: 未找到添加的文件"; exit 1; } echo "" echo "=== 4. 提取文件 ===" "$CBFS_TOOL" -e "$ROM_IMAGE" -n "$TEST_NAME" -f ./extracted_data.bin cmp "$TEST_FILE" ./extracted_data.bin && echo "提取内容与原始文件一致" || { echo "错误: 提取内容不匹配"; exit 1; } echo "" echo "=== 5. 删除文件 ===" "$CBFS_TOOL" -d "$ROM_IMAGE" -n "$TEST_NAME" echo "删除完成" echo "" echo "=== 6. 验证删除结果 ===" if "$CBFS_TOOL" -l "$ROM_IMAGE" | grep -q "$TEST_NAME"; then echo "错误: 文件仍存在"; exit 1 else echo "文件已成功删除" fi echo "" echo "=== 全部操作通过 ===" ```

运行方式

将上述脚本保存为 cbfstool_operations.sh,赋予执行权限并运行:

```bash chmod +x cbfstool_operations.sh ./cbfstool_operations.sh ```

若 cbfstool 不在当前目录,请将脚本中 CBFS_TOOL 变量改为实际路径(如 /path/to/coreboot/util/cbfstool/cbfstool)。

验证方法与判定标准

  • 查看操作:命令成功执行并输出镜像内文件列表(包含 header、bootblock 等条目),无报错即通过。
  • 添加操作:添加后执行 -l 列表命令能 grep 到 test/logo.bin,说明文件已写入镜像。
  • 提取操作:提取出的文件与原始测试文件通过 cmp 完全一致,证明数据完整性。
  • 删除操作:删除后再次列表,grep 不到该文件名,说明文件已从镜像中移除。

脚本中任意一步失败都会以非零状态退出并打印错误信息;全部步骤无错误输出即判定通过。

常见问题

  • cbfstool 版本差异:不同 Coreboot 版本的 cbfstool 参数可能略有不同(如 -I 与 -i 均可用于打印信息)。若某参数不可用,请运行 cbfstool -h 查看当前版本支持的具体选项。
  • 镜像空间不足:添加文件时若镜像已满会报错,此时需先删除无用文件或使用更大的镜像。
  • 文件类型:本案例使用 -t raw 添加原始数据文件。若需添加其他类型(如 stage、payload),需按实际用途指定类型参数。