一、将uboot、内核、文件系统编译生成的文件拷贝到新建的文件夹中备用。
Img 由三部分组成,首先是前面预留的 1M 空间,作为 uboot 和分区表的空间,这里的 8k偏移地址是全志 SoC 的 IROM boot 规定的地址,然后紧接着是两个分区。我们的 256M 镜像打包过程大致如下:
1. 制作 256M 的空文件并烧录 uboot(uboot 和分区表空间)
2. 制作 BOOT 分区
3. 制作 rootfs 分区
4. 创建分区表并写入
二、 载入uboot
1、新建一个img文件,将作为所有文件打包的基础文件。这里我命名为 nano.img
touch nano.img
2、然后使用dd命令,将文件初始为空文件。
sudo dd if=/dev/zero of=nano.img bs=1M count=1024
#在/dev 目录下有两个特殊文件,一个是 null,一个是 zero。将文件丢到null中,就会永久删除,null 文件只能写入。zero 文件与 null 文件正好相反,这个文件是只读文件,用来初始化 0。
3、将 uboot 烧录到这个空文件中
sudo dd if=u-boot-sunxi-with-spl.bin of=nano.img bs=1024 seek=8
三、BOOT分区
1、和载入uboot的操作一样,先新建一个 boot.img 文件,作为BOOT分区基础文件,同时新建一个文件夹用于挂载img文件。
touch boot.img
mkdir dir_boot
2、使用dd命令,将文件初始为空文件。
sudo dd if=/dev/zero of=boot.img bs=1M count=32
3、将这个空文件格式化为 vfat 格式,在 Linux 操作系统中有格式化工具 mkfs。执行下面命令
sudo mkfs.vfat -n BOOT boot.img
4、将这个文件系统挂载到 mnt 目录下
sudo mount -t vfat boot.img dir_boot/
5、以向这个挂载的文件系统中写入我们的 zImage 和 dtb 文件
sudo cp zImage dir_boot/
sudo cp suniv-f1c100s-licheepi-nano.dtb dir_boot/
6、卸载boot.img,并使用dd命令将BOOT分区写入到nano.img中
sudo umount dir_boot
sudo dd if=boot.img of=nano.img bs=1M seek=1
四、rootfs分区
1、和载入uboot的操作一样,先新建一个 rootfs.img 文件,作为rootfs分区基础文件,同时新建一个文件夹用于挂载img文件。
touch rootfs.img
mkdir dir_rootfs
2、使用dd命令,将文件初始为空文件。(count 为 nano.img 总大小 减去 分区表 1M 减去 BOOT区大小32M,即1024-1-32=991)
sudo dd if=/dev/zero of=rootfs.img bs=1M count=991
3、格式化这个文件为 ext4 格式
sudo mkfs.ext4 -F -b 4096 -E stride=2,stripe-width=1024 -L rootfs rootfs.img
4、将这个文件挂载在dir_rootfs 目录下面,然后将根文件系统放进去。
sudo mount -t ext4 rootfs.img dir_rootfs/
sudo tar -xvf rootfs.tar -C dir_rootfs/
5、卸载rootfs.img,并使用dd命令将rootfs分区写入到nano.img中
sudo umount dir_rootfs/
sudo dd if=rootfs.img of=nano.img bs=1M seek=33
五、向nano.img写入分区表
1、分区表非常重要,如果没有分区表,操作系统无法找到各个分区。添加分区表,新建分区表工具我们使用 fdisk 命令。
sudo fdisk nano.img
2、输入命令 o ,创建不同类型分区
3、 然后输入 n 来新建分区,再输入 p 确定分区为主分区,然后输入 1 表示第一个分区。
4、 输入 2048,表示从 1M 地址处开始分区,然后输入+32M,表示分区大小为 32M。
5、如果出现以下提示,则输入N;若没有出现,则跳过本步骤。
6、以同样的方式创建第二个分区,在终端中接着输入 n,表示新建一个分区,然后输入 p,表示主分区,再输入 2,表示第二个分区。
7、 接着输入 67584 即 33M 作为第二个分区的起始位置,然后输入 2097151 作为第二个分区的终止位置。
8、如果出现以下提示,则输入N;若没有出现,则跳过本步骤。
9、将第二个分区修改为 ext4 格式,在终端中输入 t,表示修改分区类型,然后输入 2,表示现在选中分区 2,再输入 83,表示分区格式为 ext4。
10、输入w,将分区表写入到img文件中。完成打包。
11、实际上,当我们新建分区表完成后写入到 nano.img 时,此时文件的前 1M 被完全覆盖了,这也导致 uboot 丢掉了,我们需要再重新写入 uboot 。但是需要非常注意的是,这次写入需要加上 conv=notrun 参数,这个参数表示只替换写入的部分,其他保持不变。
sudo dd if=u-boot-sunxi-with-spl.bin of=nano.img bs=1024 seek=8 conv=notrunc
六、Win32DiskImager 工具在 Windows 烧录到 TF 卡中
七、插入到licheepi nano中进行验证。
PS:IMG文件打包脚本:
#!/bin/bash
touch nano.img
sudo dd if=/dev/zero of=nano.img bs=1M count=1024
sudo dd if=u-boot-sunxi-with-spl.bin of=nano.img bs=1024 seek=8
touch boot.img
mkdir dir_boot
sudo dd if=/dev/zero of=boot.img bs=1M count=32
sudo mkfs.vfat -n BOOT boot.img
sudo mount -t vfat boot.img dir_boot/
sudo cp zImage dir_boot/
sudo cp suniv-f1c100s-licheepi-nano.dtb dir_boot/
sudo umount dir_boot
sudo dd if=boot.img of=nano.img bs=1M seek=1
touch rootfs.img
mkdir dir_rootfs
sudo dd if=/dev/zero of=rootfs.img bs=1M count=991
sudo mkfs.ext4 -F -b 4096 -E stride=2,stripe-width=1024 -L rootfs rootfs.img
sudo mount -t ext4 rootfs.img dir_rootfs/
sudo tar -xvf rootfs.tar -C dir_rootfs/
sudo umount dir_rootfs/
sudo dd if=rootfs.img of=nano.img bs=1M seek=33
sudo fdisk nano.img << EOF
o
n
p
1
2048
+32M
n
p
2
67584
2097151
t
2
83
w
EOF
sudo dd if=u-boot-sunxi-with-spl.bin of=nano.img bs=1024 seek=8 conv=notrunc