QEMU搭建ARM64 Linux开发环境:从零到交叉编译实战
发布时间:2026/10/28 18:26:17 锦皓数字建站

搞ARM64 Linux开发学习最绕不开的一道坎就是硬件。早年我为了验证一个交叉编译出来的AArch64程序专门买了块开发板结果光折腾固件烧写、串口接线、启动方式一晚上就过去了正经代码一行没写。后来换了思路直接在PC上用QEMU虚拟出一台ARM64机器宿主机照常用x86虚拟机里跑标准ARM64 Linux发行版这套组合让我把精力全部放回代码本身。内核编译、驱动调试、系统裁剪这些活都能在纯软件环境里完成成本为零试错随便来。这篇文章我会从零开始把用QEMU搭建ARM64 Linux开发学习环境的完整路径讲清楚包括QEMU本身的安装、不同发行版镜像的选择、虚拟机启动命令里每个参数的含义、交叉编译工具链的用法以及把自编译内核跑进虚拟机的全过程。最后附上我在实操中踩过的坑和排查清单比如很多人都会撞上的Bad Linux ARM64 Image magic!报错。适合的人很明确没有ARM开发板但想系统学ARM64 Linux的同学、需要在x86机器上验证ARM64产物是否可用的开发者、做嵌入式Linux入门的初学者。如果你手头已经有开发板这套虚拟环境当备用调试平台也完全值得搭一份毕竟有些实验在虚拟机里先跑通再拿到真机上做心里会更有底。1. 为什么选择QEMU加ARM64这套组合1.1 真机与模拟器两条路线怎么选学习ARM64 Linux开发通常只有两条路买一块真实的ARM64开发板或者在PC上跑一个ARM64虚拟机。真机的好处是贴近真实硬件GPIO、SPI、I2C这些外设都是真真切切的跑驱动实验的时候感觉特别踏实代价是开发板价格不低、外设资料分散、弄坏一个环境往往要靠重新烧写救回来。虚拟机的好处是环境随建随拆、快照随意回滚、多套配置可以并行最直观的一点是你不需要为每一次失败支付实质性的重置成本。我个人的建议是两条腿走路。如果你完全不差钱也愿意折腾硬件那真机为主、虚拟机为辅如果你是想把主要精力放在Linux内核、系统移植和应用程序开发上那QEMU虚拟机完全够用而且很多场景下比真机更顺手。这篇文章讲的是后面这条路线但它蕴含的方法论——用可重复、可回滚的方式做系统级开发——放到真机上也一样成立。1.2 QEMU方案到底强在哪QEMU能做的远比跑一个虚拟机多。它有全系统模拟和用户态模拟两套模式。全系统模拟就是模拟一整台ARM64机器可以在里面装完整的Linux发行版、跑内核、跑initramfs用户态模拟则是用qemu-aarch64在宿主机上直接运行单个ARM64可执行文件适合快速验证一个二进制能不能跑通。开发学习阶段这两套模式配合使用效率非常高。全系统模拟层面QEMU针对ARM64提供了多种机器模型开发学习最常用的是virt。virt是一台不绑定具体开发板参数的虚拟设备包含了PCIe、virtio磁盘、通用定时器和串口等标准设备好处是简单、可控、跟主流发行版兼容性好内核开发者经常拿它当基准平台。相比之下想模拟树莓派、各种SoC开发板也行但QEMU对这些板卡的覆盖程度参差不齐没有virt这么省心。当然QEMU也有软肋。在x86宿主机上ARM64虚拟机要靠动态二进制翻译来执行ARM64指令性能远不如真机如果是密集计算任务体感差距非常明显。另外虚拟化环境下你无法实验某些跟具体硬件强相关的特性比如真实外设的时序、特定中断控制器的行为。但作为学习Linux本身这些都不构成阻碍。1.3 这套组合适合谁我总结下来下面三类人最适合从这套环境入手。第一刚接触ARM64平台想在动手写代码前先把交叉编译、根文件系统、内核启动这些概念打通的初学者第二手头有x86服务器或笔记本但需要频繁验证ARM64产物二进制、静态库、容器镜像能否正常工作的开发者第三做嵌入式Linux入门课程或开源项目的人需要一个干净、可复制、不依赖特定硬件的演示环境。反过来说如果你要开发依赖具体外设的驱动比如某个屏幕的显示驱动、某个触摸芯片的驱动那还是早点上真机。虚拟机和真机的差距在通用计算场景下可以忽略在硬件细节场景下会被无限放大。认清自己的目标再选路线比盲目跟风买开发板重要得多。2. 环境准备宿主机、QEMU与ARM64镜像2.1 宿主机需要什么配置QEMU怎么装先说宿主机。QEMU对宿主机的绝对要求很低但体验跟配置关系很大。最低配置的话双核CPU、4GB内存就能跑一个极简ARM64系统想编译内核、开多个虚拟机做实验建议8GB内存起步、四核以上CPU。磁盘占用方面一个qcow2虚拟磁盘文件初始很小但会随着写入增长20GB的虚配磁盘实际占用量通常只有几个GB加上内核源码和工具链预留50GB空间比较从容。安装QEMU的方式分平台说一下。在Debian/Ubuntu系上直接安装qemu-system-arm这个包就可以sudo apt install qemu-system-arm这个包名虽然带arm但里面的qemu-system-aarch64就是ARM64模拟器本体。Fedora系用sudo dnf install qemu-system-aarch64Arch系则是sudo pacman -S qemu-system-aarch64。Windows用户可以去QEMU官网下载Windows版安装包装完把安装目录下的qemu-system-aarch64.exe路径加进PATH。macOS用户用Homebrew的话brew install qemu就会带ARM64系统模拟器。这里有个容易踩的细节安装完先用qemu-system-aarch64 --version确认能跑。有些发行版把qemu拆成很多子包如果你用的是Docker或精简系统镜像可能只装了qemu-user没有系统模拟器那后面所有命令都会报command not found。我当年就在一个精简容器里吃了这个亏排查了半天。另外如果你手头只有安卓手机Termux里也能装qemu-system-aarch64跑个小系统做演示没问题但性能更有限适合应急看看效果不适合当主力环境。2.2 实验发行版怎么选ARM64生态里能跑的发行版很多选择直接影响后续实验的顺畅程度。我按开发学习友好度排了个对比表方便你挑发行版体积适用场景我的评价Alpine Linux极小几十MB快速验证、容器基础、系统裁剪启动最快但用的musl libc跟常见的glibc系统有差异Debian中等netinst约600MB通用开发、内核与驱动实验文档全、包源稳最适合当主力实验环境Ubuntu中等偏大桌面与通用开发生态好但跑桌面在QEMU里会偏慢Arch Linux ARM中等喜欢滚动更新的用户系统结构干净需要一定动手能力openEuler中等服务器与云场景开发面向服务器生态做相关技术验证时会用到如果你是一次装好长期用我推荐Debian。原因有三第一ARM64支持成熟内核、工具链、交叉编译资料一搜一大把第二apt源里的软件齐全出了问题能搜到的排查答案基本都有人写过第三QEMU virt机器跟Debian官方ARM64内核的兼容性非常好安装过程很少出幺蛾子。如果你只想快速看看ARM64 Linux长什么样或者拿来做CI里的一次性任务Alpine是最优解从开机到登录用不了一分钟。2.3 镜像格式与qcow2的增量特性说到虚拟磁盘就得提一下镜像格式。QEMU原生支持两种最常用的磁盘格式raw和qcow2。raw就是把磁盘内容原样存在一个文件里简单直接性能最好但如果你给20GB文件立即占20GB而且不支持快照。qcow2是QEMU自己的写时复制格式文件初始只占很小一点空间随着写入逐渐变大还支持快照、压缩、加密日常实验我基本只用qcow2。初次接触的人往往觉得qcow2文件那么小是不是只分到这一点空间其实不是。我执行qemu-img create -f qcow2 arm64-dev.qcow2 20Gqemu-img会报告虚拟磁盘大小是20G但宿主机上的文件只有一百多KB等到虚拟机里开始写入数据文件才会逐渐增长。这个特性在做系统安装实验时特别好用装坏了直接删掉这个文件重来磁盘层面的成本几乎为零。3. 从零启动第一台ARM64虚拟机3.1 创建虚拟磁盘接下来的操作我以Debian 12bookwormARM64的完整安装为例。第一步创建虚拟磁盘qemu-img create -f qcow2 arm64-dev.qcow2 20G然后下载Debian ARM64的网络安装镜像文件名一般是debian-12.x.x-arm64-netinst.iso。下载完把镜像跟虚拟磁盘放在同一个目录后面命令好写。如果你本地已经有现成的镜像也可以跳过下载直接看下一节的启动命令。这一步没什么技术含量但我建议你在创建磁盘时就规划好命名习惯。一台虚拟机会对应一组文件磁盘、快照、启动脚本、内核镜像混在一起迟早会很乱。我通常按项目建目录比如~/vms/arm64-dev/里面再放start.sh、hda.qcow2、kernel这样的结构。把启动命令写进脚本后重复做实验就非常方便改一行参数跑一次比每次手敲一整条命令舒服太多。3.2 启动命令逐项拆解完整安装系统的启动命令大概长这样qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -drive filearm64-dev.qcow2,formatqcow2,ifvirtio \ -cdrom debian-12.5.0-arm64-netinst.iso \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device virtio-net-device,netdevnet0 \ -nographic这里每个参数都值得说清楚。-machine virt是机器类型告诉QEMU模拟一块virt开发板而不是具体的某款SoC。-cpu cortex-a72指定CPU型号cortex-a72是ARMv8-A架构的典型代表想覆盖更多指令集特性的话可以用-cpu max让QEMU把所有能模拟的特性都暴露出来。-smp 4和-m 4096分别指定四核CPU和4GB内存这两个值不是越大越好需要跟宿主机资源匹配给多了反而会因为宿主机内存不足导致卡顿。磁盘和网络这两行是重点。-drive filearm64-dev.qcow2,formatqcow2,ifvirtio用virtio接口挂载磁盘virtio是QEMU体系下性能最好的虚拟设备标准。网络同样用virtio-netdev user,idnet0,hostfwdtcp::2222-:22和-device virtio-net-device,netdevnet0组合的意思是创建一个用户态网络后端编号叫net0并把宿主机的2222端口映射到虚拟机的22端口。这样虚拟机里开SSH服务你就能用ssh -p 2222 userlocalhost连进去。最后的-nographic特别适合纯命令行工作流。它的效果是不弹图形窗口把虚拟机串口接到当前终端上键盘输入和系统日志都走终端。因为ARM64 Linux在virt机器上默认把控制台放在串口ttyAMA0所以装系统、看内核日志全都靠它。如果你习惯图形界面把这行参数换成-display gtk或者干脆省略会弹出一个窗口安装程序在窗口里显示。注意-nographic模式下退出虚拟机用CtrlA再按X不是CtrlC。初用者几乎都会在这里卡一下记住这个组合键能省不少事。3.3 串口模式才是开发者的朋友很多新手第一次跑QEMU看到有图形窗口就觉得万事大吉但真正做开发学习串口模式比图形模式舒服得多。原因很实际开发板通常没有显示器串口就是唯一的口子你在QEMU里用串口习惯了将来拿到真机用串口接开发板查日志的姿势完全一样这就把演练和实战打通了。用-nographic启动系统后你会在当前终端里看到固件日志、内核日志和登录提示符就像平时操作一台只开了串口的服务器。内核panic、启动卡住、驱动报错这类问题全部能从串口日志里看到第一手信息。这也是为什么很多老手调QEMU虚拟机时第一反应就是把图形界面关掉只留串口。3.4 端口映射与网络拓扑用户态网络是QEMU最简单的网络方案特点是零配置虚拟机像一个躲在NAT后面的设备能访问外网宿主机也能通过端口映射访问虚拟机。刚才启动命令里的hostfwdtcp::2222-:22就是这个意思宿主机2222端口收到的TCP连接全部转发到虚拟机22端口。这种方案的优点是省心缺点是虚拟机对宿主机的其他局域网设备不可见多台虚拟机之间也不能互相通信。如果你确实需要更复杂的拓扑比如两台虚拟机组内网、或者虚拟机要能被局域网其他机器直接访问就得用桥接网络或tap设备。但对于这篇文章讲的学习场景用户态网络加端口映射已经覆盖了90%的需求从宿主机拷贝文件用scp、SSH登录、apt更新源全部能走通。4. 系统安装与开发环境初始化4.1 Debian的完整安装过程跑起启动命令后你会进入Debian安装程序。流程跟x86版大同小异选语言、配键盘、分区、选软件包。需要注意的点有三个。第一分区时建议直接让安装程序使用整块虚拟磁盘或者手动建一个ext4根分区加一个swap分区由于这是虚拟机你不需要操心UEFI引导、GRUB位置这些琐碎问题virt机器下安装程序会自动把引导处理好。第二软件包选择界面里如果你只做开发学习勾选标准系统工具和SSH server就够了桌面环境千万别装——既占空间在模拟器里跑起来又卡又慢。第三网络源建议选一个距离近的镜像虽然下载量不算大但装软件时会舒服很多。安装完成后系统自动重启这时可以关掉虚拟机把启动命令里的-cdrom参数去掉只保留磁盘就是一个干净的ARM64 Debian系统了。首次开机后先做两件事用root或者其他创建的用户登录执行apt update apt upgrade把系统更新到最新然后装基础的开发包build-essential、git、openssh-server。如果安装程序里已经选了SSH server后者可以跳过。装完这些你就有了一台可以随便折腾的ARM64 Debian。建议趁系统干净先给磁盘打个快照后面不管怎么折腾都有后悔药。快照的具体用法我在第6章会讲到这里先记着有这回事。4.2 Alpine Linux的极速启动如果只是想快速体验一把ARM64 LinuxAlpine是最快路径。下载alpine-virt这个精简安装ISO启动命令跟Debian几乎一样只是把-cdrom指向对应的Alpine镜像qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 2 \ -m 1024 \ -drive filealpine.qcow2,formatqcow2,ifvirtio \ -cdrom alpine-virt-3.19.0-aarch64.iso \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device virtio-net-device,netdevnet0 \ -nographic进入Alpine的安装环境后执行setup-alpine按提示回答问题包括键盘布局、网卡、管理员密码和时区整个过程几分钟搞定。特别提醒一点Alpine的管理员用户是root默认不创建普通用户生产环境不建议这样但作为实验虚拟机问题不大。装完reboot重启一台迷你ARM64 Linux就在手上了占用内存一百多MB跑什么都飞快。4.3 SSH登录与文件共享系统装好后SSH是第一个要打通的环节。在Debian或Alpine里确认sshd已启动然后回到宿主机执行ssh -p 2222 userlocalhost如果连接失败第一反应不应该是怀疑网络而是检查虚拟机里sshd是否真的在跑以及宿主机的2222端口是否被本地其他服务占用。hostfwdtcp::2222-:22里的2222端口可以随便改只要不跟宿主机已有的服务冲突就行。另外默认情况下root登录SSH在很多系统里会被拒绝Debian的默认配置尤其严格要么用普通用户登录后再su要么改sshd_config里的PermitRootLogin后者不推荐。除了SSHQEMU还提供了一个很实用的文件共享方案virtio-9p。在启动命令里加一行-virtfs local,path$HOME/qemu-share,mount_taghostshare,security_modelnone虚拟机里把这个共享目录挂载进来mkdir -p /mnt/share mount -t 9p -o transvirtio,version9p2000.L hostshare /mnt/share之后宿主机和虚拟机就共享同一个目录交叉编译出来的二进制往里面一放虚拟机立刻就能拿到省去scp来回传的麻烦。这个技巧在做内核实验的时候尤其好用编译好的Image直接放到共享目录虚拟机里更新一下就行。5. 交叉编译把编译压力留在宿主机5.1 为什么要在宿主机上交叉编译在QEMU虚拟机里是可以直接写代码编译的但对于较大的工程比如Linux内核全靠虚拟机内编译会非常慢。原因很简单x86宿主机上跑ARM64虚拟机QEMU要用动态翻译把ARM64指令翻译成x86指令执行这种翻译开销会让CPU密集任务的效率大幅下降。与其让翻译引擎做苦力不如直接在宿主机上用交叉编译工具链生成ARM64可执行文件编译速度直接吃满宿主机性能。交叉编译就是在x86机器上编译出aarch64架构的代码产物不能在当前机器上运行但能放到ARM64机器上运行。这个思路贯穿整个ARM Linux开发流程内核、驱动、应用、库全都是先在宿主机编译再把产物拷贝到目标机器测试。宿主机上编译、目标机器上跑这是ARM开发最高效的循环没有之一。5.2 安装工具链并编译第一个程序Debian/Ubuntu宿主机上安装ARM64交叉编译工具链非常直接sudo apt install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu装完检查一下版本aarch64-linux-gnu-gcc --version然后写一个经典C程序验证整套流程。假设文件叫hello.c内容很简单#include stdio.h int main(void) { printf(Hello from ARM64\n); return 0; }编译时关键是要记得加-static参数。原因得说明白虚拟机里的目标系统缺少ARM64架构的动态链接库不加static编译出来的二进制就算复制过去也会因为找不到动态库而无法运行。加上static后编译器把所有库函数都打包进可执行文件任何ARM64 Linux都能直接跑aarch64-linux-gnu-gcc -static -o hello hello.c file hellofile命令的输出会显示ELF 64-bit LSB executable, ARM aarch64看到这个就说明编译产物的架构是对的。如果你用非静态方式编译把产物拷到虚拟机里执行会报No such file or directory这个报错很误导人——文件明明在但系统提示找不到其实是动态链接器路径不对。用静态编译就能彻底绕开这个问题初学阶段强烈建议全程静态编译。5.3 编译ARM64内核并用QEMU直接启动交叉编译的经典场景就是编译内核。先下载内核源码wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz tar xf linux-6.6.tar.xz cd linux-6.6配置和编译都带上架构和交叉编译前缀make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- defconfig make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j$(nproc) Image第一行生成一份ARM64默认配置第二行编译出Image。注意ARM64内核的成品文件名是Image不是x86上的bzImage。Image是一个带64字节头的原始ARM64内核镜像QEMU的-kernel选项可以直接加载它这正是下一节要讲的关键。编译完成后启动QEMU时不再需要安装器的cdrom而是直接加载内核。如果你已经有一个装好的Debian系统盘可以用下面的命令启动qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -kernel Image \ -append root/dev/vda1 consolettyAMA0 rw \ -drive filearm64-dev.qcow2,formatqcow2,ifvirtio \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device virtio-net-device,netdevnet0 \ -nographic-append这行传的是内核启动参数root/dev/vda1告诉内核根文件系统在哪块盘上consolettyAMA0把内核日志输出到串口。注意分区号不一定是vda1如果你在安装系统时分了多个分区要先在原来的系统里用lsblk确认根分区到底是vda几。启动后如果看到内核版本号跟你编译的一致说明整个交叉编译流程彻底打通了。5.4 用busybox做一个极简根文件系统内核搞定了还可以更进一步做一个完全自制的极简根文件系统。下载busybox的aarch64静态版放进一个rootfs目录配上必要的设备节点和init脚本就能组成一个可引导的根文件系统。先创建根目录骨架在rootfs下分别建bin、sbin、etc、proc、sys、dev这几个目录把静态busybox复制到bin目录并建立软链接让sh、ls、mount这些命令都指向busybox然后写一个init脚本作为/sbin/init内容很简单挂载proc和sys再执行一个shell。最后用cpio把这个目录打包成initramfsQEMU启动时用-initrd参数加载它。整个过程二十分钟能跑通虽然功能简陋但能把内核加载、根文件系统挂载、init启动这整条链路的原理彻底搞明白。这个实验做完你再去看Linux启动流程的资料会觉得自己跟那些抽象文字之间突然有了实感强烈推荐有精力的人做一遍。6. 常见问题与排查实录先放一张速查表把最高频的几个问题列出来后面再逐个展开讲原因和操作现象最常见原因一句话解法Bad Linux ARM64 Image magic!传给-kernel的不是ARM64 Image格式用make Image生成的内核别用vmlinux或zImageSSH连不上端口映射没生效或防火墙拦截检查hostfwd参数再查虚拟机防火墙虚拟机卡到没法用核数和内存给少了或磁盘没用virtio调大-smp/-m用ifvirtio挂盘磁盘满了虚配容量不够需要扩容qemu-img resize后growpartresize2fs编译的二进制在虚拟机里跑不了缺少动态库或架构不对交叉编译时加-static用file确认架构6.1 Bad Linux ARM64 Image magic到底在说什么这个报错我见过很多次尤其是在不熟悉ARM64内核格式的人手里。它的完整形式类似Bad Linux ARM64 Image magic!深挖一下其实是个很具体的技术点ARM64内核镜像Image在文件起始偏移0x38处有一个固定的魔数值是0x644d5241也就是ASCII的ARM加x64。QEMU加载-kernel指定的文件时会先去读这个魔数读不到就认定这不是一个合法的ARM64内核镜像。触发这个报错的原因通常有三个。第一你把vmlinuxELF格式传给了-kernelQEMU要求的是脱壳后的Image不是ELF解决方法是make Image后使用生成的Image文件。第二你把32位ARM的zImage或者x86的bzImage传给了aarch64的qemu-system-aarch64架构不匹配魔数自然不对。第三下载的内核文件损坏或者被截断尤其是从网速不稳的渠道拉下来的用file命令先看看文件类型再对比一下文件大小能过滤掉大部分问题。顺带一提如果你在U-Boot环境里也会看到类似的报错那是U-Boot的booti命令加载的不是ARM64 Image。排查思路完全一样确认文件确实是ARM64 Image而不是zImage、vmlinux或别的格式。6.2 网络不通怎么排查QEMU虚拟机网络不通是高频问题。按顺序排查基本都能定位。第一步确认启动命令里-netdev user,idnet0和-device virtio-net-device,netdevnet0两个参数都在缺一个网卡就起不来。第二步进虚拟机执行ip a看网卡有没有拿到IP地址。用户态网络默认会给虚拟机分配10.0.2.15之类的地址如果你看到的网卡状态是DOWN或者没有地址多半是系统里没启用DHCP客户端Debian安装器一般会自动配好手工装的系统需要自己配一下。第三步测试外网连通性ping 8.8.8.8看有没有回应。用户态网络的默认规则是允许虚拟机访问外网宿主机这边不用做任何NAT配置。如果ping得通但SSH连不上问题就落到端口映射上。检查启动命令里的hostfwd参数确认宿主机端口没被占用ss -lntp | grep 2222。还需要注意端口映射只对TCP生效你要从外面连某个UDP服务hostfwd帮不上忙。最后别忘了检查虚拟机的防火墙很多发行版默认开firewalld或ufwSSH从外部访问可能被拦需要ufw allow ssh或者临时关掉防火墙验证。6.3 虚拟机跑得慢怎么办模拟ARM64系统性能体感跟真机差一个量级是正常的但不同场景下慢的原因不一样。如果虚拟机里跑的是简单命令、SSH、文本编辑卡顿多半是CPU核数太少把-smp加到4甚至8配合-m给足内存日常操作会明显跟手。如果是在虚拟机里编译大型软件那无论怎么调参都慢正解是用宿主机交叉编译再拷贝产物回来这条路前面已经讲过了。另一个容易忽略的点是磁盘。如果用了默认的IDE或老式接口磁盘性能会很差安装系统时可能没感觉但频繁读写时差距巨大。解决办法是全程用ifvirtio挂磁盘virtio磁盘的性能在QEMU里是最好的这也是我前面所有命令都带ifvirtio的原因。最后如果你的宿主机本身是ARM64架构比如Apple Silicon Mac或者其他ARM服务器记得在-machine virt后面加accelkvm让虚拟机跑在硬件虚拟化上性能会从模拟直接升级到接近原生。如果宿主是x86就没有这个选项老老实实接受动态翻译的速度。6.4 虚拟磁盘满了怎么办虚拟机里磁盘满是个临门一脚的问题装了几个大软件或者编译几次内核就会出现。qcow2的好处在于扩容很简单先用qemu-img把虚拟磁盘文件加大再进虚拟机把分区和文件系统扩大。磁盘层面qemu-img resize arm64-dev.qcow2 30G然后启动虚拟机用growpart /dev/vda 1把第一个分区扩展到整个磁盘再用resize2fs /dev/vda1扩大文件系统。不同的发行版命令略有差异Alpine用的是apk add growpart再同样操作。整个过程无损不需要重装系统。除了扩容qcow2还支持快照这个功能在开发学习中非常实用。做一次可能破坏系统的实验前先创建快照qemu-img snapshot -c before_kernel_hack arm64-dev.qcow2实验完想回滚直接qemu-img snapshot -a before_kernel_hack arm64-dev.qcow2整个环境就会恢复到你做实验之前的状态。快照的代价是额外占一点磁盘空间但对开发学习来说这个代价换来的安全感非常值。我每次改内核参数或者换启动方式前都会随手打个快照反正成本低踩坑了也不慌。最后说点个人的粗浅体会。用QEMU做ARM64 Linux开发学习这条路我实践了两年多最大的感受是试错成本低带来的心态变化内核配置改错了、根文件系统炸了、启动参数写反了都只是一条命令的事这种心态会让你更愿意大胆实验而敢实验恰恰是学好底层技术的前提。如果你手头还没有ARM64硬件别让这个成为拖延的理由先把这篇文章里的命令跑一遍你很快会发现真正卡住你的从来不是硬件而是没开始动手的犹豫。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。