qemu 源码编译 qemu-system-aarch64 的方法

本文介绍了在Ubuntu20.04上,由于apt安装的QEMU版本过低导致AARCH64架构的网络设备无法使用的问题。作者提供了从源码编译最新版QEMU的步骤,包括克隆源码、更新子模块、安装依赖、配置和编译以及安装。通过编译qemu-system-aarch64,解决了网络设备问题,并给出了编译其他平台版本的配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 最近调试 RT-Thread bsp qemu-virt64-aarch64 时,遇到无法使用网络设备问题,最后确认是 当前 ubuntu 20.04 系统 使用 apt install 安装的 qemu qemu-system-aarch64 版本太低。

  • RT-Thread qemu-virt64-aarch64 里面的网络设备,需要较新的 qemu qemu-virt64-aarch64 版本

环境

  • win10 64位 VMware Workstation Pro 16

  • ubuntu 20.04

  • gcc :gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1), ubuntu 20.04 apt install 安装

下载 qemu

  • 使用 git 克隆 git clone https://github.com/qemu/qemu.git

  • 当前最新的 qemu 版本包含一些子仓库,所以需要更新一下 git submodule,git submodule update --init --force --recursive

编译 qemu-system-aarch64

  • 可以只编译 qemu-system-aarch64,这样速度快一些,并且编译的目录也会小一些

  • 编译前需要安装一些 软件包依赖,主要的是 glib-2.0,安装命令 sudo apt-get install libglib2.0-dev

  • 编译 qemu-system-aarch64 的命令如下:

  • 首先在 qemu 代码的外部目录,创建一个 build 目录,如 qemu_build,然后进入 qemu_build 目录下

# qemu 代码目录的外部创建 
mkdir qemu_build

# 进入 qemu_build 目录
cd qemu_build

# 执行 configure
../qemu/configure --prefix=/home/zhangsz/tools/qemu8 --enable-virtfs --enable-slirp --target-list=aarch64-softmmu

# 可以使用 make 或者 ninja 进行编译
ninja -j12

# 可以使用 ninja 或者 make install 进行安装到 prefix 目录(如果指定)
ninja install
  • 备注说明

  • ../qemu/configure :qemu 源码路径下的 configure

  • --prefix=/home/zhangsz/tools/qemu8 指定安装 install 目录,不指定会安装到 系统目录下,配置完可以查看 prefix

  • --enable-virtfs : 开启 virtfs 选项,

  • --enable-slirp :使能 网卡 user 选项

  • --target-list=aarch64-softmmu : 这里指定只编译 qemu-system-aarch64,没有这个选项,则全部编译各个平台

  • 编译: make 或者 ninja,建议 多线程编译,速度快一些

  • 安装 install : 可以使用 ninja install 或者 make install

qemu 支持的平台

  • 可以查看 qemu 源码目录下的 configs/targets/ 目录

在这里插入图片描述

查看编译产物

  • make install 或者 ninja install 后,产物如下:

在这里插入图片描述

  • 当前编译的版本:
$ ./qemu-system-aarch64 --version
QEMU emulator version 8.0.50 (v8.0.0-2304-g408015a97d-dirty)
Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers
  • 当前支持的 虚拟设备
$ ./qemu-system-aarch64 -M ?
Supported machines are:
akita                Sharp SL-C1000 (Akita) PDA (PXA270)
ast1030-evb          Aspeed AST1030 MiniBMC (Cortex-M4)
ast2500-evb          Aspeed AST2500 EVB (ARM1176)
ast2600-evb          Aspeed AST2600 EVB (Cortex-A7)
bletchley-bmc        Facebook Bletchley BMC (Cortex-A7)
borzoi               Sharp SL-C3100 (Borzoi) PDA (PXA270)
bpim2u               Bananapi M2U (Cortex-A7)
canon-a1100          Canon PowerShot A1100 IS (ARM946)
cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
collie               Sharp SL-5500 (Collie) PDA (SA-1110)
connex               Gumstix Connex (PXA255)
cubieboard           cubietech cubieboard (Cortex-A8)
emcraft-sf2          SmartFusion2 SOM kit from Emcraft (M2S010)
fby35-bmc            Facebook fby35 BMC (Cortex-A7)
fby35                Meta Platforms fby35
fp5280g2-bmc         Inspur FP5280G2 BMC (ARM1176)
fuji-bmc             Facebook Fuji BMC (Cortex-A7)
g220a-bmc            Bytedance G220A BMC (ARM1176)
highbank             Calxeda Highbank (ECX-1000)
imx25-pdk            ARM i.MX25 PDK board (ARM926)
integratorcp         ARM Integrator/CP (ARM926EJ-S)
kudo-bmc             Kudo BMC (Cortex-A9)
kzm                  ARM KZM Emulation Baseboard (ARM1136)
lm3s6965evb          Stellaris LM3S6965EVB (Cortex-M3)
lm3s811evb           Stellaris LM3S811EVB (Cortex-M3)
mainstone            Mainstone II (PXA27x)
mcimx6ul-evk         Freescale i.MX6UL Evaluation Kit (Cortex-A7)
mcimx7d-sabre        Freescale i.MX7 DUAL SABRE (Cortex-A7)
microbit             BBC micro:bit (Cortex-M0)
midway               Calxeda Midway (ECX-2000)
mori-bmc             Mori BMC (Cortex-A9)
mps2-an385           ARM MPS2 with AN385 FPGA image for Cortex-M3
mps2-an386           ARM MPS2 with AN386 FPGA image for Cortex-M4
mps2-an500           ARM MPS2 with AN500 FPGA image for Cortex-M7
mps2-an505           ARM MPS2 with AN505 FPGA image for Cortex-M33
mps2-an511           ARM MPS2 with AN511 DesignStart FPGA image for Cortex-M3
mps2-an521           ARM MPS2 with AN521 FPGA image for dual Cortex-M33
mps3-an524           ARM MPS3 with AN524 FPGA image for dual Cortex-M33
mps3-an547           ARM MPS3 with AN547 FPGA image for Cortex-M55
musca-a              ARM Musca-A board (dual Cortex-M33)
musca-b1             ARM Musca-B1 board (dual Cortex-M33)
musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
netduino2            Netduino 2 Machine (Cortex-M3)
netduinoplus2        Netduino Plus 2 Machine (Cortex-M4)
none                 empty machine
npcm750-evb          Nuvoton NPCM750 Evaluation Board (Cortex-A9)
nuri                 Samsung NURI board (Exynos4210)
olimex-stm32-h405    Olimex STM32-H405 (Cortex-M4)
orangepi-pc          Orange Pi PC (Cortex-A7)
palmetto-bmc         OpenPOWER Palmetto BMC (ARM926EJ-S)
qcom-dc-scm-v1-bmc   Qualcomm DC-SCM V1 BMC (Cortex A7)
qcom-firework-bmc    Qualcomm DC-SCM V1/Firework BMC (Cortex A7)
quanta-gbs-bmc       Quanta GBS (Cortex-A9)
quanta-gsj           Quanta GSJ (Cortex-A9)
quanta-q71l-bmc      Quanta-Q71l BMC (ARM926EJ-S)
rainier-bmc          IBM Rainier BMC (Cortex-A7)
raspi0               Raspberry Pi Zero (revision 1.2)
raspi1ap             Raspberry Pi A+ (revision 1.1)
raspi2b              Raspberry Pi 2B (revision 1.1)
raspi3ap             Raspberry Pi 3A+ (revision 1.0)
raspi3b              Raspberry Pi 3B (revision 1.2)
realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
romulus-bmc          OpenPOWER Romulus BMC (ARM1176)
sabrelite            Freescale i.MX6 Quad SABRE Lite Board (Cortex-A9)
sbsa-ref             QEMU 'SBSA Reference' ARM Virtual Machine
smdkc210             Samsung SMDKC210 board (Exynos4210)
sonorapass-bmc       OCP SonoraPass BMC (ARM1176)
spitz                Sharp SL-C3000 (Spitz) PDA (PXA270)
stm32vldiscovery     ST STM32VLDISCOVERY (Cortex-M3)
supermicro-x11spi-bmc Supermicro X11 SPI BMC (ARM1176)
supermicrox11-bmc    Supermicro X11 BMC (ARM926EJ-S)
sx1                  Siemens SX1 (OMAP310) V2
sx1-v1               Siemens SX1 (OMAP310) V1
tacoma-bmc           OpenPOWER Tacoma BMC (Cortex-A7)
terrier              Sharp SL-C3200 (Terrier) PDA (PXA270)
tiogapass-bmc        Facebook Tiogapass BMC (ARM1176)
tosa                 Sharp SL-6000 (Tosa) PDA (PXA255)
verdex               Gumstix Verdex Pro XL6P COMs (PXA270)
versatileab          ARM Versatile/AB (ARM926EJ-S)
versatilepb          ARM Versatile/PB (ARM926EJ-S)
vexpress-a15         ARM Versatile Express for Cortex-A15
vexpress-a9          ARM Versatile Express for Cortex-A9
virt-2.10            QEMU 2.10 ARM Virtual Machine
virt-2.11            QEMU 2.11 ARM Virtual Machine
virt-2.12            QEMU 2.12 ARM Virtual Machine
virt-2.6             QEMU 2.6 ARM Virtual Machine
virt-2.7             QEMU 2.7 ARM Virtual Machine
virt-2.8             QEMU 2.8 ARM Virtual Machine
virt-2.9             QEMU 2.9 ARM Virtual Machine
virt-3.0             QEMU 3.0 ARM Virtual Machine
virt-3.1             QEMU 3.1 ARM Virtual Machine
virt-4.0             QEMU 4.0 ARM Virtual Machine
virt-4.1             QEMU 4.1 ARM Virtual Machine
virt-4.2             QEMU 4.2 ARM Virtual Machine
virt-5.0             QEMU 5.0 ARM Virtual Machine
virt-5.1             QEMU 5.1 ARM Virtual Machine
virt-5.2             QEMU 5.2 ARM Virtual Machine
virt-6.0             QEMU 6.0 ARM Virtual Machine
virt-6.1             QEMU 6.1 ARM Virtual Machine
virt-6.2             QEMU 6.2 ARM Virtual Machine
virt-7.0             QEMU 7.0 ARM Virtual Machine
virt-7.1             QEMU 7.1 ARM Virtual Machine
virt-7.2             QEMU 7.2 ARM Virtual Machine
virt-8.0             QEMU 8.0 ARM Virtual Machine
virt                 QEMU 8.1 ARM Virtual Machine (alias of virt-8.1)
virt-8.1             QEMU 8.1 ARM Virtual Machine
witherspoon-bmc      OpenPOWER Witherspoon BMC (ARM1176)
xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
xlnx-versal-virt     Xilinx Versal Virtual development board
xlnx-zcu102          Xilinx ZynqMP ZCU102 board with 4xA53s and 2xR5Fs based on the value of smp
yosemitev2-bmc       Facebook YosemiteV2 BMC (ARM1176)
z2                   Zipit Z2 (PXA27x)

使用方法

  • 可以通过修改系统的环境变量,让 qemu-system-aarch64 生效

  • 修改 /etc/profilesudo vim /etc/profile,最后添加 qemu qemu-system-aarch64 的安装路径 export PATH=$PATH:/home/zhangsz/tools/qemu8/bin

在这里插入图片描述

  • 然后执行 source /etc/profile,即可生效,后续直接执行 qemu-system-aarch64 就可以了,不用全路径

小结

  • 本篇主要记录 如何使用 qemu 源码编译 较新版本 qemu-system-aarch64 的方法

  • 当前 ubuntu 20.04 默认 apt install 安装的 qemu 版本比较的低,可以尝试手动 编译 qemu,升级 qemu 的版本

  • 编译 其他的平台,如 qemu-system-arm,只需要更改编译配置: --target-list=arm-softmmu

# 执行 configure
../qemu/configure --prefix=/home/zhangsz/tools/qemu8 --enable-virtfs --enable-slirp --target-list=arm-softmmu
QEMU 是一个通用的开源机器模拟器和虚拟化器,它支持多种架构,包括 ARM64(aarch64)。`qemu-system-aarch64` 是 QEMU 中用于模拟 ARM64 架构的虚拟机的命令行工具。通过这个工具,用户可以在非 ARM64 的宿主机上模拟 ARM64 环境,例如在 x86_64 架构的宿主机上运行 ARM64 Linux 内核。 以下是使用 `qemu-system-aarch64` 启动 ARM64 Linux 内核的一些关键步骤和参数: 1. **查看版本号**: ```shell qemu-system-aarch64 --version ``` 这个命令用于查看当前安装的 `qemu-system-aarch64` 版本信息。 2. **启动 ARM64 Linux 内核**: ```shell qemu-system-aarch64 -M virt -cpu cortex-a53 -nographic -kernel linux-6.7/arch/arm64/boot/Image --append "console=ttyAMA0" -initrd ./rootfs.cpio ``` 这个命令启动了一个虚拟机,其中 `-M virt` 指定了使用虚拟的机器类型,`-cpu cortex-a53` 指定了 CPU 类型,`-nographic` 表示不使用图形界面,`-kernel` 指定了内核映像的路径,`--append` 用于添加启动参数,`-initrd` 指定了初始 RAM 磁盘的路径。 3. **退出 QEMU 虚拟机**: 在 QEMU 虚拟机运行时,同时按下 `ctrl + a`,然后松开,再按下 `x`,即可退出虚拟机回到原本的终端窗口。 4. **启动带有 virtio 设备的虚拟机**: ```shell qemu-system-aarch64 -name vm2 -daemonize -enable-kvm -M virt -cpu host -smp 2 -m 4096 -global virtio-blk-device.scsi=off -device virtio-scsi-device,id=scsi -kernel vmlinuz-4.18 --append "console=ttyAMA0 root=UUID=6a09973e-e8fd-4a6d-a8c0-1deb9556f477" -initrd initramfs-4.18 -drive file=vhuser-test1.qcow2 -netdev user,id=unet,hostfwd=tcp:127.0.0.1:1122-:22 -device virtio-net-device,netdev=unet -vnc :10 ``` 这个命令启动了一个带有 virtio 设备的虚拟机,其中 `-enable-kvm` 表示启用 KVM 加速,`-M virt` 指定了使用虚拟的机器类型,`-cpu host` 表示使用宿主机的 CPU 类型,`-smp` 指定了虚拟 CPU 的数量,`-m` 指定了内存大小,`-drive` 指定了磁盘镜像文件,`-netdev` 和 `-device` 用于配置网络设备。 5. **环境信息**: 用户的环境信息包括宿主机硬件平台为 x86_64,宿主机操作系统为 Ubuntu 20.04,QEMU 版本为 qemu-4.2.1,实验内核为 linux-5.19,busybox 版本为 busybox-1.35.0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangsz_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值