从零开始为香橙派orangepi zero 3移植主线linux——2.kernel + rootfs
- 参考文章:
- 一、linux kernel移植
- 二、根文件系统
- 2.1 buildroot构建
- 1.修改toolchain下的交叉编译链
- 2.修改系统配置
- 3.去除内置kernel和uboot编译
- 4.添加rootfs.tar格式的输出
- 2.2 ubuntu-base移植
- 三、烧录
- 3.1 TF卡分区
- 3.2 烧录uboot
- 3.3 烧录kernel和rootfs
- 3.4 运行
参考文章:
1.MQ-Quad 全志H616 主线内核编译调试记录(u-boot、kernel、buildroot)
2.荔枝派Zero(全志V3S)烧录Uboot、Kernel及rootfs到SD卡并运行在板子上
3.Rockchip RK3399 - 移植uboot 2023.04 & linux 6.3
4.Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统
5.ARM64-Linux:内核裁剪过程(全志H616平台)
一、linux kernel移植
由于arm64架构比较新,主线linux中只有一个默认的defconfig文件,所以需要自行对内核进行裁剪,这里笔者主要参考了上面的文章3和文章6,唯一不同的是笔者保留了Platform selection-->ARMv8 software model (Versatile Express)
选项。尽管如此,编译出来的内核还是很大,而且还包含不少模块文件,这些模块文件需要根据文章1中所述的办法,添加到根文件系统中,否则可能会出现找不到设备的情况。
使用以下命令加载defconfig后,按照上述方式裁剪完即可编译:
export PATH=$PATH:<path_to_toolchain>/aarch64-none-linux-gnu/bin
export CROSS_COMPILE=aarch64-none-linux-gnu-
make defconfig
编译完成后,会在arch/arm64/boot
目录下生成Image
和Image.gz
文件,其中Image.gz文件即为旧版本kernel中的zImage,在arch/arm64/boot/dts/allwinner
目录下生成sun50i-h618-orangepi-zero3.dtb
,Image和设备树文件即可用来启动内核。
二、根文件系统
2.1 buildroot构建
buildroot的配置文件已经包含了香橙派zero3的配置,保存在configs
目录下的orangepi_zero3_defconfig
即为相关文件,笔者就在此基础上进行修改。
make orangepi_zero3_defconfig
make menuconfig
在菜单中主要进行以下修改:
1.修改toolchain下的交叉编译链
2.修改系统配置
这里主要是关系一些系统默认的配置,可以根据需求自行修改,但有两个地方需要注意。
首先Run a getty after boot这个参数,需要修改为ttyS0,并设置好波特率。这个是用来控制linux内核控制台打印信息输出的地方,如果不修改,可能进入到内核之后串口就无法交互。
其次是最下面和生成镜像有关的设置,这个是制作整包镜像时,将内核、uboot、rootfs一起打包成可以直接烧录的sdcard.img文件需要的,但目前只是根文件系统验证,所以可以去掉。实际测试即使不去掉,编译时只会报错,不影响结果输出。
3.去除内置kernel和uboot编译
将buildroot内置的kernel和uboot编译流程去除,只需要简单的rootfs以供验证。
4.添加rootfs.tar格式的输出
默认的输出格式只有rootfs.exts,使用.tar格式的更方便烧写到tf卡
之后就可以进行编译,编译结果存放在output\images
目录下:
2.2 ubuntu-base移植
这部分笔者主要参考了文章4,按照该文章中的做法基本不会有问题,这里主要记录几个遇到的错误:
1.解压压缩包时一定要保留文件的原有属性!!!
2.一定要使用root权限操作!!!
3.如果在更新软件包时遇到报错Certificate verification failed: The certificate is NOT trusted.通常是因为在source.list中使用的是https://
开头的地址,将其修改成http://
即可,如果担心这种方式不安全,可以修改成http://
之后,使用sudo apt install ca-certificates
安装证书,然后修改回去即可。
4.如果安装软件包时提示各种软件包都找不到,通常是因为DNS解析设置有问题,对照参考文章仔细修改即可。
三、烧录
3.1 TF卡分区
将这些文件烧录到TF卡时,可以借助ubuntu主机下的gparted工具,按照文章2中的方式安装gparted工具,然后清除TF卡中的所有分区和数据。
由于uboot文件一般较小,通常为几百K,所以正常留出1M左右大小即可,如果不放心可以稍微留大一些到10M左右,Image+dtb文件可以留出30 ~ 50M左右,剩下就全部作为根文件系统。
如果想将uboot空间改大,只用将第一分区之前的可用空间
改大即可。
3.2 烧录uboot
按照上述方法分区后,通常会存在/dev/sdX、/dev/sdX1、/dev/sdX2三个设备,将uboot使用dd命令写入/dev/sdX设备即可:
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
sync
注:如果烧写完uboot另外的两个分区丢失,一般是因为TF卡不太好,可以尝试更换
3.3 烧录kernel和rootfs
Image文件和dtb设备树文件可以直接用ubuntu的图形化界面拷贝到刚才创建的分区1中,rootfs如果是.tar格式的,则解压到对应的分区2中,如果是未打包的ubuntu文件系统,直接全部拷贝过去即可。
注:拷贝过去之后一定要使用sync命令进行同步
如果使用命令行,则需要使用mount命令将/dev/sdX1和/dev/sdX2挂载到系统的某一路径下,再进行上述操作。
3.4 运行
在uboot中添加以下指令:
setenv bootcmd 'fatload mmc 0:1 0x40200000 Image;fatload mmc 0:1 0x4fa00000 sun50i-h618-orangepi-zero3.dtb;booti 0x40200000 - 0x4fa00000'
setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw init=/sbin/init debug panic=30'
saveenv
即可自动启动到系统中,如果使用buildroot文件系统,则修改init=/linuxrc