Ubuntu22.04搭建QEMU嵌入式开发环境全攻略

在ubuntu22.04搭建qemu的嵌入式开发环境教程

QEMU介绍

在现代嵌入式开发与操作系统验证领域中,QEMU(Quick Emulator)已经成为不可或缺的核心工具之一。它不仅能够在不同架构之间进行高效的硬件模拟,还能在没有真实硬件的情况下完成系统启动、驱动开发与调试验证,大幅降低了开发成本与迭代周期。对于开发者而言,QEMU 的价值不仅仅是"跑一个虚拟机"这么简单,它更像是一个可编程的硬件实验平台:你可以模拟 ARM、RISC-V、x86 等多种处理器架构,也可以构建自定义外设环境,用于验证 Linux 内核、Bootloader 甚至底层驱动的行为。

本篇文章将围绕 QEMU 的基本原理、常见使用场景以及在驱动开发和应用开发中的实践方式展开,适合零基础上手验证和测试。

开发环境和需要安装的组件

小编的ubuntu版本信息如下:

bash 复制代码
$ uname -a
Linux yz-MS-7E06 6.8.0-110-generic #110~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Mar 27 12:43:08 UTC  x86_64 x86_64 x86_64 GNU/Linux

需要安装组件:

bash 复制代码
sudo apt install -y  git build-essential ninja-build pkg-config meson   python3 python3-pip   libglib2.0-dev libpixman-1-dev zlib1g-dev   libgtk-3-dev libvte-2.91-dev   libaio-dev liburing-dev   libgnutls28-dev  libcap-ng-dev libattr1-dev libseccomp-dev   libfdt-dev libvirt-dev

正常将环境执行起来,需要buildqemu-system-aarch64和Image以及rootfs.img文件,下面逐个介绍如何编译获取。

准备编译qemu源代码

下载qemu源代码和编译,命令如下:

bash 复制代码
mkdir -p ~/Desktop/qemu
cd ~/Desktop/qemu
git clone https://gitlab.com/qemu-project/qemu.git
cd qemu
mkdir build
cd build
../configure \
  --target-list=aarch64-softmmu \
  --enable-kvm \
  --enable-slirp 
 make -j24 #最终的编译的成果物在 ~/Desktop/qemu/qemu/buildqemu-system-aarch64

准备编译kernel的成果物

主要执行如下的指令:

bash 复制代码
mkdir -p ~/Desktop/qemu/kernel-src
cd ~/Desktop/qemu/kernel-src
git clone --depth 1 --branch v6.6 \
	https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git #根据个人的需要选择需要的kernel的内核版本
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
make menuconfig #根据需要进行kernel的配置
make -j24 Image #成果物文件在~/Desktop/qemu/kernel-src/linux/arch/arm64/boot/Image

准备打包rootfs.img文件

bash 复制代码
mkdir -p ~/Desktop/qemu/rootfs
sudo debootstrap --arch=arm64 bookworm ./rootfs https://cdn-fastly.deb.debian.org/debian
sudo mount --bind /dev ~/Desktop/qemu/rootfs/dev
sudo mount --bind /proc ~/Desktop/qemu/rootfs/proc
sudo mount --bind /sys ~/Desktop/qemu/rootfs/sys
sudo mount --bind /run ~/Desktop/qemu/rootfs/run
sudo chroot ~/Desktop/qemu/rootfs /bin/bash
apt-get update
apt install -y \
    build-essential \
    vim \
    ssh \
    gdb \
    kmod \
    net-tools \
    iproute2 \
    pciutils \
    i2c-tools
passwd #配置root的密码
exit
sudo umount ~/Desktop/qemu/rootfs/{dev,proc,sys}
dd if=/dev/zero of=rootfs.img bs=1M count=4096 
mkfs.ext4 rootfs.img
sudo mount rootfs.img /mnt
sudo cp -a rootfs/* /mnt/
sudo umount /mnt

执行完上面的指令后,有个最小文件系统的rootfs.img文件

运行虚拟qemu系统和本机的ssh登陆

准备好上面的文件后,执行如下命令:

bash 复制代码
~/Desktop/qemu/qemu/build/qemu-system-aarch64 \
        -machine virt,highmem=on \
        -cpu cortex-a57 \
        -smp 4 -m 2G \
        -nographic \
        -kernel ~/Desktop/qemu/kernel-src/linux/arch/arm64/boot/Image \
        -append "console=ttyAMA0 root=/dev/vda rw" \
        -drive file=~/Desktop/qemu/rootfs.img,if=virtio,format=raw \
        -device pci-testdev \
        -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22 \
        -device virtio-net-pci,netdev=net0 

正常启动如下图所示,带一个串口的登陆交互接口:

进入系统后,根据需要使用apt命令安装需要的软件包

配置SSH远程登陆:

bash 复制代码
apt install -y openssh-server
vim /etc/ssh/sshd_config
#修改 PermitRootLogin yes
#修改 PasswordAuthentication yes 确保root可以远程ssh登陆
systemctl enable ssh
systemctl start ssh

另开一个命令窗口,执行如下命令进行登陆:sshpass -p '123' ssh root@127.0.0.1 -p 2222,如下图所示:

关于上面的繁琐指令,小编整理一个脚本方便自动化执行如下:

bash 复制代码
#!/bin/bash
# 检查是否传入了参数
if [ $# -lt 1 ]; then
    echo "Usage: $0 <option>"
    echo "Options:"
    echo "  1     开始挂在rootfs系统"
    echo "  2     将rootfs打包进去系统"
    echo "  3     qemu挂在当前的img系统"
    echo "  4     本地ssh登陆系统"
    echo "  status   查看当前挂载状态"
    exit 1
fi

# 获取第一个参数
ACTION=$1

case "$ACTION" in
    1)
        echo "开始挂载rootfs系统..."
        sudo mount --bind /dev ~/Desktop/qemu/rootfs/dev
        sudo mount --bind /proc ~/Desktop/qemu/rootfs/proc
        sudo mount --bind /sys ~/Desktop/qemu/rootfs/sys
        sudo mount --bind /run ~/Desktop/qemu/rootfs/run
        sudo chroot ~/Desktop/qemu/rootfs /bin/bash
        ;;
    2)
        echo "将rootfs打包进去系统..."
        sudo umount ~/Desktop/qemu/rootfs/{dev,proc,sys}
        sudo mount rootfs.img /mnt
        sudo cp -a rootfs/* /mnt/
        sudo umount /mnt
        ;;
    3)
        echo "qemu挂在当前的img系统..."
        ~/Desktop/qemu/qemu/build/qemu-system-aarch64 \
        -machine virt,highmem=on \
        -cpu cortex-a57 \
        -smp 4 -m 2G \
        -nographic \
        -kernel ~/Desktop/qemu/kernel-src/linux/arch/arm64/boot/Image \
        -append "console=ttyAMA0 root=/dev/vda rw" \
        -drive file=~/Desktop/qemu/rootfs.img,if=virtio,format=raw \
        -device pci-testdev \
        -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22 \
        -device virtio-net-pci,netdev=net0 
        ;;
    4)
        echo "本地ssh登陆系统..."
        sshpass -p '123' ssh root@127.0.0.1 -p 2222
        ;;
    status)
        echo "查看当前挂载状态..."
        ;;
    *)
        echo "无效的选项: $ACTION"
        echo "Usage: $0 <option>"
        echo "Options:"
        echo "  1     开始挂载rootfs系统"
        echo "  2     将rootfs打包进去系统"
        echo "  3     qemu挂在当前的img系统"
        echo "  status   查看当前挂载状态"
        exit 1
        ;;
esac

介绍驱动开发环境搭建和交叉编译程序测试

...待后续更新

相关推荐
向日葵.6 小时前
linux & qnx & git 命令 1
linux·运维·服务器
Zyed7 小时前
[STM32]Day13修改主频、睡眠模式+串口发送、停止模式+对射式红外传感器计次、待机模式+实时时钟
stm32·单片机·嵌入式硬件
2023自学中7 小时前
Linux 内核与用户空间 内存管理详解(堆与栈篇)
linux·嵌入式·内存·开发板
似水এ᭄往昔7 小时前
【Linux系统编程】--虚拟地址空间
linux·服务器
不会C语言的男孩7 小时前
Linux 系统编程 · 第 3 章:文件 I/O 基础
linux·服务器
硬件工程师宝典7 小时前
I2C从入门到精通之一:I2C的历史起源和综合简介
服务器·嵌入式硬件·硬件架构·i2c
金色光环7 小时前
DSP28335 SPI通信实验:从零到实战
单片机·嵌入式硬件·物联网
dadaobusi7 小时前
Linux内核完成大量内存/调度/时间子系统初始化的关键阶段
java·linux·前端
唐墨1237 小时前
关于linux kernel错误码为负数编码这件事情,我个人的一些看法
linux·运维·服务器
Full Stack Developme7 小时前
Linux Shell 教程概览
linux·前端·chrome