做运维这些年,我见过太多公司花大价钱买服务器,结果一台机器就跑一个服务,CPU利用率常年不到10%。老板问起来还振振有词:"隔离性好,互不影响。"可资源白白浪费,这谁顶得住。
今天这期咱们就把服务器虚拟化这件事掰开揉碎了讲。从原理到实操,从装环境到配网络,一条龙给你安排明白。看完你就能把一台物理机玩出花来,跑五六个服务跟玩似的。
一、虚拟化到底是个啥?
简单说,虚拟化就是"骗"。你在物理服务器上跑一个软件,这个软件骗操作系统说:"兄弟,你就当自己独占了一台完整电脑。"于是操作系统高高兴兴以为自己独享了CPU、内存、硬盘、网卡,实际上呢,它只是在和其他"被欺骗"的系统共享同一套硬件。
这个"骗子"软件叫 Hypervisor(虚拟机监控器),它是整个虚拟化架构的核心。打个比方,Hypervisor就像一栋楼的物业,它把一栋大楼(物理服务器)分割成若干套公寓(虚拟机),每套公寓都有自己的门锁、水电表,住户互不干扰,但大家共用同一栋楼的地基和管道。
虚拟化的核心优势
• 资源利用率飙升:一台物理机跑多个系统,CPU和内存利用率从10%拉到60-80%,老板看了都得竖大拇指
• 隔离性好:虚拟机A崩了不影响虚拟机B,出问题排查起来也快,不用一台台重启
• 快照与迁移:随时保存虚拟机状态快照,一键回滚;还能热迁移到另一台物理机,停机时间趋近于零
• 环境一致性:开发和生产用同一个镜像,"在我机器上好好的"这句甩锅名言终于可以退休了
• 灵活扩展:需要新环境?克隆一个虚拟机几分钟搞定,不用等采购部门审批硬件
二、硬件虚拟化 vs 软件虚拟化
这是很多人最容易搞混的地方。虚拟化分两种路线,性能差距可不是一点半点。
硬件虚拟化(HVM)
Intel的 VT-x 和AMD的 AMD-V 就是干这个的。CPU自带虚拟化指令集,让虚拟机直接跑在硬件上,Hypervisor只负责调度和资源分配。性能损耗通常只有2%-5%,基本和裸机没区别。
现在的服务器CPU基本都支持硬件虚拟化。怎么检查?跑一条命令就行:
grep -E 'vmx|svm' /proc/cpuinfo
输出里有 vmx 说明是Intel处理器,svm 则是AMD。如果啥都没有,那要么CPU太老不支持,要么BIOS里没开虚拟化开关——后者是新手最容易踩的坑,买回来新服务器第一件事就是进BIOS把VT-x/AMD-V打开。
上图中可以看到CPU标志位里有vmx,说明硬件虚拟化已就绪。再用 virt-host-validate 工具跑一遍检测,全PASS就放心用。
软件虚拟化(纯软件模拟)
QEMU就是这派的代表。它不依赖CPU的虚拟化指令,纯靠软件模拟整个硬件环境。好处是兼容性无敌——什么古董CPU都能跑。缺点是慢,因为每条指令都要经过软件翻译层,性能损耗可能高达30%-50%。
实际工作中,大家很少用纯软件虚拟化。主流方案是 硬件虚拟化 + 软件模拟的组合拳:KVM负责硬件虚拟化调度,QEMU负责设备模拟(网卡、磁盘、显卡等)。这就是我们今天要讲的 KVM/QEMU 方案。
三、主流虚拟化软件快速扫盲
在深入KVM之前,先简单过一遍市面上常见的虚拟化方案,知道它们各自的定位和适用场景。
KVM(Kernel-based Virtual Machine)
Linux内核自带的虚拟化模块,2007年被红帽收购后整合进内核主线。它把Linux内核本身变成一个Hypervisor,性能接近裸机,是Linux平台上最主流的虚拟化方案。配合libvirt管理工具,几乎成了行业标准。
VirtualBox
Oracle出品,桌面端用得最多。图形界面友好,适合开发测试环境。但生产环境不太推荐,性能和稳定性比KVM差一截。
VMware ESXi
企业级老大,Type-1裸金属Hypervisor,直接跑在硬件上。功能强大但收费不便宜,适合有预算的大企业。社区版有CPU和内存限制。
Proxmox VE
基于KVM的开源虚拟化管理平台,自带Web管理界面,支持LXC容器和KVM虚拟机混合部署。中小企业的性价比之选。
Docker容器
严格来说容器不算传统虚拟化——它共享宿主机的Linux内核,只隔离进程空间。优点是轻量、启动快、资源占用少,适合微服务架构。缺点是不能跑不同内核的操作系统(比如Linux宿主机上跑Windows)。
四、KVM环境搭建实操
接下来进入正题。咱们一步步把KVM环境搭起来。
1. 安装必要组件
不同发行版命令不一样,但核心包就那几个:qemu-kvm(KVM核心)、libvirt(管理守护进程)、virt-install(创建虚拟机工具)、bridge-utils(桥接网络工具)。
安装完成后,systemctl status libvirtd 确认服务状态是 active (running)。如果没起来,手动 systemctl start libvirtd 。
2. 创建第一台虚拟机
这里推荐用 virt-install 命令行工具,比XML配置简单太多。一个命令搞定磁盘、网络、内存、CPU、安装介质:
几个关键参数解释一下:
• --name:虚拟机名字,后面所有virsh命令都用它来指代
• --vcpus:虚拟CPU数量,别超过物理CPU线程数
• --memory:内存大小,单位MB
• --disk:磁盘路径和大小,qcow2格式支持快照和动态扩容
• --network bridge=br0:使用桥接网络,虚拟机获得独立IP(后面详细讲)
• --os-variant:优化参数,指定操作系统类型能获得更好的性能和兼容性
• --graphics vnc:开启VNC远程桌面,方便安装系统时操作
3. 日常虚拟机管理(virsh命令)
虚拟机跑起来之后,日常管理全靠 virsh 。这玩意儿就是KVM的瑞士军刀,记住常用命令就够用了。
常用命令速查:
• virsh list:查看运行中的虚拟机
• virsh list --all:查看所有(包括关机的)
• virsh start <name>:启动虚拟机
• virsh shutdown <name>:优雅关机(需要guest agent)
• virsh destroy <name>:强制断电(相当于拔电源)
• virsh reboot <name>:重启虚拟机
• virsh suspend <name>:暂停虚拟机(保留内存状态)
• virsh resume <name>:恢复暂停的虚拟机
• virsh autostart <name>:设置开机自启
• virsh console <name>:连接到虚拟机串口控制台
• virsh dumpxml <name>:导出虚拟机XML配置
• virsh undefine <name>:删除虚拟机配置(不删磁盘)
4. 快照管理
快照是虚拟机最有用的功能之一,做重大变更前打一个快照,出了问题秒级回滚:
# 创建快照
virsh snapshot-create-as web-server pre-upgrade-snap
# 列出所有快照
virsh snapshot-list web-server
# 回滚到指定快照
virsh snapshot-revert web-server pre-upgrade-snap
# 删除快照
virsh snapshot-delete web-server pre-upgrade-snap
注意:快照需要磁盘格式为 qcow2 ,raw格式不支持快照。所以创建虚拟机时千万别用raw格式做生产磁盘。
5. 克隆虚拟机
需要批量部署相同环境的机器?克隆比从头装快多了:
# 克隆虚拟机(自动改MAC和主机名)
virt-clone --original web-server --name web-server-2 --auto-clone
# 指定新磁盘路径
virt-clone --original web-server --name web-server-2 \
--file /var/lib/libvirt/images/web-server-2.qcow2
--auto-clone 会自动处理MAC地址和主机名冲突,避免克隆出来的虚拟机网络起冲突。这个参数很实用,建议养成习惯加上。
五、虚拟化网络配置详解
网络这块是新手最容易翻车的地方。网卡配不对,虚拟机就是信息孤岛。咱们把三种主流模式一次性讲清楚。
模式一:NAT(默认模式)
KVM装好后默认会创建一个叫 default 的NAT网络。虚拟机通过这个网络可以访问外网,但外网访问不到虚拟机。相当于虚拟机躲在宿主机后面,靠宿主机的IP做网络地址转换。
适用场景:开发测试环境、不需要外部访问的后台服务。不需要额外配置,装完KVM就能用。
# 查看默认NAT网络
virsh net-info default
# NAT网络的DHCP租约(查看虚拟机IP)
virsh net-dhcp-leases default
模式二:桥接(生产推荐)
桥接模式让虚拟机获得独立的IP地址,和宿主机在同一网络平级。局域网内的其他设备可以直接访问虚拟机,就像虚拟机是一台真实的物理机一样。
这是生产环境最推荐的模式,配置步骤如下:
第1步:安装桥接工具
yum install -y bridge-utils # CentOS/RHEL
apt install -y bridge-utils # Ubuntu/Debian
第2步:创建桥接网卡(以eth0为例)
# 创建桥接网卡br0
brctl addbr br0
brctl addif br0 eth0
# 把eth0的IP移到br0上
ip addr del 192.168.1.100/24 dev eth0
ip addr add 192.168.1.100/24 dev br0
ip link set br0 up
第3步:持久化配置(重启不丢失)
CentOS/RHEL在 /etc/sysconfig/network-scripts/ 下创建 ifcfg-br0 文件:
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
ONBOOT=yes
然后在 ifcfg-eth0 里加一行 BRIDGE=br0 ,去掉原有的IP配置。
第4步:创建虚拟机时指定桥接网络
virt-install ... --network bridge=br0 ...
从图中可以看到,br0 桥接了物理网卡 eth0 ,虚拟机通过 vnet0、vnet1 等虚拟网卡接入桥接网络。每个虚拟机都能拿到独立的局域网IP。
模式三:仅主机(Host-Only)
仅主机模式创建一个完全隔离的内部网络,只有宿主机和虚拟机之间能通信,外网进不来,虚拟机也出不去。适合做安全测试或者搭建内部实验环境。
# 创建仅主机网络
virsh net-define /dev/stdin <<EOF
<network>
<name>hostonly</name>
<ip address="10.0.0.1" netmask="255.255.255.0">
<dhcp>
<range start="10.0.0.100" end="10.0.0.200"/>
</dhcp>
</ip>
</network>
EOF
# 启动并设置自启
virsh net-start hostonly
virsh net-autostart hostonly
六、生产环境避坑指南
这套东西我在生产环境跑了不下百次,以下是踩过坑后总结的血泪经验:
• 磁盘格式选qcow2,别用raw
raw格式虽然性能稍好一点,但不支持快照、不能动态扩容。qcow2的综合优势远大于那一点点性能损失,而且KVM对qcow2的优化已经做得很好了。
• 内存分配留余量
宿主机自己也要留够内存,别全部分配给虚拟机。建议宿主保留至少2GB,否则OOM Killer随时教做人。可以用 virsh dommemstat <name> 监控实际使用量。
• 桥接网卡配置别改错文件
配置桥接时,物理网卡的IP配置要移到桥接网卡上,物理网卡本身不再配IP。这个搞反了网络直接断掉,远程操作的话你就连不上服务器了。
• 关闭虚拟机前别直接undefine
virsh undefine 只是删除配置,不删磁盘文件。正确的删除流程是:先shutdown,再undefine,最后手动删除磁盘文件。或者用 virsh undefine --remove-all-storage 一步到位(libvirt 4.10+支持)。
• 定期清理无用快照
快照不是备份!快照越多磁盘性能越差。用完就删,别囤着。
七、总结
今天这期从虚拟化原理讲起,覆盖了硬件虚拟化的检测、KVM环境的安装、虚拟机的创建和管理、快照克隆,以及三种网络模式的配置。掌握这些,你就能把一台物理服务器变成一个小集群了。
下期咱们来聊聊虚拟机的性能监控和调优——怎么找出吃资源的那台虚拟机、怎么给不同虚拟机分配权重、怎么在不关机的情况下给虚拟机加内存加CPU。都是生产环境天天用得上的干货,别错过。
本期要点回顾:
• 硬件虚拟化(VT-x/AMD-V)是基础,BIOS里记得开
• KVM+libvirt是Linux虚拟化的黄金组合
• virt-install 一条命令创建虚拟机,参数要记牢
• 生产环境用桥接网络,开发测试用NAT
• 磁盘用qcow2格式,快照用完就清
• virsh是管理核心命令,shutdown后再undefine