📝 1. 简介

🔹 QEMU 简介

QEMU(Quick Emulator)是一个开源的虚拟化工具,支持多种硬件架构(x86、ARM、RISC-V 等),可以在不同平台上运行不同架构的操作系统。它既可以做全系统虚拟化(模拟整个硬件平台),也可以做用户态模拟(仅运行特定架构的程序)。

🔹 Alpine Linux 简介

Alpine Linux 是一个小巧、安全、资源占用极低的 Linux 发行版,基于 musl libcbusybox。它特别适合嵌入式系统、容器环境和轻量化虚拟机场景。缺点是默认极简,很多常用工具(如 vim)需要手动安装。

🔹 QEMU 启动方式

QEMU中的系统有两种启动方式:

  1. 临时系统模式
    该模式直接用 ISO 或 rootfs 启动,无虚拟硬盘;重启后数据丢失,适合一次性测试、LiveCD、系统救援、教学演示等场景。

  2. 持久化系统模式
    该模式使用虚拟硬盘文件(.img / .qcow2),重启保留数据,适合长期开发、配置保存、多次迭代测试、模拟部署

下文会依次介绍这两种模式。


⚙️ 2. Linux安装与配置 QEMU

在 Linux 系统中 QEMU 的安装与基本配置流程较复杂,详见:
⚡ Linux 系统(arm64位架构)安装与配置 QEMU-CSDN博客


🚀 3. Alpine 临时系统环境搭建流程

📥 3.1 下载 Alpine ISO

使用 wget 从 Alpine 官方下载镜像:

wget https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-standard-3.19.1-x86_64.iso

💾 3.2 创建虚拟硬盘文件

使用qemu的命令创建2G的qcow2格式的虚拟硬盘文件alpine.img

qemu-img create -f qcow2 alpine.img 2G

💡 也可以创建raw格式的文件,把参数中qcow2该成raw就行了

🖥️ 3.3 启动临时系统(NAT 网络)

运行qemu-system-x86_64程序启动x86_64架构的alpine临时系统

sudo qemu-system-x86_64 \
  -m 512 \
  -cdrom alpine-standard-3.19.1-x86_64.iso \
  -boot d \
  -hda alpine.img \
  -netdev user,id=net0 \
  -device e1000,netdev=net0 \
  -fsdev local,id=fsdev0,path=/opt/toolchains,security_model=none \
  -device virtio-9p-pci,fsdev=fsdev0,mount_tag=hosttools \
  -nographic

参数说明

  • qemu-system-x86_64 : 启动 QEMU,模拟 x86_64 架构系统

  • -m 512 : 分配 512MB 内存

  • -cdrom alpine-standard-3.19.1-x86_64.iso: 挂载 ISO 作为光驱启动

  • -boot d : 从光驱启动 (d 光驱, c 硬盘)

  • -hda alpine.img : 指定虚拟硬盘文件(临时系统模式不会写入)

  • -netdev user : NAT 网络模式,虚拟机可访问外网

  • -fsdev + -device virtio-9p-pci : 挂载宿主机共享目录

  • -nographic : 命令行模式,无 GUI

启动会需要等待一段时间,启动完成后会出现 login 提示,输入用户名 root密码root 登录。

🧦 QEMU的启动命令可以说又臭又长,而且写错一个就起不起来,建议写个脚本来启动

📂 3.4 挂载共享文件夹

根据启动参数中的 -fsdev 和 -device virtio-9p-pci 输入挂载命令挂载共享文件夹

mkdir -p /mnt/hosttools
mount -t 9p -o trans=virtio hosttools /mnt/hosttools

🌐 3.5 网络配置

临时系统默认网络未配置,可以通过ip link 命令查看(eth0未up)

执行以下命令打开eth0网卡并动态分配IP,最后检查是否能ping通百度。

ip link set eth0 up
udhcpc -i eth0
ping baidu.com

如果能 ping 通,说明网络已正常。

📦 3.6 软件源配置

临时系统默认软件源为 /media/cdrom/apks,能安装的软件数量有限。如果需要安装更多软件需要修改 /etc/apk/repositories 添加官方源:

http://dl-cdn.alpinelinux.org/alpine/v3.19/main
http://dl-cdn.alpinelinux.org/alpine/v3.19/community

修改完以后可以装一个vim检验以下软件源是否生效(默认软件源中是没有vim的,顺便一提他这个安装命令时 apk 不是 apt 不要输错了)

apk update
apk add vim
vim --version

⚠️ 临时系统不保证所有软件可安装,如需完整软件环境请使用持久化系统。


💾 4. Alpine 持久化系统环境搭建流程

📥 4.1 下载 Alpine ISO

同 3.1。

💽 4.2 创建虚拟硬盘文件

同 3.2。

🖥️ 4.3 启动临时系统(NAT 网络)

同 3.3。

🔧 4.4 配置持久化系统

在系统中执行:

setup-alpine

进入配置系统参数的命令行界面,我们需要根据提示来输入配置的选项,每个提示的内容和推荐输入的选项如下:

  • which one do you want to initialize? (你要初始化哪个网卡) [eth0]

  • ip address for eth0? (你希望怎么分配 IP 地址) [dhcp]

  • Do you want to do any manual network configuration? (你是否希望手动配置网络) [n]

  • which timezone are you in? (你在哪个时区) [Asia/Shanghai]

  • HTTP/FTP proxy URL? (是否配置HTTP/FTP 代理) [none]

  • Which NTP Clinet to run? (你要使用哪个系统时间同步客户端) [chrony]

  • APK Mirror? (你要使用哪个软件源) [1]

  • Setup a user? (是否创建一个非root用户)[n](只使用 root)

  • Which ssh server? (你要使用哪个ssh服务) [openssh]

  • Allow root ssh login? (是否运行ssh以root权限登录) [prohibit-password]

  • Enter ssh key or URL for root? (是否给root用户设置ssh密钥) [none]

  • Which disks would you like to use? (你希望使用哪个磁盘) [sda]

  • How would you like to use it? (你希望将磁盘用作什么功能) [sys]

完成系统参数配置后,使用 reboot 命令重启系统,系统将保存到 alpine.img

📂 4.5 挂载共享目录

同 3.4。

🛠️ 4.6 安装 GNU glibc 兼容包

Alpine 默认使用 musl 工具链,但Linux下很多软件都依赖GNU工具链,直接运行这些软件的程序会出现类似于:

-ash: ./arm-cortex_a9-linux-gnueabi-gcc:not found

这个not found 不是指路径错误,而是指找不到动态库中的函数,可以通过ldd命令来查看是缺少那些GNU库函数

ldd arm-cortex_a9-linux-gnueabi-gcc

要想在 Alpine 系统中运行调用 GNU 库函数的程序,需要安装Alpine官方提供的 glibc 兼容包。执行以下命令下载并安装glibc-2.35-r1.apk兼容包

wget -q -O /etc/apk/keys/sgerrand.rsa.pub \
  https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub

wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r1/glibc-2.35-r1.apk

apk add glibc-2.35-r1.apk

如果显示类似以下内容说明已经安装成功:

OK: 421Mib in 102 packages

安装完成后可在 /usr/glibc-compat/lib 找到库文件。

通常安装完成后再次运行程序依然会报错 not found 这是因为程序没有正确链接到glibc的库文件,可以通过file命令来确认连接器链接的库路径,例如执行file arm-cortex_a9-linux-gnueabi-gcc后会显示以下信息

arm-cortex_a9-linux-gnueabi-gcc: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=4f359efb08a988f5cb7f4d738d7c6f26e0b82b3a, stripped

这里arm-cortex_a9-linux-gnueabi-gcc链接的库就是/lib64/ld-linux-x86-64.so.2,我们西药把这个路径该成/usr/glibc-compat/lib/ld-linux-x86_64.so.2

要改这个动态链接库的路径,需要借助patchelf软件。我们先在 Alpine 系统中安装 patchelf,然后利用 patchelf 修改目标文件的动态链接库路径,最后不要忘记了将 glibc 库文件的路径导入环境变量

apk add patchelf
patchelf -set-interpreter /usr/glibc-compat/lib/ld-linux-x86-64.so.2 ./arm-cortex_a9-linux-gnueabi-gcc
export LD_LIBRARY_PATH=/usr/glibc-compat/lib:/usr/glibc-compat/lib64:$LD_LIBRARY_PATH

此时再次执行此程序即可正常运行。


⚠️ 5. 注意事项

🖥️ 5.1 启动持久化系统启动命令

在系统持久化过一次以后再次启动就需要修改启动命令了,将 -cdrom alpine-standard-3.19.1-x86_64.iso 参数去掉并将 -boot d 参数该成 -boot c:

sudo qemu-system-x86_64 \
  -m 512 \
  -boot c \
  -hda alpine.img \
  -netdev user,id=net0 \
  -device e1000,netdev=net0 \
  -fsdev local,id=fsdev0,path=/opt/toolchains,security_model=none \
  -device virtio-9p-pci,fsdev=fsdev0,mount_tag=hosttools \
  -nographic

否则你将一直进入临时系统

🤡 别问我为什么知道

📦 5.2 软件源未配置

你在安装软件时可能会出现以下报错:

ERROR: unable to select packages: vim (no such package)

这是由于软件源中没有这个软件。可能是由于你没有正确配置官方软件源,也可能是你把软件的名字输错了。

如果是没有正确配置官方软件源,请按照 3.6 / 4.4 的步骤配置官方软件源。

🔗 5.3 找不到库文件

你在运行程序的时候可能会出现以下报错:

-ash: ./arm-cortex_a9-linux-gnueabi-gcc:not found

有两种可能一种可能是你路径输错了,另一种可能是找不到程序运行所依赖的动态库文件。如果是找不到库文件,请参考 4.6 步骤安装 glibc 兼容包并修改 interpreter。

💾 5.4 系统未持久化

你在安装程序的时候可能会出现以下报错:

ERROR: You tried to add a non-repository package to system , but it would be lost on next reboot Enable package caching

说明你用的是临时系统中,并且你安装的软件不适合再临时系统中使用,需持久化系统后再安装。

⚠️ 5.5 软件包下载问题

你安装官方 glibc.apk 时可能会出现以下报错:

ERROR: glibc.apk: IO ERROR

这说明你下载的apk包有问题,你需要检查你的网络和下载命令的参数,推荐用 wget 而非 curl下载。

🌐 5.6 网络配置问题

你在启动QEMU的时候可能会出现以下报错:

network backend 'user' is not compiled into this binary

这种情况大概率是你在编译QEMU的过程中,在执行.configure命令的时候往后面加了特殊的参数,小概率是你的系统缺少依赖库导致QEMU的user网络模式安装失败。如果是大概率事件,建议重新编译QEMU在执行.configure命令的时候去掉多余的参数。如果是小概率时间,建议先把那些依赖的库装上(比如 glib、libglib 或者一些网络相关的开发库),然后再重新编译QEMU。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐