在物理服务器资源越来越充裕、而业务却要求快速交付与高隔离性的今天,虚拟化已经成为每一位 Linux 运维工程师绕不开的核心技能。上一讲我们完成了 Docker 容器与 Compose 编排的实战,容器解决的是”应用级”的轻量隔离;而 KVM 虚拟机解决的是”操作系统级”的完整隔离,它能把一台物理 Ubuntu 服务器拆分成多台逻辑上完全独立的机器,各自运行独立的内核与系统,互不干扰。

本文作为 Ubuntu 运维系列的虚拟化篇章,将从 KVM 的基本原理讲起,手把手带你完成一台 Ubuntu 虚拟机的部署,掌握快照与克隆的用法,并理解如何对 CPU、内存、磁盘、网络等资源进行精细化管理。无论你是准备搭建测试环境,还是要把一台高性能服务器切分给多个业务使用,读完本文都能直接上手。
一、KVM 与 libvirt 的核心概念
KVM(Kernel-based Virtual Machine)是集成在 Linux 内核中的虚拟化模块,它依赖 CPU 的硬件虚拟化扩展(Intel VT-x 或 AMD-V)来实现近乎原生性能的虚拟机。KVM 本身只是内核模块,负责 CPU 和内存的虚拟化;而磁盘、网络等设备的模拟则由 QEMU 来完成,因此我们常把二者合称为 KVM/QEMU 方案。
libvirt 是一套管理虚拟化平台的统一 API 与守护进程,它屏蔽了底层差异,提供了 virsh 命令行工具和 virt-manager 图形界面,让我们能够用统一的命令管理 KVM、Xen 等不同的虚拟化后端。理解这三者的分工,是后续所有操作的基础:
- KVM:内核模块,负责 CPU/内存虚拟化,提供硬件加速。
- QEMU:用户态设备模拟器,负责磁盘、网卡、显卡等设备的仿真。
- libvirt:管理层,统一管理虚拟机生命周期、存储池、网络等资源。
在动手之前,先确认你的 CPU 是否支持硬件虚拟化:
# 查看 CPU 是否支持虚拟化扩展(Intel 为 vmx,AMD 为 svm)
egrep -c '(vmx|svm)' /proc/cpuinfo
# 输出大于 0 说明支持,否则无法使用 KVM 加速
二、环境准备与 KVM 安装
首先确认系统架构为 64 位,并安装 KVM 相关的软件包。Ubuntu 22.04/24.04 使用 libvirtd 作为后台守护进程,安装过程非常顺畅:
# 更新软件源并安装 KVM 全套组件
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients
bridge-utils virtinst virt-manager
# 启动并设置 libvirtd 开机自启
sudo systemctl enable --now libvirtd
# 将当前用户加入 libvirt 组,避免每次都需要 sudo
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
# 验证 KVM 是否可用
virsh list --all
安装完成后,virsh 默认连接 qemu:///system 这个系统级会话,普通用户如果未加入 libvirt 组会报权限错误,记得重新登录使组生效。
三、创建虚拟机前的资源规划
在创建虚拟机之前,先规划好存储池与网络。libvirt 默认会在 /var/lib/libvirt/images/ 下存放磁盘镜像,在 /etc/libvirt/qemu/ 下存放 XML 配置。对于生产环境,建议使用 LVM 逻辑卷或专门的磁盘分区作为存储池,而不是依赖根分区的默认目录,避免磁盘写满影响宿主机。
检查默认存储池与网络:
# 查看存储池
virsh pool-list --all
# 查看网络
virsh net-list --all
# 查看宿主机磁盘与内存资源
free -h
df -h /var/lib/libvirt/images
KVM 支持多种磁盘镜像格式,其中 qcow2 是最常用的格式,它支持稀疏分配(按需占用空间)、快照与写时复制(copy-on-write),非常适合日常运维场景。相比之下 raw 格式性能略高但无法快照,适用于对性能要求极高且不需要快照的数据库虚拟机。
四、实战:命令行部署一台 Ubuntu 虚拟机
下面通过 virt-install 命令,以非交互方式安装一台 Ubuntu 虚拟机。这里假设你已经把 Ubuntu 的 ISO 镜像下载到了 /var/lib/libvirt/images/ubuntu-22.04.iso:
# 创建一台 2 核 CPU、4GB 内存、40GB 磁盘的虚拟机
sudo virt-install
--name ubuntu-test
--ram 4096
--vcpus 2
--disk path=/var/lib/libvirt/images/ubuntu-test.qcow2,size=40,format=qcow2
--os-variant ubuntu22.04
--network network=default
--graphics none
--console pty,target_type=serial
--location /var/lib/libvirt/images/ubuntu-22.04.iso,kernel=casper/vmlinuz,initrd=casper/initrd
--extra-args 'console=ttyS0,115200n8'
--location 参数允许直接从 ISO 引导内核与 initrd,配合 --extra-args 把内核输出重定向到串口,这样即使没有图形界面也能在终端中完成整个安装过程。如果希望自动化无人值守安装,可以进一步使用 cloud-init 或 Preseed 应答文件。
安装完成后,日常管理虚拟机的常用命令如下:
# 查看所有虚拟机状态
virsh list --all
# 启动、关闭、强制关闭、重启虚拟机
virsh start ubuntu-test
virsh shutdown ubuntu-test
virsh destroy ubuntu-test
virsh reboot ubuntu-test
# 设置开机自启
virsh autostart ubuntu-test
# 连接到虚拟机串口控制台(退出按 Ctrl+])
virsh console ubuntu-test
五、快照与克隆:状态管理利器
快照是虚拟机某一时刻的完整状态保存,出问题可以一键回滚,是变更前必备的保险。KVM 的 qcow2 格式支持内部快照,创建和恢复都很快:
# 创建名为 before-upgrade 的快照
virsh snapshot-create-as ubuntu-test before-upgrade "升级前的基线快照"
# 查看快照列表
virsh snapshot-list ubuntu-test
# 回滚到指定快照
virsh snapshot-revert ubuntu-test before-upgrade
# 删除快照
virsh snapshot-delete ubuntu-test before-upgrade
克隆则用于快速复制一台配置相近的机器。使用 virt-clone 命令即可完成:
# 克隆一台新虚拟机,生成全新的磁盘镜像与 MAC 地址
sudo virt-clone
--original ubuntu-test
--name ubuntu-clone
--file /var/lib/libvirt/images/ubuntu-clone.qcow2
# 克隆完成后启动
virsh start ubuntu-clone
注意:克隆出来的虚拟机会继承原机的 hostname 和网络配置,需要进入新机后修改 /etc/hostname 与网卡配置,避免两台机器 IP 冲突。
六、资源管理:CPU、内存与磁盘在线调整
KVM 的一大优势是支持虚拟机在线(热)调整部分资源,无需关机即可应对突发负载。以 libvirt 为例:
# 在线将内存调整为 8GB(需宿主机有足够空闲内存)
virsh setmem ubuntu-test 8192M --live
# 在线将 CPU 调整为 4 核
virsh setvcpus ubuntu-test 4 --live
# 查看虚拟机的当前资源占用
virsh dominfo ubuntu-test
virsh domstats ubuntu-test
磁盘扩容则需要先扩展镜像文件,再进入虚拟机扩展分区与文件系统:
# 关闭虚拟机后,为磁盘镜像增加 20GB 容量
virsh shutdown ubuntu-test
qemu-img resize /var/lib/libvirt/images/ubuntu-test.qcow2 +20G
# 启动虚拟机,进入系统后扩展分区和文件系统(以 ext4 为例)
virsh start ubuntu-test
# 在虚拟机内执行:
# sudo growpart /dev/vda 1
# sudo resize2fs /dev/vda1
对于 CPU 的精细化控制,还可以通过 vcpu 的 CPU 亲和性绑定(pinning)把虚拟机绑定到指定的物理核心,减少多虚拟机之间的争抢,这在数据库等高负载场景尤其重要。
七、常见问题与排查
问题一:virsh 报错 “Failed to connect socket to ‘/var/run/libvirt/libvirt-sock'”。通常是 libvirtd 服务未启动,执行 sudo systemctl start libvirtd 即可。
问题二:虚拟机启动报错 “CPU does not support KVM”。说明宿主机的 CPU 虚拟化扩展未开启,需要在 BIOS 中打开 Intel VT-x 或 AMD-V,并确认内核模块已加载:lsmod | grep kvm。
问题三:默认 NAT 网络下虚拟机无法被外部访问。libvirt 默认网络是 NAT 模式,只允许虚拟机访问外网,外部无法主动访问虚拟机。需要搭建网桥(bridge)并让虚拟机桥接到物理网卡,才能获得与宿主机同网段的 IP。
问题四:磁盘写满导致虚拟机变只读。qcow2 稀疏分配会随着写入不断增长,需要定期监控宿主机磁盘空间,及时用 qemu-img info 查看镜像真实占用并清理快照链。
八、总结
本文从 KVM 的原理出发,完整走通了环境准备、虚拟机部署、快照克隆与资源管理的全流程。KVM 凭借内核级加速、成熟的 libvirt 生态和丰富的管理命令,始终是 Linux 服务器虚拟化的主流选择。掌握 virt-install、virsh、virt-clone 以及 qcow2 快照机制,你就能在裸金属服务器上搭建起稳定、灵活、可快速回滚的虚拟化平台。
虚拟化解决了”一台机器当多台用”的问题,但当虚拟机数量增多后,如何保证业务不因单点故障而中断,就成了新的挑战。下期预告:第 23 天《系统安全加固——AppArmor、安全基线与入侵检测》,我们将把目光转向安全领域,学习如何为 Ubuntu 系统建立纵深防御体系,敬请期待。


















暂无评论内容