当前位置: 首页 > 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的时候设置的)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【后端】【语言】【python】python常见操作
  • 【计网】从零开始掌握序列化 --- 基础知识储备与程序重构
  • Elasticsearch黑窗口启动乱码问题解决方案
  • Eigen之SelfAdjointEigenSolver
  • 【TS】TypeScript内置条件类型-ReturnType
  • 实时监控,动态调整 —— 淘宝商品详情API助力商家实现灵活经营
  • 优化算法(五)—梯度下降算法(附MATLAB程序)
  • 汽车售后诊断ECU参数分析
  • Pygame中Sprite实现逃亡游戏3
  • Pandas 数据分析入门详解
  • 基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作
  • Unity2022.3.x各个版本bug集合及推荐稳定版本
  • 基于AI+多技术融合在流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的实践应用
  • 神经网络(四):UNet图像分割网络
  • 运行程序时总是提示带so.xx.xx版本号共享库打不开(共享库的不同命名的含义)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • HTML-表单
  • interface和setter,getter
  • jQuery(一)
  • Redis 懒删除(lazy free)简史
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 警报:线上事故之CountDownLatch的威力
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何胜任知名企业的商业数据分析师?
  • 深入浅出webpack学习(1)--核心概念
  • 小程序button引导用户授权
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • $().each和$.each的区别
  • $.ajax中的eval及dataType
  • (13)Hive调优——动态分区导致的小文件问题
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (面试必看!)锁策略
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)基于IDEA的JAVA基础1
  • .Family_物联网
  • .net core 6 redis操作类
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net6 Api Swagger配置
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .NET6实现破解Modbus poll点表配置文件
  • .NET与 java通用的3DES加密解密方法
  • // an array of int
  • @ComponentScan比较
  • @Query中countQuery的介绍
  • [C# 网络编程系列]专题六:UDP编程
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [dart学习]第四篇:函数
  • [dts]Device Tree机制
  • [emacs] CUA的矩形块操作很给力啊