Ubuntu 运维系列 | 第 22 天:KVM 虚拟化——虚拟机部署、快照与资源管理

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

Ubuntu 运维 第22天

本文作为 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-installvirshvirt-clone 以及 qcow2 快照机制,你就能在裸金属服务器上搭建起稳定、灵活、可快速回滚的虚拟化平台。

虚拟化解决了”一台机器当多台用”的问题,但当虚拟机数量增多后,如何保证业务不因单点故障而中断,就成了新的挑战。下期预告:第 23 天《系统安全加固——AppArmor、安全基线与入侵检测》,我们将把目光转向安全领域,学习如何为 Ubuntu 系统建立纵深防御体系,敬请期待。

微信二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容