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

news2024/12/28 6:59:33

从零开始为香橙派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目录下生成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工具,按照文章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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebAuthn:更好地保护线上敏感信息

1. 引言 2023年知乎博客 WebAuthn: 真正的无密码身份认证 总结得很赞。 在数字时代&#xff0c;密码已成为人们日常生活和在线活动中不可或缺的一部分。尽管互联网已经发展了 20 多年&#xff0c;许多方面都有了巨大的改进&#xff0c;但只有密码&#xff0c;还是 20 年前的用…

【数据结构】--- 探索栈和队列的奥秘

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა &#x1f4a1;个人主页&#xff1a;9ilk &#x1f4a1;专栏&#xff1a;数据结构之旅 上回我们学习了顺序表和链表&#xff0c;今天博主来讲解两个新的数据结构 — 栈和队列 &#xff0c; 请放心食用 文章目录 &#x1f3e0; 栈&#x1…

牛客 2024春招冲刺题单 ONT102 牛牛的果实排序【simpe 要知道如何判断是否是质数 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/975a263e2ae34a669354e0bd64db9e2a 核心 需要牢牢记住下面的代码//判断是否为质数public boolean isPrime(int n){if(n1) return false;if(n2 || n3) return true;if(n%6!1 && n%6!5) return false; /…

C++(语法以及易错点2)

1.内联函数 1.1 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 ​int ADD(int a,int b) {return ab; }​ 1.2 特性 1. inline是一种以空间换时间…

spring security6重写登陆验证

spring security的认证流程 2. 从文档上可以看出来&#xff0c;UsernamePasswordAuthenticationFilter和AuthenticationManager是认证的关键步骤&#xff0c;/login传过来的username和password由UsernamePasswordAuthenticationFilter接收处理成UsernamePasswordAuthenticatio…

设计模式总结-组合模式

组合设计模式 模式动机模式定义模式结构组合模式实例与解析实例一&#xff1a;水果盘实例二&#xff1a;文件浏览 更复杂的组合总结 模式动机 对于树形结构&#xff0c;当容器对象&#xff08;如文件夹&#xff09;的某一个方法被调用时&#xff0c;将遍历整个树形结构&#x…

基于SSM的品牌银饰售卖平台(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的品牌银饰售卖平台&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

LeetCode - 边积分最高的节点

2374. 边积分最高的节点 这是一个有向图&#xff0c;且每个节点都只有一条出边&#xff0c;指向0的边有1&#xff0c;2&#xff0c;3&#xff0c;4 10&#xff0c; 指向7的有5&#xff0c;6 11. 我们只需要一次遍历就可以解决&#xff0c;先搞一张哈希表&#xff0c;k存节点…

docker安装nacos,单例模式(standalone),使用内置的derby数据库,简易安装

文章目录 前言安装创建文件夹docker指令安装docker指令安装-瘦身版 制作docker-compose.yaml文件查看页面 前言 nacos作为主流的服务发现中心和配置中心&#xff0c;广泛应用于springcloud框架中&#xff0c;现在就让我们一起简易的部署一个单例模式的nacos&#xff0c;版本可…

Qt+OpenGL-part3

1-4EBO画矩形_哔哩哔哩_bilibili 可以绘制两个三角形来组成一个矩形&#xff08;OpenGL主要处理三角形&#xff09; 直接画两个三角形&#xff1a; #include "openglwidget.h" #include <QDebug>unsigned int VBO,VAO; unsigned int shaderProgram;//顶点着…

快排序解读

排序算法是计算机科学中不可或缺的一部分&#xff0c;它们在各种数据处理场景中发挥着关键作用。在众多排序算法中&#xff0c;快速排序以其高效的性能和简洁的实现成为了许多程序员的首选。今天&#xff0c;我们就来深入剖析快速排序算法&#xff0c;了解其原理、实现方式以及…

【【萌新的Pytorch入门之Python的学习】】

学习记录 - 参考记录来自B站up主 -爆肝杰哥 ① NumPy 包为 Python 加上了关键的数组变量类型&#xff0c;弥补了 Python 的不足&#xff1b; ② Pandas 包在 NumPy 数组的基础上添加了与 Excel 类似的行列标签&#xff1b; ③ Matplotlib 库借鉴 Matlab&#xff0c;帮 Python 具…

mysql 基本查询

学习了mysql函数&#xff0c;接下来学习mysql基本查询。 1&#xff0c;基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT 语句。SELECT语句的基本格式是&#xff1a; SELECT (*I <字段列表>} FROM <表1>,<表2>..[WHERE<表达式> [GROUP BY <…

C++入门(以c为基础)——学习笔记2

1.引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间。在语法层面&#xff0c;我们认为它和它引用的变量共用同一块内存空间。 可以取多个别名&#xff0c;也可以给别名取别名。 b/c/d本质都是别名&#…

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题

在 Python 中&#xff0c;深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象&#xff0c;该对象与原始对象的内容相同&#xff08;包括内部嵌套对象的引用&#xff09;&…

SSM框架学习——了解Spring与Eclipse创建Maven项目

了解Spring 什么是Spring Spirng是分层的JavaSE/EE全栈轻量级开源框架&#xff0c;以控制反转IoC和面向切面编程AOP为内核&#xff0c;使用基本的JavaBean来完成EJB的工作。 Spring框架采用分层架构&#xff0c;它的一些列功能被分为若干个模块。 上图中的红色背景模块为本…

提示工程概要

提示工程 1. 两大原则 原则 1&#xff1a;编写清晰具体的说明 使用分隔符 三引号&#xff1a;“”"三个反引号&#xff1a;三个破折号&#xff1a;—尖括号&#xff1a;<>XML标签&#xff1a; 要求结构化输出 HTMLJSONXMLPython字典 检查条件是否满足 检查执行…

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

linux安装和使用Rancher

linux安装和使用Rancher Rancher介绍请看如下博客 arm架构安装Rancher并导入k8s集群解决Error: no objects passed to apply 华为云arm架构安装k8s(kubernetes) linux下安装Rancher Rancher部署监控k8s集群状态等,比Dashboard插件强大 提前安装好K8S 在master上执行#如果…

学习心得1

这时我第一次更学习心得&#xff01;不足的在评论区指教。 首先先来分享一下&#xff0c;刷一维数组题目的方法。 仔细读题&#xff0c;不会做的题目先完成输入输出。不要干等着着急&#xff0c;就跳到下一题。如果使用的时oj&#xff0c;那就没有题解但是使用洛谷、LeetCood…