15. 制作SD烧录包

除了上一章节介绍的,可以使用Mfgtool工具通过板卡烧录镜像到SD卡,那么是否有不借助板卡的方法烧录SD卡呢? 答案是有的,本章节介绍如何将镜像的四大组件打包成镜像包,可以通过balenaEtcher工具烧录到SD卡,而无需借助板卡。

15.1. 安装构建工具和依赖

需要安装必要的工具和依赖:

1
sudo apt install xz-utils debootstrap multistrap

15.2. 获取制作镜像的脚本

可以从这里获取脚本,注意本教程需要使用buildroot分支。

1
2
#-b指定使用buildroot分支
git clone -b buildroot https://gitee.com/LubanCat/build_sd_img.git

15.3. 构建方法及修改

默认./all下为野火Buildroot 2021.02.3的镜像组件,如果需要修改可以根据以下进行修改。

15.3.1. 修改rootfs

./all/rootfs下 默认是没有内容的 ,需要把自己的rootfs解压到./all/rootfs目录,或者使用野火编译好的文件系统。

如果需要野火官方的文件系统,可以从资料网盘/4-其他Linux镜像/buildroot镜像/xxx日期/usb烧录文件/mfgtools-release_xxx.zip中获取, 解压后,mfgtools-release/Profiles/Linux/OS Firmware/release目录下,rootfs.tar为buildroot文件系统,modules.tar.bz2,为驱动模块。

将rootfs.tar解压到./all/rootfs目录下,将modules.tar.bz2解压到./all/rootfs/lib/modules/目录下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#拷贝文件系统和驱动模块
cp rootfs.tar ./all/rootfs/
cp modules.tar.bz2 ./all/rootfs/

#进入rootfs目录
cd ./all/rootfs

#解压rootfs.tar后删除
tar xvf rootfs.tar
rm rootfs.tar

#解压modules.tar.bz2后删除
mkdir -p lib/modules
tar xvf modules.tar.bz2 -C lib/modules/
rm modules.tar.bz2

15.3.2. Kernel的修改

把生成的zImage替换到./all/boot/目录下,注意boot文件夹不能超过40M

15.3.3. uboot的修改

把生成的u-boot-dtb.imx更名为u-boot-mmc.imx,然后替换./all/uboot/目录下,注意编译时需要选择mmc版本的uboot配置文件进行编译

15.3.4. 设备树的修改

把生成的设备树imx6ull-mmc-npi-lite.dtb替换./all/boot/目录下,注意boot文件夹不能超过40M

15.3.5. 构建:

1
sudo ./build_sd_img.sh 1

重要

构建前请确认./all/rootfs目录已经放了文件系统,参考以上 1.修改rootfs 确认。

执行sudo ./build_sd_img.sh 1 构建SD卡镜像参数1为内存卡大小为1G,同时也为镜像内可用大小,该参数支持小数,比如输入0.5即构建500M大小的镜像包,但总大小最小要求为rootfs文件夹的大小+40M 。

建议在打包的时候参数尽量小,避免烧录镜像至sd卡的时间过长,我们在烧录完成后再对分区进行扩容即可。

build_sd_img.jpg

15.4. 烧录镜像至SD卡

15.4.1. Etcher工具简介

Etcher是一款简易好用的镜像烧录工具,主要用于刻录镜像到USB设备,包括SD卡和U盘, 支持ios、img、zip、raw、sdcard等多种镜像格式。它的用户界面清爽美观,操作简单, 在软件自动识别到USB设备后,点击几次鼠标就能完成镜像的烧录。

同时Etcher是一个跨平台工具,支持 Mac、Windows 和 Linux , 国内外开发者常用它将树莓派SD卡启动镜像烧录到SD卡中。

15.4.2. Etcher工具下载

可以访问官网:https://www.balena.io/etcher ,根据自己的电脑系统下载对应版本即可。

或者使用野火资料包里提供的,资料网盘/6-开发软件/balenaEtcher-Setup-1.5.56.exe

15.4.3. 烧录镜像

1、打开安装好的Etcher工具,软件界面如下图所示:

Etcher工具

2、选择上一小节打包生成了imx6ull.img.xz镜像包,然后选择要烧录的SD卡,最后点击开始烧录,如下图所示:

../../_images/sd_image_package_11.jpg

3、烧录完成后如下图所示:

../../_images/sd_image_package_21.jpg

4、将板卡拨码配置为2-5-8,然后插入烧录好镜像的SD卡进行启动。

15.5. 扩容

用以上打包出来的镜像不会自动进行扩容,如果打包参数比较大,那么打包出来的镜像包烧录到sd卡需要的时间比较长,建议在打包的时候参数尽量小,避免烧录镜像至sd卡的时间过长,我们在烧录完成后再对分区进行扩容即可。

15.5.1. 添加扩容工具

扩容需要使用resize2fs和parted工具,构建文件系统的时候可以将以下选项进行选择,野火发布的文件系统 默认是没有勾选的。

1
2
3
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
BR2_PACKAGE_PARTED=y

勾选后可以单独构建软件包或者重新构建文件系统:

1
2
3
4
5
#单独构建软件包
make e2fsprogs parted

#重新构建文件系统
make -j16

单独构建软件包生成的文件位于output/target/目录下,需要以下文件(以下是作者整理的):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
└── usr
   ├── lib
   │   ├── libblkid.so.1
   │   ├── libcom_err.so.2
   │   ├── libe2p.so.2
   │   ├── libext2fs.so.2
   │   ├── libparted.so.2
   │   └── libuuid.so.1
   └── sbin
      └── parted
└── sbin
      └── resize2fs

或者可以使用野火编译好的: my_package.tar.gz

将my_package.tar.gz传到板卡进行解压,然后将对应文件拷贝到板卡/usr/lib和/usr/sbin/目录下。

如果是重新编译文件系统方式,重新烧录文件系统即可。

15.5.2. 扩容文件系统

执行下面命令对分区进行扩容。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#sd卡的主分区是/dev/mmcblk0
parted /dev/mmcblk0

#以GB作为单位查看分区信息
unit GB print

#对mmcblk0的第2分区进行扩容,该分区存放跟文件系统
resizepart 2

#按提示输入yes进行确认
yes

#输入参数-1表示完全使用剩余空间
-1

#退出交互
quit

# 调整文件系统大小
resize2fs /dev/mmcblk0p2
parted_mmcblk.png

同理,emmc分区是mmcblk1,如果有需要对emmc分区进行扩容也可以使用以上方法。