ARM64虚拟化实战:鲲鹏920+银河麒麟KVM虚拟机创建全流程 📅 发布时间:2026/9/16 21:12:35 👁 浏览次数: 1. 写在前面为什么要在鲲鹏920上折腾虚拟机银河麒麟Kylin Server V10这两年信创圈子里见得越来越多尤其是跑在鲲鹏920平台上的ARM64版本已经成了不少单位服务器端的“标配”。但系统装好之后马上就会遇到一个现实问题开发测试环境不够用或者有些老应用必须跑在隔离环境里这时候就得在麒麟系统上再开虚拟机。我最初接到这个需求时第一反应也是“直接在x86上装个VMware不就行了”——但真上手才发现鲲鹏920是ARM架构跟x86的虚拟化路径完全是两码事。这篇文章就把我在银河麒麟Kylin Server V10ARM64上创建虚拟机的完整过程、踩过的坑、验证过的参数全部整理出来给同样在鲲鹏平台上折腾的朋友做一个参考。先说结论在鲲鹏920上创建虚拟机核心路径是“KVM/QEMU libvirt virt-manager”不是VMware也不是VirtualBox。这套组合在ARM64上表现非常稳定而且银河麒麟V10本身对KVM虚拟化做了比较好的适配内核模块和用户态工具基本都是预装或一条命令就能装齐。这篇文章适合这几类人刚拿到鲲鹏920服务器含泰山服务器、华为Taishan整机或自组ARM服务器准备在上面跑虚拟化环境的运维工程师在银河麒麟Kylin Server V10上做开发需要隔离测试环境的程序员正在做信创迁移评估想了解ARM平台虚拟化方案选型的技术负责人。全文按“方案选型 → 环境检查 → 安装配置 → 创建虚拟机 → 系统安装 → 常见问题”这个顺序展开每一步都给实际命令和参数照着操作基本不会跑偏。2. 方案选型为什么是KVM/QEMU而不是VMware2.1 ARM平台虚拟化的现实约束在聊具体操作之前得先把一个根本性问题说清楚为什么鲲鹏920上不能像x86那样直接装个VMware WorkstationVMware Workstation/Fusion本质上依赖x86架构的虚拟化扩展Intel VT-x / AMD-V以及它自己那套二进制翻译机制。而鲲鹏920是ARMv8.2架构指令集和x86完全不同。虽然VMware也有ARM版本的产品主要用于Apple Silicon Mac但既不面向服务器场景也不支持在银河麒麟这个操作系统上跑。所以在ARM64服务器上虚拟化的主流方案就是Linux开源社区那套组合KVMKernel-based Virtual MachineLinux内核级的虚拟化模块ARM64上利用硬件虚拟化扩展ARM Virtualization Extensions实现QEMU用户态的设备模拟器负责模拟CPU、内存、磁盘、网络等设备libvirt统一管理中间层屏蔽底层差异提供统一的命令行和APIvirt-manager图形化管理工具操作直观适合不熟悉命令行的朋友。这套组合在ARM64上早就是生产级别的方案了。华为自家的CANN、FusionSphere等产品底层也是基于类似的虚拟化技术只不过做了封装和增强。我们在银河麒麟上直接用开源方案完全可行而且控制力更强。2.2 KVM方案的优势与适用场景相比在x86上跑VMware Workstation那套“桌面级虚拟化”KVM方案在鲲鹏920上有几个明显的优势第一性能损耗低。KVM是内核态虚拟化虚拟机直接执行硬件虚拟化指令不需要二进制翻译性能损耗通常控制在5%以内。对于CPU密集型的计算任务比如编译、数据处理这个优势非常明显。第二资源管理灵活。通过libvirt可以精细控制CPU配额、内存大小、磁盘容量、网络带宽还能做CPU热插拔、内存热扩容这在开发测试环境里非常实用。第三与系统生态无缝集成。银河麒麟V10自带的内核已经编译了KVM相关模块vhost_net、virtio等驱动都是现成的装好用户态工具就能用不需要额外折腾内核。第四支持镜像格式丰富。qcow2、raw、vmdk等主流格式都能识别后续如果要迁移其他平台的虚拟机镜像难度也不大。当然这款方案也有学习曲线。第一道坎是命令行工具链比较长第二道坎是网络配置比VMware那套“点一下就好了”要复杂一些。但一个一个来后面我会把每一步都拆开讲。2.3 工具选型清单我在实操中使用的具体工具和相关版本如下组件版本/用途说明操作系统银河麒麟Kylin Server V10 SP2 (ARM64)内核版本4.19.xKVM模块已内置CPU鲲鹏920 (HiSilicon Kunpeng 920)支持ARM Virtualization Extensions虚拟化内核模块kvm, kvm_arm系统默认加载无需额外编译用户态组件qemu-kvm, libvirt-daemon, virtinst通过yum安装版本随系统仓库管理工具virt-manager图形化/ virsh命令行按需选择建议先学virsh磁盘格式qcow2支持快照、压缩推荐使用提示如果你的银河麒麟版本是SP1或者SP3命令和路径基本一致不会影响操作。3. 环境检查动手之前先确认硬件和系统都支持3.1 确认CPU支持虚拟化扩展创建虚拟机的前提是CPU必须支持硬件虚拟化扩展。ARM64架构下这个特性叫ARM Virtualization Extensions也就是ARMv8的EL2异常级别。在Linux上可以通过检查/proc/cpuinfo来确认cat /proc/cpuinfo | grep -i virtual如果看到类似Virtualization: ARM的信息说明CPU支持虚拟化扩展。如果没有输出可以再查一下CPU型号cat /proc/cpuinfo | grep -i model鲲鹏920的型号名通常是Huawei Kunpeng 920或者显示为Kunpeng-920。只要是这个系列虚拟化扩展基本都是标配。3.2 检查KVM内核模块是否加载确认CPU支持之后接着看内核模块lsmod | grep kvm正常输出应该包含kvm和kvm_arm两个模块。如果没看到可以手动加载modprobe kvm modprobe kvm_arm如果modprobe报错说明内核编译时没有把KVM编入这种情况建议先升级内核或者重新编译但银河麒麟V10的默认内核通常不会出现这个问题。加载成功后再检查一下KVM设备节点是否存在ls -l /dev/kvm正常应该看到crw-rw-rw- 1 root kvm 10, 232 7月 20 10:15 /dev/kvm/dev/kvm是QEMU/KVM工作的核心设备如果这个节点不存在后面所有虚拟机的启动都会失败。3.3 验证系统版本和yum源接下来确认系统版本cat /etc/os-release输出会显示NAMEKylin Linux Advanced Server VERSIONV10 SP2系统版本确认无误后检查yum源是否能正常使用。这一步很重要因为后面安装QEMU和libvirt都要依赖仓库yum repolist如果输出为空或者报错需要先配置好yum源。银河麒麟V10的光盘镜像里自带了一个dvd.repo通常是挂载在/media或者/mnt下的。如果没有有效的repo源后面的安装步骤会卡住建议先把源搞定再继续。注意如果服务器是离线环境需要提前下载好QEMU、libvirt等RPM包或者准备好了本地光盘作为临时源。这里有一个小技巧把Kylin V10的ISO文件挂在/mnt下然后创建一个指向该挂载点的repo文件就能离线安装大部分工具。4. 安装虚拟化组件一条命令装齐整套工具链4.1 安装QEMU、libvirt和virtinst环境检查没问题后直接用yum安装yum install -y qemu-kvm libvirt libvirt-daemon virtinst virt-manager这里说明一下每个包的用途qemu-kvm提供QEMU系统模拟器是虚拟机运行时的核心进程libvirt提供虚拟化管理API和守护进程libvirt-daemonlibvirt后台服务管理虚拟机的生命周期virtinst提供virt-install命令用于命令行创建虚拟机virt-manager图形化管理界面如果服务器没有图形环境可以忽略这个包。安装完成后检查QEMU是否支持ARM64客户机qemu-system-aarch64 --version如果输出类似QEMU emulator version 4.2.1说明安装成功。4.2 启动libvirtd服务并设置开机自启接着启动libvirtd守护进程systemctl start libvirtd systemctl enable libvirtd检查运行状态systemctl status libvirtd看到active (running)就是正常状态。如果启动失败多半是因为/dev/kvm没有权限或者SELinux拦截后面常见问题部分会专门说。4.3 检查默认虚拟网络libvirt启动后默认会创建一个NAT网络叫default。检查一下virsh net-list --all输出应该包含名称 状态 自动开始 ------------------------------------------ default active yes再确认一下网络定义virsh net-info default这个默认网络的作用是虚拟机通过NAT方式共享宿主机的网络连接宿主机IP作为网关虚拟机通过它访问外网宿主机也能访问虚拟机。如果你需要虚拟机跟宿主机在同一个子网桥接模式后面我会讲怎么配置。到这里虚拟化的基础环境就算搭好了。接下来进入正题创建虚拟机。5. 创建虚拟机从安装介质到系统启动全流程5.1 准备系统镜像文件创建虚拟机之前得先准备好客户机操作系统的安装镜像。这里分两种情况如果你的客户机要装银河麒麟V10的ARM64版本直接下载对应的ISO文件即可官网会根据不同ARM服务器厂商提供适配镜像。如果你要装其他ARM64系统比如Ubuntu ARM64 Server、Debian ARM64、统信UOS ARM64等去对应官网下载arm64架构的ISO就行。ISO文件建议统一放到/var/lib/libvirt/images/目录下这个目录是libvirt默认的镜像存储路径权限也是配好的mv Kylin-Server-V10-SP2-ARM64.iso /var/lib/libvirt/images/如果文件太大不想动也可以用软链接但确保目录有读写权限。5.2 确认磁盘空间和资源规划创建虚拟机前先规划好资源配置。我通常按下面的思路来分配资源项建议值说明CPU核数4鲲鹏920通常有64核起4核足够轻量应用内存8GB视宿主总内存而定留足宿主机余量磁盘50GBqcow2格式按需扩容交换分区4GB如果客户机是服务器系统建议预留用free -h和df -h分别确认内存和磁盘余量避免分配后导致宿主机资源不足。5.3 使用virt-install命令行创建虚拟机这一步是核心中的核心。我推荐先用命令行创建因为参数清晰、可复制而且不用依赖图形环境。基础的virt-install命令如下virt-install \ --name kylin-vm1 \ --memory 8192 \ --vcpus 4 \ --disk path/var/lib/libvirt/images/kylin-vm1.qcow2,size50,formatqcow2,busvirtio \ --cdrom /var/lib/libvirt/images/Kylin-Server-V10-SP2-ARM64.iso \ --os-variant kylin-v10 \ --network networkdefault,modelvirtio \ --graphics none \ --console pty,target_typeserial \ --noautoconsole逐个参数解释--name kylin-vm1虚拟机名称后续管理都用这个名字--memory 8192分配8GB内存单位是MiB--vcpus 4分配4个虚拟CPU--disk path... ,size50,formatqcow2,busvirtio创建50GB的qcow2磁盘镜像磁盘总线类型是virtio半虚拟化性能好--cdrom ...指定安装ISO--os-variant kylin-v10告诉libvirt客户机系统的类型让它优化默认配置。如果这个参数报错某些版本不认识kylin-v10可以先执行osinfo-query os | grep -i kylin查一下系统支持列表如果没有麒麟的条目就用--os-variant linux代替--network networkdefault,modelvirtio使用default网络vnic类型为virtio--graphics none不启用VNC图形显示--console pty,target_typeserial通过串口控制台访问安装界面--noautoconsole创建完成后不自动进入控制台。5.4 进入串口控制台完成系统安装执行完上面的命令后虚拟机就开始创建了但安装界面不会自动弹出。用下面的命令连接到串口控制台virsh console kylin-vm1连接后按一下回车屏幕上应该就会出现银河麒麟的安装引导界面。剩下的安装步骤就跟在物理机上装系统一样选择语言配置磁盘分区默认自动分区即可设置root密码创建普通用户选择安装软件包等待安装完成。安装完成后重启虚拟机再通过virsh console连接就能进入系统的命令行界面了。5.5 图形化方式创建虚拟机可选如果宿主机上有桌面环境比如银河麒麟V10的桌面版或者远程桌面连过来的图形会话也可以直接用virt-managervirt-manager在主界面点击“新建虚拟机”然后一步步选择ISO、配置资源操作上跟VMware的向导差不多对新手更友好。但我的建议是即使会用图形界面也至少把上面的virt-install命令搞懂——命令行方式更稳定批量建虚拟机时效率高得多而且出了问题也容易定位。6. 网络配置实战NAT与桥接模式对比和操作6.1 理解libvirt默认网络NAT模式前面用到--network networkdefault这个default网络就是NAT模式。它的工作原理是宿主机上创建一个虚拟网桥virbr0IP通常为192.168.122.1。虚拟机通过virbr0接入网络libvirt在宿主机上做IP转发和伪装MASQUERADE这样虚拟机就能通过宿主机访问外部网络而外部网络看到的是宿主机的IP。NAT模式的好处是配置简单、安全性好虚拟机默认无法被外部直接访问适合做隔离测试。坏处是外部机器想直接访问虚拟机里跑的服务比如Web、SSH需要额外做端口转发。6.2 配置端口转发访问虚拟机服务如果你需要在宿主机上访问虚拟机里的SSH服务比如虚拟机里放了个数据库宿主机上跑应用要连它可以在宿主机上用firewall-cmd做端口转发。假设虚拟机的IP是192.168.122.10要把宿主机的2222端口转发到虚拟机的22端口firewall-cmd --permanent --direct --add-rule ipv4 nat OUTPUT 0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.122.10:22 firewall-cmd --reload然后在宿主机上ssh -p 2222 root127.0.0.1就能通过宿主机的2222端口访问虚拟机里的SSH了。6.3 配置桥接模式虚拟机和宿主机同一网段如果你需要让虚拟机和局域网里的其他机器直接互通就要用桥接模式。原理是让虚拟机直接桥接到宿主机的物理网卡上虚拟机的流量就像局域网里的一台独立机器一样。第一步在宿主机上创建桥接网卡。编辑NetworkManager配置nmcli connection add type bridge ifname br0 con-name br0然后把你现有的物理网卡通常是enp125s0f0这样的名字绑定到桥上nmcli con add type bridge-slave ifname enp125s0f0 master br0 nmcli con up br0第二步告诉libvirt使用这个桥。创建一个新的网络定义文件比如bridge.xmlnetwork namehost-bridge/name forward modebridge/ bridge namebr0/ /network然后定义并启动这个网络virsh net-define bridge.xml virsh net-start host-bridge virsh net-autostart host-bridge第三步创建虚拟机时指定这个网络virsh destroy kylin-vm1 virsh edit kylin-vm1在interface段落里把mac address保留把source networkdefault/改成source bridgebr0/然后保存退出再启动虚拟机virsh start kylin-vm1之后进入虚拟机把IP改成跟宿主机同一个网段就能实现真正的桥接互通了。注意桥接配置对网卡数量有要求。如果物理机只有一张网卡且通过它远程登录网络切换时会有短暂断开的风险。建议先通过IPMI/带外管理或本地操作完成确认网络恢复后再远程使用。7. 常用管理与维护命令创建完虚拟机只是开始日常运维还会用到不少命令。这里列出最常用的一组方便查阅7.1 虚拟机生命周期管理# 列出所有虚拟机及状态 virsh list --all # 启动开机 virsh start kylin-vm1 # 正常关机发ACPI关机信号 virsh shutdown kylin-vm1 # 强制关机 virsh destroy kylin-vm1 # 重启 virsh reboot kylin-vm1 # 暂停/恢复 virsh suspend kylin-vm1 virsh resume kylin-vm1 # 设置开机自启动 virsh autostart kylin-vm17.2 配置修改和资源调整# 编辑虚拟机XML配置 virsh edit kylin-vm1 # 查看虚拟机配置 virsh dumpxml kylin-vm1 # 在线调整内存需要客户机支持热插拔 virsh setmem kylin-vm1 16G --live # 在线调整CPU需要客户机支持热插拔 virsh setvcpus kylin-vm1 8 --live7.3 磁盘和快照管理qcow2格式支持快照这是个非常实用的功能改配置或者做危险操作之前拍个快照出了问题一键回滚# 基于磁盘创建快照 virsh snapshot-create-as kylin-vm1 snap-before-upgrade # 查看快照列表 virsh snapshot-list kylin-vm1 # 回滚到指定快照 virsh snapshot-revert kylin-vm1 snap-before-upgrade # 删除快照 virsh snapshot-delete kylin-vm1 snap-before-upgrade需要提醒的是快照文件会占用磁盘空间而且如果磁盘分区在虚拟机内部有过较大调整比如LVM扩展回滚时可能找不到文件系统生产环境操作前务必确认。7.4 无损扩容磁盘觉得50GB不够用可以这么扩容# 先关闭虚拟机 virsh shutdown kylin-vm1 # 在原镜像基础上增加20GB qemu-img resize /var/lib/libvirt/images/kylin-vm1.qcow2 20G # 启动虚拟机 virsh start kylin-vm1扩容后进入虚拟机在系统内部用growpart和resize2fsEXT4或者lvextend/xfs_growfsXFS扩展分区和文件系统这样新的空间才能被识别。8. 常见问题与排查技巧实录8.1 /dev/kvm 权限错误现象创建虚拟机时提示Could not access /dev/kvm: Permission denied。原因当前用户比如普通用户没有访问/dev/kvm的权限。解决第一种是把用户加入kvm组usermod -aG kvm 用户名 newgrp kvm第二种是直接调整设备节点权限临时方案chmod 666 /dev/kvm或者给udev配置持久化规则在/etc/udev/rules.d/99-kvm.rules里加一行KERNELkvm, GROUPkvm, MODE06668.2 virt-install提示os-variant不识别现象执行virt-install时提示ERROR Unknown OS name: kylin-v10。原因libvirt的osinfo数据库里没有收录麒麟系统的条目。解决先查一下系统支持列表osinfo-query os | grep -i kylin如果有相似版本用对应的short-id如果没有直接改用通用的linux参数--os-variant linux其实这个参数只影响默认的时钟模型和磁盘总线类型对安装结果没有实质影响。8.3 virsh console无法显示安装界面现象执行virsh console kylin-vm1后屏幕一片空白按回车也无反应。原因虚拟机没有启用串口控制台或者GRUB/内核没有配置串口输出。解决修改虚拟机XML确保有serial和console配置virsh edit kylin-vm1在devices里加serial typepty target typesystem-serial port0/ /serial console typepty target typeserial port0/ /console对于前面用virt-install创建的虚拟机因为加了--console pty,target_typeserial已经自动配好了。如果是后期才加的配置需要重启虚拟机才能生效。另外串口控制台有一个特点它本身没有滚动缓冲如果你进入时安装进程已经在等待输入屏幕可能没有输出。解决方法是连接后连按几次回车或者先按一下Ctrl]退出串口再重新virsh console进去。8.4 虚拟CPU接口命名混乱现象用virsh vcpuinfo kylin-vm1看到的vCPU跟鲲鹏920的逻辑CPU有对应不上。原因ARM平台的拓扑映射跟x86不太一样libvirt默认的拓扑计算方式可能会让人困惑。解决不用担心这只是展示粒度问题。真正关心性能的话建议在宿主机上用virsh vcpupin把虚拟机的vCPU绑定到指定的物理CPU上virsh vcpupin kylin-vm1 0 4 virsh vcpupin kylin-vm1 1 5 virsh vcpupin kylin-vm1 2 6 virsh vcpupin kylin-vm1 3 7这样把vCPU逐一绑定到物理核心可以避免上下文切换带来的性能波动。8.5 虚拟机启动后没有网络现象virsh start kylin-vm1后虚拟机里ping www.baidu.com不通ip addr只有lo接口。原因可能是default网络没启动或者虚拟机内的网卡驱动没加载。解决分四步排查第一步在宿主机上确认网络状态virsh net-list --all第二步确认网桥有IPip addr show virbr0第三步检查IP转发是否开启sysctl net.ipv4.ip_forward如果输出是0临时开启echo 1 /proc/sys/net/ipv4/ip_forward永久开启则修改/etc/sysctl.conf确保有net.ipv4.ip_forward 1这一行。第四步进入虚拟机确认virtio驱动已加载lsmod | grep virtio如果虚拟机内没有virtio_net驱动就要改用e1000网卡模型。修改XML中的model typevirtio/为model typee1000/不过ARM平台的e1000兼容性需要考虑最理想还是装好virtio驱动。8.6 宿主机内存不足导致虚拟机启动失败现象启动虚拟机时提示Cannot allocate memory或者Failed to start domain。原因宿主机可用内存不足或者overcommit设置太保守。解决先检查内存余量free -h如果确实内存紧张可以用virsh edit kylin-vm1把分配的memory调小。另外KVM有一个参数可以调整overcommit策略在宿主机上sysctl vm.overcommit_memory1不过这个参数会改变整个宿主机的内存分配策略不建议生产环境随意调整。更稳妥的办法是确保宿主机内存充足。8.7 虚拟机性能明显偏低现象虚拟机里跑编译任务或者数据库性能只有物理机的一半不到。原因可能是CPU没有做绑定或者磁盘用了IDE控制器而不是virtio或者网络用了e1000而不是virtio。解决依次排查和优化CPU用virsh vcpupin做vCPU绑定磁盘确认用的是busvirtio如果建虚拟机时忘了指定可以新建时加--disk busvirtio内存确认开启了KSM内核同页合并或者至少确认没有swap颠簸网络确认modelvirtio。9. 进阶技巧让虚拟机用起来更顺手走到这一步你的鲲鹏920上已经能正常跑虚拟机了。最后分享几个让日常使用更顺手的技巧。9.1 宿主机与虚拟机之间共享文件在宿主机上搭建NFS服务或在虚拟机里用sshfs挂载宿主机目录。考虑到ARM64平台的兼容性最简单的方式是直接用SCP/rsync传文件。如果虚拟机里有图形界面也可以考虑用virtiofs企业级环境更推荐这里先不展开。9.2 使用cloud-init实现虚拟机自动初始化如果你经常创建虚拟机比如做开发环境模板建议配合cloud-init使用。先准备一个seeds.iso里面写上主机名、初始密码、SSH公钥等元数据创建时加上--disk path/var/lib/libvirt/images/seed.iso,devicecdrom这样虚拟机第一次启动时会自动完成初始化配置省去手动设置的步骤。9.3 定期备份虚拟机qcow2镜像最朴素的备份方式就是在虚拟机停机的状态下直接复制镜像文件virsh shutdown kylin-vm1 cp /var/lib/libvirt/images/kylin-vm1.qcow2 /backup/kylin-vm1-$(date %F).qcow2 virsh start kylin-vm1这种方式虽然简单但停机窗口比较长。需要不停机备份的话可以考虑使用virsh blockbackup或分布式存储的快照功能这个涉及面更广后面有时间我再单独写一篇。10. 个人实操体会折腾完这一整套流程我在鲲鹏920上创建虚拟机最大的感受是ARM平台虚拟化已经非常成熟了KVM QEMU这套方案完全扛得起生产需求。早期那种“ARM服务器只能跑跑容器、虚拟化性能拉跨”的印象在鲲鹏920这一代上已经不成立。比较关键的反而是几个容易被忽略的细节在创建之前把物理机的资源余量算清楚别一股脑给虚拟机分配太多内存导致宿主机卡顿在用virt-install时把--os-variant和磁盘bus这类参数一次写对后面能省不少事网络方案务必提前规划好是NAT还是桥接决定了后续应用访问路径的复杂度。最后再分享一个小技巧如果你在ARM64上跑的是银河麒麟V10 SP2建议把客户机也装成同一个大版本的系统这样virtio驱动的兼容性、内核特性对齐都会省心很多。ARM平台的驱动生态虽然已经改善但文档里查不到的坑往往就藏在版本差异上。希望这篇实践记录能帮你顺利在自己的鲲鹏920上跑起来第一台虚拟机。有问题欢迎在评论区交流尤其欢迎已经把KVM跑进生产环境的朋友来分享你的经验。