如何在x86电脑上玩转ARM64?用qemu-system-aarch64安装CentOS 7保姆级教程

📅 发布时间:2026/7/8 12:58:33 👁️ 浏览次数:
如何在x86电脑上玩转ARM64?用qemu-system-aarch64安装CentOS 7保姆级教程
在x86架构上无缝构建ARM64开发环境一次完整的CentOS 7虚拟化实践最近几年ARM架构的处理器在服务器和边缘计算领域的影响力与日俱增。作为一名长期在x86平台上工作的开发者我时常会遇到需要为ARM环境编译软件、测试跨平台兼容性或是单纯想学习ARM体系结构的需求。购置一台ARM物理服务器成本高昂而云服务按小时计费对于长期、深度的学习和测试来说并不经济。于是寻找一种在现有x86工作站上低成本、高效率运行ARM操作系统的方法就成了一个非常实际的痛点。幸运的是通过成熟的虚拟化技术我们完全可以在自己的Intel或AMD电脑里模拟出一个功能完整的ARM64计算机。这不仅仅是“能跑起来”而是要构建一个稳定、可用、甚至能投入日常开发和测试的虚拟环境。今天我想分享的就是如何利用qemu-system-aarch64这款强大的工具在你的x86电脑上从零开始安装并配置一个CentOS 7 ARM64虚拟机。整个过程我会结合我踩过的坑和总结的技巧力求让你绕过所有弯路直达一个可用的工作环境。1. 环境准备与QEMU编译安装在开始虚拟化之旅前我们需要一个可靠的“引擎”——QEMU。它是一个通用的、开源的机器模拟器和虚拟器。虽然很多Linux发行版的仓库里都提供了预编译的Qemu包但为了获得对ARM64架构最完整和最新的支持特别是我们需要的qemu-system-aarch64组件从源码编译安装往往是更稳妥的选择。1.1 安装必要的编译依赖编译QEMU需要一组合适的开发工具和库。不同的Linux发行版包管理命令略有不同。以下以常见的RHEL/CentOS/Fedora系列和Debian/Ubuntu系列为例。对于基于RPM的系统如CentOS、Fedorasudo yum groupinstall -y Development Tools sudo yum install -y git glib2-devel libfdt-devel pixman-devel zlib-devel ninja-build对于基于APT的系统如Ubuntu、Debiansudo apt update sudo apt install -y git build-essential libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build这里有几个关键包需要特别注意pixman-devel / libpixman-1-dev这是像素操作库缺少它编译会直接失败。ninja-buildQEMU使用Meson构建系统而Ninja是其后端能显著加速编译过程。glib2-devel / libglib2.0-dev提供了许多底层实用功能。提示如果你的系统Python版本低于3.6可能会在配置阶段遇到错误。现代发行版通常已预装Python 3但若遇到问题可以考虑通过pyenv或发行版仓库升级Python。1.2 获取源码并编译QEMU我们选择一个稳定且功能完善的版本进行编译例如6.2.0。你可以从QEMU官方下载页面获取最新稳定版但为了教程一致性我们使用6.2.0。# 下载源码包 wget https://download.qemu.org/qemu-6.2.0.tar.xz # 解压 tar xvJf qemu-6.2.0.tar.xz cd qemu-6.2.0接下来是配置环节。我们并不需要编译QEMU支持的所有架构那样太耗时。通过--target-list参数我们可以精确指定只编译aarch64-softmmu即我们需要的ARM64系统模拟器。# 创建并进入一个构建目录保持源码树干净 mkdir build cd build # 运行配置脚本 ../configure --target-listaarch64-softmmu --enable-kvm--enable-kvm参数至关重要。它允许QEMU在支持硬件虚拟化Intel VT-x或AMD-V的x86主机上使用KVM基于内核的虚拟机来加速对ARM指令的翻译从而获得接近原生速度的运行体验。如果你的CPU和系统支持KVM这将是性能提升的关键。配置成功后就可以开始编译和安装了# 使用多核并行编译数字‘8’可根据你的CPU核心数调整 make -j8 # 安装到系统目录通常需要sudo权限 sudo make install编译过程可能需要十几分钟到半小时取决于你的机器性能。安装完成后可以通过以下命令验证qemu-system-aarch64是否可用qemu-system-aarch64 --version如果成功输出版本信息那么我们的虚拟化引擎就准备就绪了。2. 准备安装介质与虚拟硬件有了引擎我们还需要“车身”和“燃料”——也就是虚拟机的磁盘、安装镜像以及让ARM虚拟机能够启动的固件。2.1 获取ARM64架构的CentOS 7镜像CentOS官方为ARM64aarch64架构提供了完整的ISO镜像。由于CentOS 7已进入生命周期结束EOL阶段我们需要从归档仓库获取。这里我们选择一个经典的版本CentOS 7.6.1810 Minimal。# 创建一个目录来存放所有虚拟机相关文件 mkdir -p ~/qemu-vms/arm64-centos cd ~/qemu-vms/arm64-centos # 下载CentOS 7 ARM64 Minimal ISO镜像 wget -c https://archive.kernel.org/centos-vault/altarch/7.6.1810/isos/aarch64/CentOS-7-aarch64-Minimal-1804.iso选择Minimal版本是因为它体积小安装快并且作为基础学习或测试环境我们更倾向于一个干净、可自定义的系统。2.2 下载UEFI固件 (QEMU_EFI.fd)与传统的x86 BIOS不同现代ARM服务器通常采用UEFI启动方式。为了让我们的ARM虚拟机正常启动我们需要一个模拟的ARM UEFI固件文件。Linaro项目提供了专为QEMU优化的UEFI固件。# 下载UEFI固件 wget http://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd这个QEMU_EFI.fd文件相当于虚拟机的“主板BIOS”是启动过程中不可或缺的一环。2.3 创建虚拟磁盘虚拟磁盘是虚拟机用来安装操作系统和存储数据的地方。我们使用QEMU的QCOW2格式它支持稀疏存储即实际文件大小随使用量增长而非一次性分配100G空间和快照功能非常灵活。# 创建一个100GB的QCOW2格式虚拟磁盘 qemu-img create -f qcow2 centos7-arm64.qcow2 100G执行后你会看到centos7-arm64.qcow2文件被创建但初始大小可能只有几百KB。只有当虚拟机开始写入数据时它才会逐渐增大。3. 启动虚拟机并安装CentOS 7万事俱备现在可以启动我们的虚拟ARM机器并开始安装操作系统了。由于我们通过纯命令行-nographic模式运行没有图形界面因此安装过程将在终端内以文本模式进行。别担心这并不复杂。3.1 构造启动命令下面这条命令整合了所有必要的参数用于启动虚拟机并从ISO镜像引导。我将其分解到多行以便阅读实际执行时可以写在一行或保存为一个shell脚本。qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -bios QEMU_EFI.fd \ -device virtio-scsi-device \ -device scsi-cd,drivecdrom \ -drive ifnone,fileCentOS-7-aarch64-Minimal-1804.iso,idcdrom,mediacdrom \ -device virtio-blk-device,drivehd0 \ -drive ifnone,filecentos7-arm64.qcow2,idhd0,formatqcow2 \ -device virtio-net-device,netdevnet0 \ -netdev user,idnet0,hostfwdtcp::10022-:22 \ -nographic让我们逐一解读关键参数参数说明-machine virt指定机器类型为virt这是QEMU为虚拟化优化的通用ARM平台。-cpu cortex-a72模拟的CPU型号。Cortex-A72是常见的ARMv8-A核心兼容性好。-smp 4为虚拟机分配4个虚拟CPU核心。-m 4096分配4096 MB (4GB) 内存给虚拟机。-bios QEMU_EFI.fd指定之前下载的UEFI固件文件。-device virtio-...使用virtio半虚拟化设备能提供接近原生设备的I/O性能。-netdev user,...配置用户模式网络并设置端口转发。hostfwdtcp::10022-:22意味着将宿主机的10022端口转发到虚拟机的22号(SSH)端口。-nographic禁用图形输出将串口控制台重定向到当前终端。执行这条命令后虚拟机开始启动你会看到一系列UEFI和内核启动日志最终进入CentOS 7的文本安装界面。3.2 文本模式安装导航文本安装界面是菜单驱动的非常清晰。你需要用键盘进行选择方向键 (↑ ↓)在菜单项间移动。数字键 (1-9)直接跳转到对应编号的配置项。回车 (Enter)确认选择或进入子菜单。c 键继续到下一步Continue。b 键开始安装Begin installation。q 键退出当前界面。安装过程主要配置以下几项按常见顺序语言和时区通常选择英文和上海时区Asia/Shanghai。安装源由于我们是从ISO启动这里确认是“Local media”即可。软件选择Minimal镜像只有“Minimal Install”一个选项直接继续。磁盘分区这是关键一步。你会看到我们创建的100G虚拟磁盘。选择该磁盘分区方案建议使用“自动配置”Automatically configure partitioning。对于学习环境这足够了。如果需要手动分区可以选择“I will configure partitioning”然后创建/boot、swap和/分区。网络与主机名建议在这里配置主机名例如arm64-vm。对于网络用户模式网络-netdev user默认会通过DHCP获得一个内网IP。你可以在这里启用eth0网卡。更重要的是记住我们之前做的端口转发:10022这将是后续通过SSH连接虚拟机的关键。Root密码和用户创建务必设置一个强壮的root密码。强烈建议创建一个普通用户并赋予其sudo权限这符合生产环境的安全实践。所有配置项左侧出现[x]标记表示已完成配置。最后将光标移动到“Begin installation”或直接按b键安装程序就会开始将系统写入虚拟磁盘。这个过程可能需要几分钟到十几分钟。安装完成后虚拟机会自动重启。重启后你将看到新安装的CentOS 7 ARM64系统的登录提示符。用root用户和刚才设置的密码登录恭喜你你的ARM64虚拟机已经成功运行在x86主机上了4. 基础配置与SSH连接优化首次进入系统我们还需要进行一些基础配置让它变得更易用、更符合开发环境的需求。4.1 启用Root的SSH登录可选默认情况下CentOS出于安全考虑可能禁止root用户直接通过SSH登录。对于个人学习环境为了方便我们可以启用它。# 编辑SSH服务器配置 vi /etc/ssh/sshd_config找到#PermitRootLogin yes这一行去掉开头的注释#保存并退出。# 重启SSH服务使配置生效 systemctl restart sshd注意在生产环境中不建议直接允许root SSH登录。应使用普通用户登录后再通过sudo提权。4.2 更新系统与安装基础工具登录后第一件事是更新系统并安装一些常用工具如vim、net-tools、wget等。# 更新系统包 yum update -y # 安装常用工具 yum install -y vim net-tools wget curl bash-completion4.3 从宿主机通过SSH连接虚拟机这是我们配置中最妙的一步。还记得启动命令里的hostfwdtcp::10022-:22吗现在你不需要在QEMU的终端里操作了。直接在宿主机的另一个终端窗口使用SSH连接本机的10022端口它就会被转发到虚拟机的22端口。# 在宿主机上执行 ssh -p 10022 rootlocalhost输入虚拟机的root密码你就能通过一个更舒适的终端会话来管理你的ARM虚拟机了。这意味着你可以关闭那个运行着qemu-system-aarch64的终端当然关闭它虚拟机会关机或者让它一直在后台运行。4.4 配置系统服务与后台运行为了让虚拟机更像一个独立的服务器我们通常希望它能开机自启一些服务并且让QEMU进程在后台稳定运行。首先在虚拟机内可以设置时区同步、禁用不必要的服务等。然后对于QEMU进程本身我们可以使用nohup或screen/tmux这类终端复用器来让它脱离当前shell运行。一个更优雅的方式是创建一个启动脚本start-vm.sh#!/bin/bash cd ~/qemu-vms/arm64-centos nohup qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -smp 4 \ -m 4096 \ -bios QEMU_EFI.fd \ -device virtio-scsi-device \ -device virtio-blk-device,drivehd0 \ -drive ifnone,filecentos7-arm64.qcow2,idhd0,formatqcow2 \ -device virtio-net-device,netdevnet0 \ -netdev user,idnet0,hostfwdtcp::10022-:22 \ -daemonize /dev/null 21 echo “ARM64 CentOS VM started in background. SSH via ‘ssh -p 10022 rootlocalhost‘”给脚本执行权限并运行chmod x start-vm.sh ./start-vm.sh这样虚拟机就在后台以守护进程模式运行了你可以随时通过SSH连接和管理它。要关闭虚拟机可以通过SSH登录后执行poweroff命令或者在宿主机上找到QEMU进程ID并发送终止信号。5. 进阶应用与性能调优基础系统运行起来后我们可以探索一些更深入的应用场景和性能提升技巧。5.1 共享文件夹宿主机与虚拟机交换文件用户模式网络虽然简单但文件传输不便。我们可以通过SSH的scp/sftp命令或者使用QEMU的虚拟文件系统VirtFS来设置共享文件夹。方法一使用SCP/SFTP这是最直接的方法利用我们已有的SSH端口转发。# 从宿主机复制文件到虚拟机 scp -P 10022 my-local-file.txt rootlocalhost:/tmp/ # 从虚拟机复制文件到宿主机 scp -P 10022 rootlocalhost:/path/to/vm-file ./方法二使用NFS或Samba在虚拟机内安装NFS客户端或Samba客户端将宿主机上的目录通过网络共享挂载进来。这需要在宿主机上配置NFS或Samba服务更适合需要频繁、大量文件交互的场景。5.2 性能调优参数默认配置下虚拟机的性能可能不是最优。以下是一些可以尝试调整的QEMU参数启用KVM加速确保启动命令中有-enable-kvm编译时已支持且宿主机BIOS中已开启VT-x/AMD-V虚拟化支持。这是最大的性能提升点。使用主机CPU模型将-cpu cortex-a72改为-cpu host这允许虚拟机使用宿主CPU的所有特性在跨架构模拟时有限制但能优化翻译。调整CPU拓扑-smp参数可以匹配宿主机的核心数例如smp 8,sockets2,cores4,threads1模拟一个2插槽、每插槽4核的NUMA拓扑对某些应用有好处。使用VirtIO驱动我们已经在使用virtio设备了。确保虚拟机内安装了对应的驱动CentOS 7默认包含这能极大提升磁盘和网络I/O性能。内存大页如果宿主机内存充足可以使用大页Huge Pages来减少内存管理开销。这需要在宿主机上配置大页并在QEMU命令中添加-mem-path /dev/hugepages等参数。5.3 快照与克隆灵活的环境管理QEMU的QCOW2磁盘格式支持快照。你可以在系统配置到一个完美状态时比如刚安装完基础开发工具创建一个快照以后随时可以回滚。# 创建快照 (需要在虚拟机关机或暂停时进行更安全) qemu-img snapshot -c “base-with-tools” centos7-arm64.qcow2 # 列出快照 qemu-img snapshot -l centos7-arm64.qcow2 # 回滚到某个快照 qemu-img snapshot -a “base-with-tools” centos7-arm64.qcow2 # 删除快照 qemu-img snapshot -d “base-with-tools” centos7-arm64.qcow2你还可以直接复制qcow2磁盘文件来克隆整个虚拟机环境快速创建多个独立的测试实例。5.4 探索其他ARM发行版掌握了CentOS 7的安装方法后你可以举一反三尝试安装其他ARM64架构的Linux发行版丰富你的测试矩阵。Ubuntu Server for ARM从Ubuntu官网下载ARM64的ISO镜像安装过程与x86版本几乎无异且对ARM生态支持非常活跃。AlmaLinux / Rocky Linux作为CentOS的替代品它们也提供了优秀的ARM64支持安装流程与本文所述高度相似。openEuler华为推出的开源Linux发行版在ARM生态上有深入优化适合探索国产化或特定性能场景。安装其他系统时主要的变化在于下载对应的ISO镜像而QEMU的启动命令和UEFI固件通常是通用的。你可能会遇到不同的安装界面如Ubuntu的Subiquity但核心思路不变配置虚拟硬件从ISO引导完成安装。整个过程走下来你会发现原本看似复杂的跨架构虚拟化其实已经被QEMU这样的工具打磨得相当平滑。我最初为了测试一个ARM平台的软件包不得不去申请云服务器每次都要重新初始化环境非常麻烦。自从在本地搭建了这个QEMU ARM虚拟机后它就成了我一个随时可用的“编译沙盒”和“测试床”省下了大量时间和资源。尤其是配合SSH端口转发和后台运行它几乎就像一台安静的、24小时待命的远程开发机无缝地集成到了我的x86主力工作流中。