在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
介绍驱动开发环境搭建和交叉编译程序测试
...待后续更新