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

QEMU 搭建arm linux开发环境

Qemu 作为一款强大的开源虚拟化软件,为我们提供了一个便捷且经济实惠的方式来模拟各种硬件环境,从而在上面安装和学习 Linux 系统。本文将详细介绍如何使用 Qemu 搭建 Linux 学习环境,

环境准备

  • 操作系统:建议使用 Ubuntu 20.04 及以上版本,本文以 Ubuntu 20.04 为例进行介绍。因为 Ubuntu 系统拥有丰富的软件源和开发工具,方便我们进行后续的操作。
  • 硬件配置:至少 4GB 内存,以确保 QEMU 模拟的 ARM 系统能够稳定运行。20GB 以上可用磁盘空间,用于存储内核源码、根文件系统等文件。推荐使用双核及以上处理器,以提高编译和模拟的性能。
  • 网络连接:确保主机能够正常访问互联网,因为我们需要从网络上下载内核源码、工具链、根文件系统构建工具等资源。

1. 安装 QEMU

1.1 Ubuntu LTS版本与QEMU版本对照(APT方式)

在 Ubuntu 系统中,打开终端并执行以下命令来安装 QEMU 相关工具:

sudo apt-get update
sudo apt-get install qemu-system-arm
Ubuntu版本QEMU版本更新状态ARM支持特性
18.04 LTS2.11.1停止维护基础VExpress支持
20.04 LTS4.2.1安全更新支持Cortex-A9完整外设
22.04 LTS6.2.0长期支持支持TPM、安全启动
24.04 LTS8.1.2最新版本支持RISC-V、LoongArch
1.2 指定版本安装
wget https://download.qemu.org/qemu-6.2.0.tar.xz
tar xvf qemu-6.2.0.tar.xz
cd qemu-6.2.0

# 2. 配置编译选项
./configure --target-list=arm-softmmu --prefix=/opt/qemu-6.2.0

# 3. 编译安装
make -j12
sudo make install

安装完成,查看版本号
在这里插入图片描述

2. 选择合适的 Linux 内核和 BusyBox 版本

  • Linux 内核:建议选择 4.x 或 5.x 系列的内核版本,因为这些版本对 ARM 架构有较好的支持,并且稳定性和性能都比较不错。例如,Linux 内核 5.15 版本是一个广泛使用且稳定的版本。
  • BusyBox:可以选择较新的稳定版本,如 1.33.x 或 1.34.x 系列,这些版本包含了丰富的工具,能满足根文件系统的基本需求。

3. 编译 Linux 内核

3.1 下载内核源码

可以从 Linux 内核官方网站(https://www.kernel.org/)下载所需版本的内核源码,以 5.15.18 版本为例:

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.18.tar.xz
tar xvf linux-5.15.18.tar.xz
cd linux-5.15.18
3.2 安装交叉编译工具链
sudo apt-get install gcc-arm-linux-gnueabi
3.3 配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig

此命令使用 VExpress 开发板的默认配置。如果需要自定义配置,可以执行:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
3.4 编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage dtbs -j$(nproc)

编译完成后,在 arch/arm/boot 目录下会生成 zImage 内核镜像文件,在 arch/arm/boot/dts 目录下会生成设备树文件 vexpress-v2p-ca9.dtb

在这里插入图片描述

4. 准备根文件系统(使用 BusyBox)

4.1 下载 BusyBox 源码

从 BusyBox 官方网站(https://busybox.net/downloads/)下载所需版本的源码,以 1.36.1 版本为例:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xvf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
4.2 配置 BusyBox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig

同样,如果需要自定义配置,可以执行:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig

在配置界面中,确保选择 “Build BusyBox as a static binary”(将 BusyBox 编译为静态二进制文件),这样可以避免动态链接库的依赖问题。

在这里插入图片描述

4.3 编译并安装 BusyBox
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install

编译完成后,会在 _install 目录下生成根文件系统的基本结构和工具。

4.4 完善根文件系统

创建必要的目录和文件:

cd _install
mkdir -p dev proc sys etc etc/init.d
sudo mknod -m 666 dev/null c 1 3  
sudo mknod -m 666 dev/console c 5 1  # 控制台设备

创建 /etc/init.d/rcS 启动脚本:

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo "Welcome to QEMU VExpress-A9!"
exec /bin/sh

赋予脚本执行权限:

chmod +x etc/init.d/rcS

在这里插入图片描述

4.5 生成initramfs
find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio
cd ..
gzip initramfs.cpio

在这里插入图片描述

5. 启动模拟环境

使用以下 QEMU 命令启动 VExpress - A9 模拟环境:

qemu-system-arm \
    -M vexpress-a9 \
    -m 512M \
    -kernel linux-5.15.18/arch/arm/boot/zImage \
    -dtb linux-5.15.18/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
    -append "console=ttyAMA0 root=/dev/ram rdinit=/sbin/init" \
    -initrd busybox-1.36.1/initramfs.cpio.gz \
    -nographic
  • -M vexpress-a9:指定模拟的开发板型号为 VExpress - A9。
  • -m 512M:为虚拟机分配 512MB 的内存。
  • -kernel:指定内核镜像文件的路径。
  • -dtb:指定设备树文件的路径。
  • -initrd :初始内存文件系统 需使用gzip压缩的cpio归档
  • -nographic:以无图形界面模式启动。
  • -append:传递内核启动参数,指定控制台设备和根文件系统的挂载信息。

启动成功后,你将看到 Linux 系统的启动信息,最终会进入一个简单的 shell 环境。

成功显示:Welcome to QEMU VExpress-A9! 恭喜,环境搭建成功!

在这里插入图片描述

http://www.dtcms.com/a/20067.html

相关文章:

  • 纪念日倒数日项目的实现-【纪念时刻-时光集】
  • Debezium系列之:时区转换器,时间戳字段转换到指定时区
  • SpringCloud Alibaba
  • tensorflow环境中已安装库
  • 【Java集合二】HashMap 详解
  • 【NLP 24、模型训练方式】
  • Leetcode 算法题 88. 合并两个有序数组
  • 【含文档+源码】基于Web的在线课堂测试课程考评系统的开发与实现
  • GPQA (Graduate-Level Google-Proof QA Benchmark) 数据集
  • 图像处理篇---基本OpenMV图像处理
  • HackerRank C++面试,中等难度题目 - Attribute Parser
  • Bandana论文阅读
  • 复杂电磁环境下无人机自主导航增强技术研究报告——地磁匹配与多源数据融合方法,附matlab代码
  • 基于多元高斯分布的异常检测技术原理与实现
  • lean4安装
  • 论文阅读2——S波段宽波束圆极化天线设计
  • 【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析⑤】
  • 初阶数据结构:树---二叉树的链式结构
  • LeetCode1706
  • 使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮
  • [Java网络安全系列面试题] GET 和 POST 的区别在哪里?
  • 1441. 用栈操作构建数组 中等
  • 《当DeepSeek遇上豆包:AI大模型的华山论剑》
  • 我用 Cursor 开发了一款个人小记系统
  • B站视频同步思维导图(全)
  • 利用AI智能体创建云端文档知识库并集成第三方数据源(下)
  • 开发指南101-拖动排序
  • 细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法
  • kafka生产端之架构及工作原理
  • 【弹性计算】容器、裸金属