Qemu开发ARM篇-5、buildroot制作根文件系统并在qemu中进行挂载启动

文章目录

  • 1、 buildroot源码获取
  • 2、buildroot配置
  • 3、buildroot编译
  • 4、挂载根文件系统

在上一篇 Qemu开发ARM篇-4、kernel交叉编译运行演示中,我们编译了kernel,并在qemu上进行了运行,但到最后,在挂载根文件系统时候,挂载失败,这是因为我们还没有根文件系统,在本章中,我们将制作根文件系统。

rootfs制作方式有很多方式,如busyBoxbuildrootYocto等,在该篇章中,我们使用buildroot来制作根文件系统,主要考虑到busyBox制作完还需要手动首改一些启动配置比较繁琐,而Yocto如果电脑配置不是很好,编译时间过长,比较麻烦。

1、 buildroot源码获取

buildroot源码:github链接
在src目录下使用mkdir buildroot && cd buildroot创建buildroot路径,并使用如下命令获取buildroot源码:

mkdir buildroot && cd buildroot
git clone https://github.com/buildroot/buildroot.git

buildroot版本,因为master分支的源码会不停地更新,因此在这里我们选择一个确定版本作为开发,在这里尽量选择一个比较稳定的buildroot版本,本次选择2022.11作为本次使用版本:

使用如下命令切换分支:

cd buildroot/
git checkout 2022.11 -b 2022.11

在这里插入图片描述

后续,我们将使用2022.11这个版本进行开发。

2、buildroot配置

buildroot编译需要先进行配置,在buildroot目录~/project/qemu/src/buildroot/buildroot输入如下命令进入配置页面。

make menuconfig

在这里插入图片描述
1、配置Target option
主要配置以下几项:1、架构选择Arm(little endian)contex-A9,其他选择如下图。
在这里插入图片描述

2、配置交叉编译工具链
这里我们配置为外部交叉工具链,也就是配置成我们前面自己下载的交叉编译工具链:
进入Toolchain选项:
在这里插入图片描述
需要配置的项目和其对应的内容如下:
在这里插入图片描述
在这里插入图片描述

1:选择External toolchain,即外部工具链
2:选择Custom toolchain:即我们自己下载的工具链
3: 选择Pre-installed toolchain:即我们自己的工具链
4:输入我们自己工具链的路径,这里就是我们前面编译uboot和kernel的工具链的路径
5:输入我们自己交叉编译工具链的前缀:这里为:arm-linux-gnueabi
6:选择我们工具链的版本:我们是7.5版本,因此在这里选择7.x
7:选择工具链kernel head:我们工具链的版本为:·4.10·,这里选择4.10.x
8:选择使用glibc
9:选中我们gcc支持的一些特性
10:选中我们gcc支持的一些特性

3、System configuration
该选项主要配置系统的一些参数:如初始化程序类型、主机名、密码以及欢迎语等,进入该选项,进行如下配置:
在这里插入图片描述

1:配置主机名:可根据自己需求进行更改
2:配置欢迎语:可根据自己需求进行更改
3: 初始化系统程序:这里我们选择systemd
4:使能root等,并设置密码:我这里设置为123456
5:修改shell为bash
其他的保持默认即可

4、kernel配置选项
因为我们前面自己下载了kernel,因此这里我们不需要选择内核,将内核取消勾选。
在这里插入图片描述
5、Target packages配置选项
该配置选项用来配置一些软件包,这里我们选中ssh功能
包选择路径如下:
Target packages->Networking applications->openssh
在这里插入图片描述
6、Filesystem images配置选项
该选项用来配置生成的文件系统以什么方式存在,在这里我们选择ext4格式:
在这里插入图片描述

7、Bootloaders配置选项
因为我们前面自己下载了uboot,因此这里我们不需要选择bootloader,将bootloader取消勾选。
在这里插入图片描述
配置完成记得使用下面菜单栏中的Save保存配置。

8、为了不用每次都这么繁琐的进行配置,我们需要将这次的配置文件保存下来,
使用如下命令保存我们的配置文件到confis目录下,并使用git将其提交到本地库:

cp .config configs/vexpress_a9_defconfig
git add configs/vexpress_a9_defconfig
git commit -m "add vexpress_ap_defconfig"

在这里插入图片描述

3、buildroot编译

在script目录使用touch build_roofs.sh && chmod 777 build_roofs.sh命令创建编译脚本,并在编译脚本输入如下内容:

#!/bin/bash
cd ~/project/qemu/src/buildroot/buildroot
make vexpress_a9_defconfig O=~/project/qemu/out/rootfs-arm
make menuconfig O=~/project/qemu/out/rootfs-arm
make O=~/project/qemu/out/rootfs-arm
cd ~/project/qemu

然后执行该脚本./script/build_roofs.sh进行编译编译过程会从网络下载软件包,如果网络不是很好,有可能会编译失败,所以尽量进行全局科学上网。

或者也可以从该连接下载笔者在编译时下载好的包,将其下载下来,替换buildroot目录下的dl目录即可。

编译完成之后,根文件系统在out/rootfs-arm/images目录下:
在这里插入图片描述
其中rootfs.ext4即是我们编译出来的ext4格式的根文件系统。

4、挂载根文件系统

在上一篇Qemu开发ARM篇-4、kernel交叉编译运行演示中,我们编译了kernel,但是在启动的时候,由于没有挂载根文件系统,导致panic,无法进入系统,现在我们已经编译出了根文件系统了,我们来挂载它。

在这里我们通过qemu的SD卡的形式将根文件系统挂载上去,SD卡要求文件系统大小为2的N次方,我们看看我们编译的rootfs大小:
在这里插入图片描述
可以看到rootfs.ext4是rootfs.ext2的软连接,查看rootfs.ext2文件大小,可以看到是60M,不满足SD大小要求,使用如下命令拷贝一份rootfs.ext2并将其resize到64M:

 cp rootfs.ext2 rootfs.ext2_temqemu-img resize rootfs.ext2_tem 64M

在script目录使用touch run_kernel_with_rootfs.sh && chmod 777 run_kernel_with_rootfs.sh命令创建运行脚本,并在运行脚本输入如下内容:

#!/bin/bash
qemu-system-arm -M vexpress-a9 -m 512M \-kernel ~/project/qemu/out/kernel-arm/arch/arm/boot/zImage \-dtb ~/project/qemu/out/kernel-arm/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \-nographic \-no-reboot \-append "root=/dev/mmcblk0 rw init=/usr/sbin/init console=ttyAMA0" \-sd ~/project/qemu/out/rootfs-arm/images/rootfs.ext2_tem

参数解释:

-kernel:指定内里路径,这里使用zImage
-dtb:指定设备树地址
-nographic:不使用图形化界面
-no-reboot:不重启
-append:因为我们这里还没有使用uboot引导kernel,因此需要借助qemu的-append参数传递bootargs参数。root指定根文件系统路径,因为我们SD直接就是ext4的文件系统没有进行分区,因此是/dev/mmcblk0,rw:挂载为可读写,init:指定系统初始化程序,因为我们在编译rootfs的时候指定的是systemd,因此这里我们需要指定为/usr/sbin/init(该init其实就是systemd的一个软连接,可以在进入板端进行查看器连接属性),console:使用串口

然后运行./script/run_kernel_with_rootfs.sh启动内核,如下:
在这里插入图片描述
可以看到已经成功进行启动了,并挂载成功了根文件系统,输入用户名root,密码:123456(密码为前面配置buildroot的时候设置的)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]文本表格检测数据集VOC+YOLO格式6688张5类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6688 标注数量(xml文件个数):6688 标注数量(txt文件个数):6688 标注…

Fyne ( go跨平台GUI )中文文档-绘图和动画(三)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

Easy Excel从入门到精通!!!

目录 1.文件导入 1.1基本方式读取excel文件内容 1.2注解模型映射器读取excel 1.3多行表头读取 1.4文件上传读取 2.文件导出 2.1基本方式导出 2.2模型映射导出 2.3设置行高、列宽等内容 2.4合并单元格 2.5导出设置超链接、批注、公式 2.6模板填充对象导出 2.7模板填…

Mybatis 返回 Map 对象

一、场景介绍 假设有如下一张学生表: CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(100) NOT NULL COMMENT 姓名,gender varchar(10) NOT NULL COMMENT 性别,grade int NOT NULL COMMENT 年级,PRIMARY KEY (id) ) ENGINEInnoD…

【C++篇】引领C++模板初体验:泛型编程的力量与妙用

文章目录 C模板编程前言第一章: 初始模板与函数模版1.1 什么是泛型编程?1.1.1 为什么要有泛型编程?1.1.1 泛型编程的优势 1.2 函数模板的基础1.2.1 什么是函数模板?1.2.2 函数模板的定义格式1.2.3 示例:通用的交换函数输出示例&am…

华为HarmonyOS地图服务 11 - 如何在地图上增加点注释?

场景介绍 本章节将向您介绍如何在地图的指定位置添加点注释以标识位置、商家、建筑等,并可以通过信息窗口展示详细信息。 点注释支持功能: 支持设置图标、文字、碰撞规则等。支持添加点击事件。 PointAnnotation有默认风格,同时也支持自定…

文献阅读(220)MRCN

题目:MRCN: Throughput-Oriented Multicast Routing for Customized Network-on-Chips时间:2023期刊:TPDS研究机构:韩国成均馆大学 这篇论文探讨的问题是多播死锁问题,下图中Packet A分成两条路径,但在rou…

Leetcode—1014. 最佳观光组合【中等】

2024每日刷题&#xff08;164&#xff09; Leetcode—1014. 最佳观光组合 实现代码 class Solution { public:int maxScoreSightseeingPair(vector<int>& values) {int mxPre values[0] 0;int ans 0;for(int i 1; i < values.size(); i) {ans max(ans, mxP…

python绘制弦图-科研作图

一、背景 弦图以其直观、精美的展示方式受到越来越多人的关注&#xff0c;它不仅能够有效展示两个变量之间的联系&#xff0c;还能同时展现多个变量间的复杂互动&#xff0c;本文将通过Python语言中的pycirclize库&#xff0c;带你深入了解如何绘制弦图。 弦图是一种圆…

51单片机——矩阵键盘

一、矩阵键盘原理图 我们发现: P17,P16,P15,P14控制行&#xff0c; P13,P12,P11,P10控制列。 所以我们如果要选择第四列&#xff0c;只需要把整个P1先给高电位1&#xff0c;再把P10给低电位0。 二、代码 P10xFF; P100; if(P170){Delay(20);while(P170);Delay(20);KeyNum…

计算机毕业设计python+spark知识图谱房价预测系统 房源推荐系统 房源数据分析 房源可视化 房源大数据大屏 大数据毕业设计 机器学习

《PythonSpark知识图谱房价预测系统》开题报告 一、研究背景与意义 随着城市化进程的加速和房地产市场的不断发展&#xff0c;房价成为影响人们生活质量的重要因素之一。准确预测房价不仅有助于政府制定科学的房地产政策&#xff0c;还能为开发商提供市场参考&#xff0c;同时…

DriveMatriX Highway Dataset :高速公路驾驶数据集(猫脸码客 第196期)

DriveMatriX Highway Dataset 1.0&#xff1a;自动驾驶与ADAS感知验证的里程碑 在当今快速发展的自动驾驶&#xff08;AV&#xff09;和高级驾驶辅助系统&#xff08;ADAS&#xff09;领域&#xff0c;数据的获取与处理成为了推动技术进步的关键因素。为了在这些复杂且多变的交…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

【Linux】常用指令【更详细,带实操】

Linux全套讲解系列&#xff0c;参考视频-B站韩顺平&#xff0c;本文的讲解更为详细 目录 一、文件目录指令 1、cd【change directory】指令 ​ 2、mkdir【make dir..】指令​ 3、cp【copy】指令 ​ 4、rm【remove】指令 5、mv【move】指令 6、cat指令和more指令 7、less和…

【设计模式】万字详解:深入掌握五大基础行为模式

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【设计模式】&#xf…

多模态大模型应用开发技术学习

前篇提到多模态模型应用是未来的应用方向&#xff0c;本篇就聊聊技术学习方面的内容。 应用场景 多模态大模型技术的应用场景非常广泛&#xff0c;涵盖了从日常生活到专业领域的各个方面。以下是一些主要的应用场景&#xff1a; 办公自动化&#xff1a;多模态大模型可以用于…

计算机网络-小型综合网络的搭建涉及到无线路由交换安全

目录 1 拓扑架构 2 做项目的思路 3 做配置 3.1先做核心交换 3.2 防火墙的配置 4 ac 和ap 的配置 4.1 ac上配置安全的东西 5.1 测试​编辑 1 拓扑架构 要求看上面的图 2 做项目的思路 这张网很明显是一个小综合&#xff0c;设计到我们的无线交换&#xff0c;路由…

jdk11特性介绍

JDK 11&#xff08;也称为Java 11&#xff09;是Java平台的一个重要版本&#xff0c;它引入了许多新特性和改进&#xff0c;旨在提高开发者的生产力和Java平台的性能。以下是一些JDK 11的主要特性&#xff1a; 局部变量类型推断&#xff08;Local-Variable Syntax for Lambda P…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…

【C语言零基础入门篇 - 17】:排序算法

文章目录 排序算法排序的基本概念冒泡排序选择排序插入排序 排序算法 排序的基本概念 1、什么是排序&#xff1f; 排序是指把一组数据以某种关系&#xff08;递增或递减&#xff09;按顺序排列起来的一种算法。 例如&#xff1a;数列 8、3、5、6、2、9、1、0、4、7 递增排序…