当前位置: 首页 > news >正文

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

文章目录

  • 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.lryc.cn/news/447500.html

相关文章:

  • 光控资本:10转10送10股有多少股?转股与送股又什么区别?
  • 【音乐格式转换攻略】6个好用的音乐转换成mp3格式技巧!
  • 蓝桥杯15届C/C++B组省赛题目
  • 感悟:糟糠之妻不下堂和现在女性觉醒的关系
  • Linux网络之UDP与TCP协议详解
  • K8S:开源容器编排平台,助力高效稳定的容器化应用管理
  • STM32嵌入式编程学习到提高:【4】UART串口打印
  • C 标准库 - <ctype.h>
  • linux:chown用法详解
  • 介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型
  • 2024 Python3.10 系统入门+进阶(十六):正则表达式
  • 书生大模型实战营学习[7] InternLM + LlamaIndex RAG 实践
  • 【MySQL】数据库--索引
  • [大语言模型-论文精读] ACL2024-长尾知识在检索增强型大型语言模型中的作用
  • “迷茫野路子到AI大模型高手:一张图解产品经理晋升之路和能力构建“
  • 可看见车辆行人的高清实时视频第2辑
  • 基于饥饿游戏搜索优化随机森林的数据回归预测 MATLAB 程序 HGS-RF
  • 一天面了8个Java后端,他们竟然还在背5年前的八股文!
  • python功能测试
  • 【秋招笔试】09.25华子秋招(已改编)-三语言题解
  • 【中级通信工程师】终端与业务(四):通信产品
  • 数据科学 - 字符文本处理
  • python之装饰器、迭代器、生成器
  • Go语言实现后台管理系统如何根据角色来动态显示栏目
  • 【深度学习】【TensorRT】【C++】模型转化、环境搭建以及模型部署的详细教程
  • LeetCode(Python)-贪心算法
  • 【C/C++】【基础数论】33、算数基本定理
  • 聚簇索引与非聚簇索引
  • “类型名称”在Go语言规范中的演变
  • c++----继承(初阶)