从零开始为香橙派orangepi zero 3移植主线linux——2.kernel + rootfs

发布于:2024-04-06 ⋅ 阅读:(381) ⋅ 点赞:(0)


参考文章:

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目录下生成ImageImage.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工具,使用sudo apt install gparted命令安装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
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到