⚡ Linux QEMU 模拟器下 Alpine 环境搭建全流程
QEMU(Quick Emulator)是一个开源的虚拟化工具,支持多种硬件架构(x86、ARM、RISC-V 等),可以在不同平台上运行不同架构的操作系统。它既可以做全系统虚拟化(模拟整个硬件平台),也可以做用户态模拟(仅运行特定架构的程序)。Alpine Linux 是一个小巧、安全、资源占用极低的 Linux 发行版,基于musl libc和busybox。它特别适合嵌入式系统、容器环境和轻
📝 1. 简介
🔹 QEMU 简介
QEMU(Quick Emulator)是一个开源的虚拟化工具,支持多种硬件架构(x86、ARM、RISC-V 等),可以在不同平台上运行不同架构的操作系统。它既可以做全系统虚拟化(模拟整个硬件平台),也可以做用户态模拟(仅运行特定架构的程序)。
🔹 Alpine Linux 简介
Alpine Linux 是一个小巧、安全、资源占用极低的 Linux 发行版,基于 musl libc 和 busybox。它特别适合嵌入式系统、容器环境和轻量化虚拟机场景。缺点是默认极简,很多常用工具(如 vim)需要手动安装。
🔹 QEMU 启动方式
QEMU中的系统有两种启动方式:
-
临时系统模式
该模式直接用 ISO 或 rootfs 启动,无虚拟硬盘;重启后数据丢失,适合一次性测试、LiveCD、系统救援、教学演示等场景。 -
持久化系统模式
该模式使用虚拟硬盘文件(.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。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)