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

本文详细描述了如何从零开始移植Linux内核和根文件系统到香橙派OrangePiZero3,包括使用Buildroot构建、UbuntuBase移植,以及烧录过程中的TF卡分区、UBOOT和Kernel烧录等步骤。
摘要由CSDN通过智能技术生成


参考文章:

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
在这里插入图片描述

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
编译 Linux 内核需要以下步骤: 1. 获取 Linux 内核源代码。你可以从官方网站或 GitHub 上下载最新的内核源代码。 2. 安装交叉编译工具链。如果你的开发环境是 x86 架构的,你需要安装交叉编译工具链来编译适用于 ARM 架构的内核。你可以使用 apt-get 命令或其他包管理器来安装工具链。例如,在 Ubuntu 或 Debian 上,你可以使用以下命令来安装: ``` sudo apt-get install gcc-arm-linux-gnueabihf ``` 3. 配置内核。进入内核源代码目录,使用以下命令来配置内核: ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- orangepi_zero2_defconfig ``` 这将使用默认配置文件来配置内核。 4. 编译内核。使用以下命令来编译内核: ``` make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules ``` 这将编译内核镜像、设备树和内核模块。 5. 安装内核。将编译好的内核镜像和设备树文件复制到 SD 卡的 boot 分区中。例如,在 Ubuntu 或 Debian 上,你可以使用以下命令来安装: ``` sudo cp arch/arm/boot/zImage /media/boot/ sudo cp arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero2.dtb /media/boot/ ``` 6. 配置引导加载程序。编辑 SD 卡的 boot 分区中的 boot.cmd 文件,并添加以下内容: ``` setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10 fatload mmc 0:1 ${kernel_addr_r} zImage fatload mmc 0:1 ${fdt_addr_r} sun8i-h2-plus-orangepi-zero2.dtb bootz ${kernel_addr_r} - ${fdt_addr_r} ``` 这将配置引导加载程序以加载内核镜像和设备树,并指定内核参数。 7. 生成引导加载程序镜像。使用以下命令来生成引导加载程序镜像: ``` mkimage -C none -A arm -T script -d boot.cmd boot.scr ``` 这将生成一个名为 boot.scr 的文件,它是引导加载程序镜像。 8. 将引导加载程序镜像复制到 SD 卡的 boot 分区中: ``` sudo cp boot.scr /media/boot/ ``` 9. 将 SD 卡插入 Orange Pi Zero 2 开发板,并启动板子。如果一切正常,你应该看到内核启动信息在串口终端中输出。 注意:这只是一个简单的指南,实际的操作可能会因环境和设备而有所不同。请确保你熟悉 Linux 内核编译和 Orange Pi Zero 2 开发板的使用。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值