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

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

...待后续更新

相关推荐
恒53910 小时前
Linux文件系统I
linux·运维·服务器
阿成学长_Cain10 小时前
Linux ipcs 命令超全详解:查看共享内存 / 消息队列 / 信号量,IPC 运维必备
linux·运维·服务器·网络·数据库
黯然神伤88811 小时前
AlmaLinux设置软件下载源
linux·alma
青瓦梦滋11 小时前
协议定制/序列化-反序列化(Linux视角)
linux·服务器·网络·c++
阿成学长_Cain14 小时前
Linux dirs命令详解|Bash目录堆栈管理快速切换目录实战教程
linux·运维·前端·数据库
ICECREAM15 小时前
Linux 进程间通讯(IPC)——总结
linux
2401_8541515516 小时前
ARM Cortex-M 体系结构深度解析——寄存器模型、处理器模式、AAPCS 与异常模型
arm开发·stm32·单片机·嵌入式硬件
想你依然心痛16 小时前
嵌入式Linux安全加固:SELinux、Capabilities与Seccomp——强制访问控制与沙箱
linux·运维·安全
REDcker17 小时前
macOS 挂载 Linux 远程目录详解
linux·运维·macos
2601_9615934218 小时前
Mac 上搭建Linux环境吗?VMware + CentOS Stream 9 镜像快速部署
linux·运维·ide·macos·centos