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

news2024/11/14 20:36:57

文章目录

  • 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_tem
 qemu-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.coloradmin.cn/o/2157097.html

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

相关文章

嵌入式单片机STM32开发板详细制作过程--01

大家好,今天主要给大家分享一下,单片机开发板的制作过程,原理图的制作与PCB设计,以及电子元器件采购与焊接。 第一:单片机开发板成品展示 板子正面都有各个芯片的丝印与标号,方便焊接元器件的时候,可以参考。(焊接完成之后,成品图如下) 第二:开发板原理图制作 在制…

OpenCV系列教程三:形态学、图像轮廓、直方图

文章目录 一、形态学1.1 阈值处理1.1.1 全局阈值处理1.1.2 全局阈值处理之Otsus 阈值法1.1.3 自适应阈值处理 1.2 腐蚀与膨胀1.2.1 腐蚀操作1.2.2 创建形态学卷积核1.2.3 膨胀操作 1.3 开运算和闭运算1.4 形态学梯度1.5 顶帽操作(tophat)1.6 黑帽操作(Black Hat&…

基于JAVA+SpringBoot+Vue的社区智慧养老监护管理平台

基于JAVASpringBootVue的社区智慧养老监护管理平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x1…

Arthas heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)

文章目录 二、命令列表2.1 jvm相关命令### 2.1.8 heapdump(dump java heap, 类似 jmap 命令的 heap dump 功能)举例1:假设你想生成一个只包含活动对象的堆转储文件,并将其保存为 /tmp/heapdump.hprof举例2:如果你想要进…

社区团购的创新与变革——融合开源链动 2+1 模式、AI 智能名片及 S2B2C 商城小程序

摘要:本文从信息流、资金流、物流角度深入分析社区团购的特点,探讨其如何避免传统线下中心零售的高展示成本与传统电商的高交付成本。同时,引入开源链动 21 模式、AI 智能名片及 S2B2C 商城小程序等创新元素,阐述它们为社区团购带…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作,但是当时是第一次学习,肯定有些地方…

华为OD机试 - N个选手比赛前三名、比赛(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

【STM32】TIM定时器定时中断与定时器外部时钟的使用

TIM定时器定时中断与定时器外部时钟的使用 一、TIM定时器简介1、TIM(Timer)定时器2、定时器类型3、高级定时器4、通用定时器5、基本定时器6、定时中断基本结构代码编写:定时中断/外部时钟定时中断 7、预分频器时序8、计数器时序9、计数器无预…

手写SpringMVC

1、开发HspDispatcherServlet 2、完成客户端/浏览器可以请求控制层 目的:发出url请求时,经过前端控制器,找到Monster的List方法,把结果再打回去 3、从web.xml动态获取hspspringmvc.xml 4、完成自定义Service注解功能 目的&…

【功能详解】IoTDB 与 ThingsBoard 成功集成!

可视化工具集成1 IoTDB 实现了 ThingsBoard 的无缝集成对接,IoTDB 构建的工业数据存储处理-可视化呈现链路又多了一种可用、易用的工具选择。 我们的代码已贡献到 ThingsBoard 社区(待发版),用户手册也已发布(可点击下…

HBASE_题库详解

1、 HBase的特点是什么? 1)大:一个表可以有数十亿行,上百万列 2)无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列 3…

浪涌抑制-功率NTC选型计算

目录: 一、概述 二、NTC抑制浪涌原理 三、功率NTC的介绍 四、功率NTC选型原则 1、峰值正向浪涌电流 2、阻值选取 3、正常工作的计算 一、概述 NTC热敏电阻除用于温度测量(热敏电阻温度检测-分段曲线拟合、Steinhart-Hart与查表)外,在电源中常用于…

word如何快速打开文档中的网址超链接?

1、鼠标放在文档中超链接上: 2、然后左手按住【CTRL】键,之后鼠标光标会变成一个手形, 然后右手,点击鼠标左键,即可快速使用电脑当前设置的默认浏览器打开并跳转到网址:

三阶魔方还原法 勾上回下 上右左左右

三阶魔方还原法: 1小白花 (转3换1) 2白十字架 (侧与中心同色 下下) 3第一层 (找位置角块放顶点 勾上回下) 4 第二层 (颜色边 勾上回下 再单白边 勾上回下) 5 黄十字架 (无黄边 压 勾…

nodejs基于vue电子产品商城销售网站的设计与实现 _bugfu

目录 技术栈具体实现截图系统设计思路技术可行性nodejs类核心代码部分展示可行性论证研究方法解决的思路Express框架介绍源码获取/联系我 技术栈 该系统将采用B/S结构模式,开发软件有很多种可以用,本次开发用到的软件是vscode,用到的数据库是…

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代,我们每天都在忙碌中度过,手机虽然方便,但往往难以找到一整块时间来专心背单词。然而,你是否意识到,每天坐在电脑前的时间远比使用手机的时间要长?现在我们来介绍一个新型的学习软…

阿里云kafka消息写入topic失败

1. 问题现象描述 20240918,14:22,测试反馈说kafka有问题,生产者写入消息的时候报错,并发了一张日志截图,主要报错如下: to topic xxxx: org.apache.kafka.common.errors.TimeoutException: Expiring 1 record(s) for x…

Linux中的环境变量及main函数参数详解

目录 Linux中的环境变量 常见环境变量 PATH : 和环境变量相关的命令 通过系统调用获取或设置环境变量 getenv putenv 新增环境变量 进程切换: main函数参数 命令行参数 Linux中的环境变量 环境变量(environment variables)一般是指在操作系统中用来指定操…

Leetcode 每日一题:Diameter of Binary Tree

写在前面: 最近被学校的 campus involvement 社团活动的招新宣传和选拔,以及找工作频繁的参加招聘会和网上申请忙的焦头烂额,马上又要到来的期中考试让我再次意识到了大学生活的险恶。虽然大家都说学生时代是最幸福的时代,但这个…

Python中的数据可视化:从基础图表到高级可视化

数据可视化是数据分析和科学计算中不可或缺的一部分。它通过图形化的方式呈现数据,使复杂的统计信息变得直观易懂。Python提供了多种强大的库来支持数据可视化,如Matplotlib、Seaborn、Plotly等。本文将从基础图表入手,逐步介绍如何使用这些库…