做运维这些年,我往服务器上装系统的频率比点外卖还高。物理机装系统、上架、部署一套流程下来,麻烦不说,遇到需要同时跑多个系统的时候就特别头疼。后来我把主力的物理服务器改造成KVM虚拟化平台,一台机器上同时跑Ubuntu和Rocky Linux虚拟机,再配合桥接网络,从外部看这几台机器和物理机几乎没有区别。这篇文章就完整记录我这次KVM部署的全过程:从硬件确认、宿主机配置,到依次创建Ubuntu和Rocky虚拟机,最后把踩过的坑全部交代清楚,希望能帮到同样在做虚拟机搭建的朋友。
1. 环境准备与KVM基础
1.1 KVM到底是什么
KVM全称Kernel-based Virtual Machine,是Linux内核自带的一个虚拟化模块。它利用CPU的硬件辅助虚拟化能力(Intel VT-x或者AMD-V),让Linux内核直接充当一个虚拟机监视器。简单理解:KVM是发动机,QEMU是变速箱和车身,libvirt是方向盘和仪表盘。发动机负责把CPU的算力切给虚拟机,QEMU负责模拟网卡、磁盘、显卡这些设备,libvirt则提供一套统一的命令行和API来管理这一切。
我见过不少朋友在选型时纠结用VMware还是KVM,我的建议是:如果是纯Linux环境、追求性能、不想掏授权费,KVM基本是首选。KVM的虚拟机性能损耗比传统软件虚拟化低很多,因为它直接走硬件虚拟化指令,不需要像模拟器那样一条一条翻译CPU指令。实际体感上,跑编译任务或者数据库这类吃CPU的活,KVM虚拟机和物理机大概只有几个百分点的差距,这个表现是QEMU纯软件模拟完全比不了的。
KVM的应用场景也很有讲究。大多数人拿它做两件事:一是服务器整合,把多台利用率不高的物理机合并到一台宿主机上,省电省空间;二是做开发测试环境,一台物理机上随便开几个不同发行版的虚拟机,随便折腾也不影响宿主机。现在很多私有云和桌面虚拟化方案的底座就是KVM,这个技术本身已经相当成熟。
1.2 硬件确认与宿主机规划
动手之前先确认硬件够不够格。CPU必须支持虚拟化,这是硬门槛。在Linux终端里敲下面这条命令:
bash复制egrep -c '(vmx|svm)' /proc/cpuinfo
返回的数字大于0就代表支持,vmx对应Intel的VT-x,svm对应AMD的AMD-V。如果返回0,不用继续看了,先去BIOS里找找有没有被关掉,或者考虑换机器。老实说我碰到过好几台服务器,CPU型号明确支持虚拟化,就是BIOS默认关着,开机按F2进BIOS,在Processor Configuration或者Security菜单里找到Virtualization Technology,设为Enabled,重启就好。
内存和磁盘的规划要提前做除法。假设宿主机有64GB内存,我一般预留8到16GB给宿主机自己跑系统和服务,剩下的全部按需分给虚拟机。比如计划跑两台4GB内存的Ubuntu测试机、两台8GB内存的Rocky业务机,加起来24GB左右,那这台机器就很从容。磁盘同理,qcow2格式的镜像文件虽然是动态增长的,但运行起来之后虚机里的实际数据量会慢慢占满你分配的空间,所以物理磁盘至少要留出所有虚机分配容量总和的1.2倍才安心。
我个人推荐宿主机用Ubuntu Server 22.04 LTS或者24.04 LTS。为什么不用Rocky做宿主机?也不是不行,但Ubuntu的apt包管理在安装KVM相关组件时依赖处理得更省心,libvirt相关包的版本也比较新。如果你本身主力就是Debian系,用Ubuntu做宿主机不会有什么学习成本。这篇文章的示例就以Ubuntu 22.04 LTS为例,Rocky Linux在后面作为虚拟机登场。
1.3 安装KVM组件包
Ubuntu上安装KVM全家桶很简单,一条命令搞定:
bash复制sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
逐个解释一下这些包是干什么的。qemu-kvm是核心的QEMU/KVM模拟器;libvirt-daemon-system和libvirt-clients提供libvirtd服务端和virsh等管理命令;bridge-utils提供网桥管理工具brctl,后面配置桥接网络要用;virtinst是创建虚拟机的主力工具,里面的virt-install命令我们马上就用;virt-manager是图形化管理工具,如果宿主机有桌面环境或者通过X11转发可以用,没有桌面环境也可以靠它生成虚拟机后远程用VNC连接。
装完启动libvirtd服务:
bash复制sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd
看到active (running)就对了。接着把当前用户加入libvirt用户组,这样平时操作不用老挂sudo:
bash复制sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
newgrp libvirt
最后确认KVM模块真的加载成功了:
bash复制virsh list --all
这条命令如果返回空列表或者显示"Id Name State"表头,说明一切正常。如果你在这里看到错误,先检查有没有装cpu-checker并运行kvm-ok,这个工具能直观告诉你KVM加速能不能用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 宿主机网络与存储配置
2.1 三种网络模式怎么选
KVM创建虚拟机时最常遇到的三个网络选择是:NAT模式、桥接模式、隔离模式。这块好多新手容易懵,我直接说结论:默认的virbr0 NAT模式适合临时测试,虚拟机可以访问外网但外部访问不进来;隔离模式适合做封闭实验网络,虚拟机之间能互通但上不了外网;生产环境和需要外部直接访问的场景,一律上桥接模式。
桥接模式的核心操作是把物理网卡和一个虚拟网桥绑定,虚拟机的虚拟网卡也挂到这个网桥上。这样虚拟机相当于和宿主机在同一个二层网络里,局域网内的其他设备能直接访问虚拟机IP,虚拟机也能正常上网。打个比方:NAT模式是几个人合租一间房,房东统一管网络进出;桥接模式是每人独立办一条宽带,各有各的公网入口。
三个模式的特点我给整理成一张表,方便后面选型:
| 模式 | 外网访问 | 外部访问虚拟机 | 配置复杂度 | 适用场景 |
|---|---|---|---|---|
| NAT(默认virbr0) | 可以 | 不可以 | 低 | 临时测试、仅 |
