工具获取和安装
从genimage仓库克隆最新版的genimage源码,然后编译,生成可执行的genimage二进制文件。
sudo apt-get install libconfuse-dev #安装genimage依赖库
sudo apt-get install genext2fs #制作镜像时genimage将会用到
git clone https://github.com/pengutronix/genimage.git
cd genimage
./configure #配置生成makefile
make
文件准备
制作系统镜像至少需要准备好:
- bootloader
- 内核zImage
- 设备树dtb
- 根文件系统rootfs
- 根据一定规则生成镜像的配置文件
准备系统文件
将genimage拷贝到方便的地方,并在同级目录新建文件夹。
建立input
文件夹,在input文件夹中放入bootloader、内核镜像、设备树,如图所示
建立root
文件夹,将根文件系统全部拷贝过来,如图所示
准备配置文件
在genimage同级目录新建genimage.cfg
文件。文件内容和参数含义如下所示。
具体的定义方法可以参考原github。
image bootfs.vfat {
//定义第一个分区镜像
vfat {
//分区格式为fat
files = {
//在里面放入zImage和设备树文件
"zImage",
"suniv-f1c100s-mangopi.dtb"
}
}
size = 32M //大小要大于所有文件大小之和
}
image rootfs.ext4 {
//定义第二个分区镜像
ext4 {
} //分区格式为ext4
size = 900M //大小要大于根文件系统的大小
mountpoint = "/" //代表根文件系统所在的root目录
}
image sysimage-sdcard.img {
//生成的img镜像名字
hdimage {
//类型为hdimage,一般从tf卡启动都为这个格式
}
partition u-boot {
//第一个分区,由于in-partition-table = false参数存在其实不会产生分区表
in-partition-table = false //不要生成分区表,如果注释掉这个将会产生一个uboot分区
image = "u-boot-sunxi-with-spl.bin" //镜像为input目录的u-boot-sunxi-with-spl.bin文件
offset = 0x2000 //文件偏移
size = 1016K //大于uboot的大小
}
partition boot {
//第二个分区(实际生成的第一个分区)
partition-type = 0xC //分区格式,0xC代表fat32格式
bootable = "true" //定义为启动分区
image = "bootfs.vfat" //引用前面定义的bootfs.vfat镜像
}
partition rootfs {
//第三个分区(实际生成的第二个分区)
partition-type = 0x83 //分区格式,0xC代表Linux格式
image = "rootfs.ext4" //引用前面定义rootfs.ext4镜像
}
}
生成镜像
有了上面的配置文件,执行sudo genimage
将会在images文件夹中生成我们所需的系统镜像。
使用镜像
生成的img文件可以直接通过balenaEtcher工具一键写入TF卡。
其他
配置文件中的partition-type
参数的含义可以参考ubuntu下的fdisk工具
依次输入以下内容:
sudo fdisk /dev/sda
l #查看参数含义
q #退出
参考资料:
- https://github.com/pengutronix/genimage
- fdisk