一、环境准备与安装

安装依赖工具

sudo apt install libconfuse-dev genext2fs  # 核心依赖
sudo apt install mtools dosfstools         # FAT分区支持(可选)
sudo apt install autoconf automake libtool  # 安装核心依赖 

编译 genimage

git clone https://gitcode.com/gh_mirrors/genimage   # 克隆源码 地址1

git clone https://github.com/pengutronix/genimage # 克隆源码 地址2


cd genimage
./autogen.sh  && ./configure && make 
sudo make install  # 安装到系统路径 

二、配置文件编写(genimage.cfg )

必须手动创建 genimage.cfg 文件,该文件不会自动生成

genimage.cfg 文件内容

以下示例配置文件适配 ARM32 设备(如全志 F1C200s、树莓派等):

# 定义最终输出的镜像文件 
image sdcard.img  {
  size = 512M  # 镜像总大小(按实际调整)
 
  # 分区1:FAT32 格式(存放内核、设备树)
  partition boot {
    partition-type = 0xC  # FAT32 类型标识
    bootable = true       # 设为可启动分区 
    image = "boot.vfat"    # 子镜像名称 
  }
 
  # 分区2:EXT4 格式(根文件系统)
  partition rootfs {
    partition-type = 0x83 # Linux 文件系统标识
    image = "rootfs.ext4"  # 子镜像名称 
    mountpoint = "/"      # 挂载点(用于自动填充文件)
  }
}
 
# 子镜像1:FAT32 分区内容 
image boot.vfat  {
  size = 64M             # 分区大小
  type = "vfat"          # 文件系统类型
  files = {
    "zImage",            # ARM32 内核文件 
    "sunxi-f1c100s.dtb"   # 设备树文件(按实际替换)
  }
}
 
# 子镜像2:EXT4 分区内容
image rootfs.ext4  {
  size = 448M            # 分区大小
  type = "ext4"          # 文件系统类型
  source = "rootfs/"     # 根文件系统目录(需提前准备)
}

关键配置说明:

  1. partition-type:ARM32 设备通常使用 0xC(FAT32)和 0x83(EXT4)。
  2. bootable:启动分区必须标记为 bootable。
  3. source:根文件系统目录需包含 ARM32 架构的库和程序(如 lib/arm-linux-gnueabihf)。

三、生成镜像步骤

1 准备文件

将编译好的 ARM32 内核 zImage、设备树 .dtb 文件放入当前目录。
准备好 ARM32 的根文件系统(如通过 debootstrap 构建或从现成系统复制)。

2 运行 genimage

genimage --rootpath rootfs/ \  # 根文件系统路径
         --tmppath build-tmp/ \ # 临时目录
         --inputpath ./ \       # 输入文件路径(含 zImage/dtb)
         --outputpath output/ \ # 输出目录
         --config genimage.cfg   # 配置文件

生成的文件位于 output/ 目录(如 sdcard.img )

3 烧录到设备

sudo dd if=output/sdcard.img  of=/dev/sdX bs=4M status=progress 

替换 /dev/sdX 为实际的 SD 卡设备节点。

四、ARM32 特殊注意事项

1 分区对齐问题

ARM32 设备通常要求分区起始扇区为 1(而非 0),确保 genimage.cfg 中未强制指定偏移量4。
若出现启动失败,检查分区表是否包含 扩展分区(ARM32 可能不支持逻辑分区)4。

2 内核兼容性

ARM32 镜像需使用 uImage 格式(非标准 Image),可通过 mkimage 工具转换:

mkimage -A arm -O linux -T kernel -C none -a 0x22008000 -e 0x22008000 -n "Linux" -d zImage uImage 

3 文件系统权限

根文件系统需包含 ARM32 动态库(如 libc.so.6 ),可通过 file rootfs/bin/bash 验证架构。

五、完整流程总结

步骤操作要点ARM32 特殊性
环境安装安装依赖并编译 genimage无需交叉编译,x86 主机即可运行
配置文件明确分区类型、大小及内容来源分区标识符用 0xC/0x83
文件准备内核需为 uImage,根文件系统需适配 ARM32 指令集使用 mkimage 转换内核
生成与烧录输出 .img 文件并用 dd 写入存储设备检查分区表是否含扩展分区

问题排查:若设备无法启动,可通过 fdisk -l sdcard.img 验证分区表,或使用 QEMU 模拟测试(qemu-system-arm)。
更多案例参考:树莓派定制工具 rpi-image-gen(基于 genimage)

Logo

分享最新的 NVIDIA AI Software 资源以及活动/会议信息,精选收录AI相关技术内容,欢迎大家加入社区并参与讨论。

更多推荐