ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

鲲鹏920 ARM服务器上KVM虚拟化实战:银河麒麟V10创建虚拟机完整指南

鲲鹏920 ARM服务器上KVM虚拟化实战:银河麒麟V10创建虚拟机完整指南 最近在给客户搭一套基于鲲鹏920芯片的服务器环境系统装的是银河麒麟Kylin Server V10业务侧提出要在上面再开几台虚拟机。以前在x86机器上摆弄KVM、VMware都顺手到了ARM平台加上麒麟这套系统很多细节其实和原来的玩法不完全一样。网上关于KVM的教程一搜一大把但专门针对鲲鹏920这种aarch64架构、又能在Kylin Server V10上直接落地的完整流程确实不算多。折腾了几天把环境从检查CPU虚拟化能力到最终虚拟机正常运行整条链路跑通这里把过程整理成一篇实操记录。想在这类ARM服务器上创建虚拟机、或者正在被麒麟系统里的虚拟化问题卡住的朋友可以按这个思路一步步来。1. 先搞清楚鲲鹏920上的KVM和x86平台有什么区别1.1 鲲鹏920的硬件特性决定虚拟机镜像必须用aarch64版很多第一次接触鲲鹏服务器的朋友最容易掉进去的坑就是把x86的虚拟机镜像直接拿来用。鲲鹏920是一颗基于ARMv8.2架构的处理器它支持硬件虚拟化扩展但指令集和x86完全不同。这意味着你在Kylin Server V10上创建出来的虚拟机默认只能安装和运行aarch64架构的操作系统。这不只是“换一个ISO文件”这么简单。qemu-kvm通过硬件虚拟化加速CPU指令需要和宿主机架构一致所以虚拟机的系统镜像、内核、软件包都必须是aarch64版本。如果你拿一个x86_64的CentOS镜像挂上去虚拟机启动时根本进不了安装界面要么黑屏要么直接提示无法引导。从系统角度看银河麒麟Kylin Server V10本身有适配aarch64的版本系统安装好后uname -m输出的是aarch64。后续所有虚拟化组件比如qemu、libvirt也都是基于ARM64的二进制包。理解了这一层后面的操作逻辑就顺了不是“在麒麟上装虚拟机”而是“在ARM64宿主机上用KVM创建ARM64客户机”。1.2 虚拟化方案选型为什么我选KVM/QEMU而不是VMware在x86 Linux运维圈创建虚拟机常见的方案有KVM、VirtualBox、VMware也有不少轻量级场景直接用Docker。但在鲲鹏920这套硬件上我的建议非常明确生产环境老老实实用KVM/QEMU加libvirt管理。原因不复杂。VMware Workstation和VirtualBox的ARM版支持非常有限特别是面向服务器端的自动化管理、性能监控、热迁移这些场景基本指望不上。银河麒麟Server版官方软件源里直接带了qemu-kvm、libvirt、virt-install等组件安装方便和内核KVM模块配合也最稳。Docker虽然启动快、资源占用小但它不是虚拟机无法做到完全隔离的内核和系统引导很多安全加固、内核参数验证、异构系统测试的需求它替代不了。如果你手头的环境必须跑虚拟机KVM是鲲鹏平台上性价比和可靠性最高的选择。后面整个实操过程我也会围绕KVM/QEMU展开。选型时可以把几个方案的特性收进一张表方便对比方案CPU架构支持在Kylin Server V10上的可用性推荐指数KVM/QEMUaarch64、x86_64均支持软件源自带社区资料丰富强烈推荐生产使用VirtualBox以x86为主ARM支持不完整需要额外找包稳定性一般仅适合本机小规模试用VMware Workstation以x86为主无官方ARM服务器版不适合不建议在鲲鹏上尝试Docker容器跟随宿主架构支持aarch64镜像但隔离性不如VM根据场景选择不能完全替代虚拟机2. 动手前必须做好的准备工作2.1 检查CPU虚拟化能力和KVM模块不要一上来就急着安装虚拟机软件先确认这台Kylin Server V10宿主机是否具备虚拟化条件。鲲鹏920默认带硬件虚拟化扩展但固件设置、内核模块、权限配置都可能影响最终结果。打开终端执行以下几条命令uname -m cat /etc/os-release ls -l /dev/kvm lsmod | grep kvm正常情况下第一条输出aarch64说明当前系统是ARM64架构。/dev/kvm设备文件存在说明内核KVM模块已经加载。如果这个文件不存在先尝试手动加载modprobe kvm modprobe kvm_arm在部分老版本内核或特定固件环境下KVM模块无法加载需要确认服务器固件里是否开启了虚拟化支持。鲲鹏920的物理机通常在固件默认配置里就是开启状态但如果之前有人改过BIOS或做过虚拟化隔离这里就会失效。还有一种场景需要特别注意如果这台Kylin Server V10本身是在另一台虚拟机里面那就要看宿主机是否开启了嵌套虚拟化否则/dev/kvm可能不会透传出来。权限方面如果用普通用户运行virt-install需要确保当前用户能访问/dev/kvm。简单测试方式ls -l /dev/kvm如果设备文件属于root:kvm把当前用户加入kvm组即可usermod -aG kvm username改完组之后要重新登录会话才生效。很多朋友在这一步踩坑明明所有软件都装好了一创建虚拟机就报“Cannot access /dev/kvm”就是权限没理顺。2.2 安装虚拟化核心组件和依赖环境确认没问题后开始安装虚拟化组件。Kylin Server V10自带软件源里已经收录了相关软件包执行sudo yum install -y qemu-kvm libvirt virt-install bridge-utils如果之后想用图形界面管理虚拟机可以额外安装sudo yum install -y virt-manager安装完成后把libvirtd服务启动并加入开机自启sudo systemctl enable --now libvirtd sudo systemctl status libvirtd这一步做完用virsh version验证环境下是否正常。能看到libvirt和qemu版本号说明虚拟化底座已经就绪。这里我想特别强调一下bridge-utils这个包。很多人创建虚拟机的时候用默认的NAT网络忽略了这个包后来一旦需要配置桥接网络就会因为系统里没有brctl命令而顺手把锅甩给“ARM平台不支持”。其实不管什么架构桥接网络都需要这个工具。网络方面还要检查libvirt默认网络是否启动virsh net-list --all如果default网络没有激活执行virsh net-start default virsh net-autostart default默认网络是libvirt自动生成的NAT交换网络一般前缀是192.168.122.0/24。它是新手创建虚拟机后能拿到IP并连外网的重要前提。3. 命令行一键创建虚拟机virt-install全程实录3.1 准备系统镜像和虚拟磁盘虚拟化环境就绪后先把客户机的安装镜像准备好。以银河麒麟自家的Server系统做客户机为例你需要下载aarch64版本的Kylin Server V10 ISO镜像。下载时注意文件名里通常带有aarch64字样比如Kylin-Server-V10-SP2-aarch64.iso不要和x86版本搞混。镜像放好后为虚拟机创建一块虚拟磁盘。这里我用qcow2格式这种格式支持按需分配空间、快照等功能非常适合虚拟机场景qemu-img create -f qcow2 /data/kvm/kylin-vm01.qcow2 60G路径里的/data/kvm要提前建好并确认磁盘剩余空间足够。之前遇到有人把虚拟磁盘放在根分区下面结果宿主机的根分区被撑爆虚拟机的IO性能也大受影响。如果有独立的数据盘或存储池尽量把虚拟磁盘放外面。3.2 完整virt-install命令及参数逐项拆解万事俱备后执行创建命令。我的环境里一台比较典型的虚拟机配置是4C4G系统盘60G安装镜像用光驱挂载virt-install \ --name kylin-vm01 \ --memory 4096 \ --vcpus 4 \ --cpu host \ --disk path/data/kvm/kylin-vm01.qcow2,formatqcow2,busvirtio \ --cdrom /data/iso/Kylin-Server-V10-SP2-aarch64.iso \ --network networkdefault,modelvirtio \ --graphics vnc,listen0.0.0.0,port5901 \ --os-variant centos7.0 \ --boot hd,cdrom,menuon不要急着复制粘贴每个参数都值得认真理解--name kylin-vm01虚拟机名称后续virsh操作都靠它定位起名尽量有意义。--memory 4096内存大小单位是MB。这里给4GB具体看业务需求但不能超过宿主机物理内存总量。--vcpus 4虚拟CPU核数。鲲鹏920核心数很多但给虚拟机分配vCPU时还是要结合业务负载和宿主机的整体资源情况。--cpu host关键是让虚拟机继承宿主机CPU的完整特性不做一个保守的降级。对于ARM平台这个参数能让虚拟机直接利用鲲鹏920的硬件特性。--disk path...,formatqcow2,busvirtio指定磁盘路径、格式和总线类型。busvirtio一定要保证半虚拟化驱动的IO性能远好于模拟设备。--cdrom ...挂载安装镜像相当于把光盘放进虚拟光驱。--network networkdefault,modelvirtio使用libvirt默认NAT网络vNIC也走virtio。--graphics vnc,listen0.0.0.0,port5901开启VNC远程显示服务监听所有地址端口从5901开始。--os-variant centos7.0告诉libvirt客户机系统的类型和版本方便它挑选合适的虚拟设备。银河麒麟V10和CentOS同源用这个值通常没有问题。拿不准时可以先查一下系统支持的variant列表osinfo-query os | grep -i centos如果找不到完全匹配可以退而求其次用--os-variant linux2020。执行这段命令后终端会停在“开始安装”的状态并提示VNC连接方式。这时候打开VNC客户端连接到服务器的5901端口就能看到麒麟系统的图形安装界面。按正常系统安装流程分区、设置root密码、选择软件包完成后重启进入系统。3.3 安装完系统后的初始化设置安装完成后把虚拟光驱里的ISO摘掉避免每次启动都尝试从光盘引导。先看下当前虚机有哪些块设备virsh domblklist kylin-vm01找到光驱对应的target名然后卸掉virsh detach-disk kylin-vm01 sda --config这里sda要根据实际输出调整也可能是hdb。做完后用virsh shutdown kylin-vm01再virsh start kylin-vm01重启一次确认不会再次从ISO启动。进入虚拟机系统后有几个基础配置建议第一时间做。第一是确认网络能正常拿到IP检查ip addr看是否有192.168.122段的地址。第二是把SSH服务打开方便以后不依赖VNC直接远程登录。第三是跑一遍yum update把系统补丁打好同时确认CPU信息在客户机内显示是否正常lscpu如果看到ARM架构和预期的核数说明CPU透传没有问题。4. 创建虚机的常见报错与解决速查表4.1 启动失败提示无法打开/dev/kvm这是鲲鹏平台上创建虚拟机最常遇到的报错。错误信息大致是internal error: process exited while connecting to monitor: qemu-kvm: ... Could not open /dev/kvm: No such file or directory遇到这个报错按顺序排查三个地方。第一步看内核模块。执行lsmod | grep kvm如果没有输出就手动加载。第二步看权限确认当前用户是否有访问/dev/kvm的权限。前面已经说过把用户加入kvm组并重新登录即可。第三步是看宿主机本身是否支持虚拟化。用以下命令确认dmesg | grep -i kvm systemctl status libvirtd如果dmesg里完全没有KVM相关日志大概率是固件层把虚拟化关掉了或者当前环境不支持嵌套虚拟化。对于鲲鹏物理机进固件界面搜虚拟化相关选项确认是Enabled。如果这台麒麟本身就是虚拟机那需要回到上一层宿主机把虚拟机的CPU模式改成host-passthrough或开启嵌套虚拟化。4.2 ISO镜像架构不匹配导致安装界面黑屏用户在这个环节最容易怀疑是自己命令写错了。其实90%的原因是镜像下错了。鲲鹏920上创建虚拟机只能用aarch64的安装镜像。如果手里的ISO是x86版virt-install可能也能把虚拟机定义出来但一旦启动虚拟机的UEFI固件根本找不到可引导的aarch64内核永远黑屏。判断镜像架构最直接的方式是挂载ISO后检查EFI目录mount -o loop /data/iso/xxx.iso /mnt ls /mnt/EFI/BOOT/如果看到BOOTAA64.EFI说明是ARM64平台可用的镜像如果看到BOOTX64.EFI那就是x86的换一个吧。还有一种相关情况是拿到了aarch64架构的qcow2云镜像这类镜像是已经装好系统的磁盘文件不需要走安装流程。创建虚拟机时用--import方式而不是--cdromvirt-install \ --name kylin-vm02 \ --memory 4096 \ --vcpus 4 \ --cpu host \ --disk path/data/kvm/kylin-vm02.qcow2,formatqcow2,busvirtio \ --network networkdefault,modelvirtio \ --os-variant centos7.0 \ --import这种方式启动速度快非常适合批量交付测试环境。4.3 虚拟机网络不通或DHCP拿不到地址网络问题的概率在真实环境中仅次于架构问题。先确认libvirt默认网络状态virsh net-list --all如果default网络没有激活执行net-start并设置开机自启。如果网络是活的但虚拟机内仍然拿不到IP看一下vNIC的model是不是virtio。部分安装器在创建虚拟机时默认生成的是e1000或rtl8139在ARM平台上的兼容性和性能都不如virtio。如果客户机需要固定IP、想直接接入现有业务网络就要走桥接模式。先规划好宿主机网卡比如物理网卡叫eth0创建桥接设备br0nmcli con add ifname br0 type bridge con-name br0 nmcli con add type ethernet slave-type bridge con-name bridge-slave-eth0 ifname eth0 master br0 nmcli con up br0然后把virt-install命令里的--network networkdefault,modelvirtio改成--network bridgebr0,modelvirtio桥接网络配置时有一个很常见的坑如果网络管理工具是NetworkManager直接用brctl addif手动把物理网卡塞进br0重启后可能失效因为配置没有持久化。生产环境尽量用nmcli或系统 network-scripts 的方式配置。下面这张速查表可以贴在笔记里备查故障现象可能原因处理办法提示无法打开/dev/kvm内核模块未加载、无权限、嵌套虚拟化未开加载模块、加组、检查固件安装界面黑屏ISO架构不是aarch64确认镜像EFI目录中的BOOTAA64.EFI虚拟机内无IPdefault网络未启动、virtio网卡缺失virsh net-start、更换modelvirtio宿主机网络配置丢失手动brctl未持久化用nmcli或network-scripts配置br05. 日常运维补充图形管理、命令行利器与性能调优5.1 用virt-manager和VNC远程管理虚拟机很多运维习惯用图形界面管理虚拟机的“存在感”。麒麟Server默认不带桌面环境但可以在一台本机安装virt-manager远程连接带libvirtd宿主机。先在本机安装sudo yum install -y virt-manager然后通过SSH连接远程宿主机连接地址格式类似qemussh://root192.168.10.20/system记住要使用system连接而不是session否则看到的是当前用户下的“假”虚拟机列表。如果通过VNC管理单台虚拟机在宿主机执行virsh vncdisplay kylin-vm01命令会返回类似:1的信息对应的VNC端口就是590015901。VNC客户端连接宿主机IP和该端口即可。5.2 创建后的启动、克隆、快照基础操作命令行管理才是服务器运维的主战场。日常用得最频繁的几个命令virsh list --all virsh start kylin-vm01 virsh shutdown kylin-vm01 virsh autostart kylin-vm01 virsh destroy kylin-vm01autostart特别重要如果不设置宿主机重启后虚拟机不会自动拉起业务就断了。克隆一台虚拟机也很快virt-clone --original kylin-vm01 --name kylin-vm02 --file /data/kvm/kylin-vm02.qcow2克隆前要确保原虚拟机处于关机状态。快照操作则提供了快速回滚能力virsh snapshot-create-as kylin-vm01 snap-before-update virsh snapshot-list kylin-vm01 virsh snapshot-revert kylin-vm01 snap-before-update我在实际操作中一般把“克隆”用于批量交付“快照”用于每次升级前的安全网。5.3 性能调优的几个经验参数同样是4C4G的虚拟机参数选不对性能差距可能超过30%。在鲲鹏920平台上我建议重点关注以下几点。第一磁盘和网卡总线必须用virtio。模拟的IDE、e1000在ARM平台上的开销明显换成virtio后吞吐量会有肉眼可见的提升。第二CPU模式用host-passthrough或host让虚拟机直接暴露鲲鹏920的硬件特性避免不必要的CPU特性遮蔽。如果你对CPU拓扑有讲究还可以在vcpus参数里显式指定拓扑--vcpus 4,cores4,threads1,sockets1第三如果业务对内存带宽敏感可以在宿主机BIOS和虚拟机两个层面都开启大页HugePages。这一步不是零成本配置需要预先分配大页池并在虚拟机内存配置中引用适合对性能有严格要求的业务场景。最后再分享一个我踩过的细节点银河麒麟ARM版在大部分环境中默认使用UEFI启动方式创建虚拟机时不要手动把固件改成BIOS否则安装完第一次重启经常会出现内核拿不到根分区的奇怪故障。这个问题在log里不会直接写“UEFI错误”往往被误判成磁盘驱动问题。保持系统默认引导方式很多玄学问题其实都能绕开。
返回列表