主题
KVM 虚拟机扩容记录 — szb122032/33/34
操作时间
2026-08-15 (CST)
操作目的
将 szb122032、szb122033、szb122034 三台虚拟机从 4C8G 扩容到 8C16G。
配套脚本
本操作使用以下脚本(位于同目录下):
| 脚本 | 用途 | 使用方法 |
|---|---|---|
check-vm-status.sh | 检查虚拟机当前配置和运行状态 | ./check-vm-status.sh [vm1 vm2 ...] |
resize-vm.sh | 单台虚拟机扩容 | ./resize-vm.sh <vm> <cpu> <mem-gib> |
batch-resize.sh | 批量扩容多台虚拟机 | ./batch-resize.sh <cpu> <mem-gib> <vm1> [vm2] ... |
快速使用示例
bash
# 1. 扩容前检查状态
./check-vm-status.sh szb122032 szb122033 szb122034
# 2. 批量扩容到 8C16G
./batch-resize.sh 8 16 szb122032 szb122033 szb122034
# 3. 扩容后验证
./check-vm-status.sh szb122032 szb122033 szb122034扩容前状态
使用检查脚本获取
bash
./check-vm-status.sh szb122032 szb122033 szb122034检查结果汇总
| VM | 状态 | CPU (current/max) | 内存 | 自启动 |
|---|---|---|---|---|
| szb122032 | running | 4 / 8 | 8 GiB | enable |
| szb122033 | running | 4 / 8 | 8 GiB | enable |
| szb122034 | running | 4 / 8 | 8 GiB | enable |
关键配置分析
- CPU 最大值:8 核(已预配置)
- 当前 CPU:4 核
- 内存最大值:未设置(等于当前值 8 GiB)
- 当前内存:8 GiB
扩容可行性判断:
- ✅ CPU 可热扩容:当前 4 核 < 最大 8 核,目标 8 核在范围内
- ❌ 内存需停机扩容:需要修改最大内存上限,从 8 GiB → 16 GiB
扩容后状态
| VM | 状态 | CPU | 内存 | 变更 |
|---|---|---|---|---|
| szb122032 | running | 8 核 | 16 GiB | ✅ 成功 |
| szb122033 | running | 8 核 | 16 GiB | ✅ 成功 |
| szb122034 | running | 8 核 | 16 GiB | ✅ 成功 |
操作步骤
本次扩容提供了两种操作方式:脚本自动化(推荐)和手动逐步操作。
方式一:脚本自动化操作(推荐)
1. 扩容前状态检查
bash
./check-vm-status.sh szb122032 szb122033 szb122034该脚本输出示例:
========================================
KVM 虚拟机状态检查报告
检查时间: 2026-08-15 11:00:00
========================================
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
▶ VM: szb122032
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
状态: running
CPU: 4 核 (当前) / 8 核 (最大)
内存: 8.0 GiB (使用) / 8.0 GiB (最大)
磁盘:
- vda: /kvm/lib/libvirt/images/szb122032.qcow2
网络接口:
- vnet5 (MAC: 52:54:00:xx:xx:xx)
自启动: enable
UUID: 1d1b02d6-19d5-497e-a4d7-7096958d4a212. 批量扩容执行
bash
./batch-resize.sh 8 16 szb122032 szb122033 szb122034脚本会自动:
- 逐台停机扩容内存
- CPU 热扩容(无需停机)
- 每台完成后自动验证
- 输出汇总报告
3. 扩容后验证
bash
./check-vm-status.sh szb122032 szb122033 szb122034方式二:手动逐步操作
1. CPU 热扩容(无需停机)
由于三台 VM 的 <vcpu> 最大值已预设为 8,可以直接热激活:
bash
# 所有 VM 可以同时执行 CPU 热扩容
virsh setvcpus szb122032 8 --live --config
virsh setvcpus szb122033 8 --live --config
virsh setvcpus szb122034 8 --live --config参数说明:
--live:立即生效,无需重启--config:持久化到 XML 配置(重启后保持)
验证 CPU 扩容:
bash
virsh vcpucount szb122032
# 预期输出:
# maximum config 8
# maximum live 8
# current config 8
# current live 82. 内存扩容(需要停机)
内存从 8GB 提升到 16GB 超出原有上限,需要逐台停机操作。
2.1 关机
优先尝试优雅关机:
bash
virsh shutdown szb122032检查关机状态:
bash
virsh domstate szb122032
# 输出 "shut off" 表示已关机如果 ACPI 关机无响应(等待 30 秒后仍为 running),强制关机:
bash
virsh destroy szb122032⚠️ 警告:
destroy相当于直接断电,可能导致数据丢失。操作前请确认 VM 内无重要未落盘数据。
2.2 修改内存配置
bash
# 设置最大内存为 16 GiB(16 × 1024 × 1024 = 16777216 KiB)
virsh setmaxmem szb122032 16777216 --config
# 设置当前内存为 16 GiB
virsh setmem szb122032 16777216 --config验证配置已更新:
bash
virsh dumpxml szb122032 | grep -E '<memory|currentMemory'
# 预期输出:
# <memory unit='KiB'>16777216</memory>
# <currentMemory unit='KiB'>16777216</currentMemory>2.3 重新启动
bash
virsh start szb1220322.4 逐台执行顺序
为避免服务中断,建议逐台操作:
| 步骤 | szb122032 | szb122033 | szb122034 | 说明 |
|---|---|---|---|---|
| CPU 热扩容 | ✅ | ✅ | ✅ | 可同时执行,无需停机 |
| 关机 | 1️⃣ | 2️⃣ | 3️⃣ | 逐台执行,减少服务中断 |
| 修改内存 | ✅ | ✅ | ✅ | 在关机状态下修改 |
| 启动 | ✅ | ✅ | ✅ | 启动后验证再处理下一台 |
3. 验证扩容结果
使用验证脚本:
bash
for vm in szb122032 szb122033 szb122034; do
echo "========== $vm =========="
echo "状态:"
virsh domstate $vm
echo "CPU:"
virsh vcpucount $vm | grep 'current.*live'
echo "内存:"
virsh dominfo $vm | grep -E 'Max memory|Used memory'
echo ""
done预期输出:
========== szb122032 ==========
状态:
running
CPU:
current live 8
内存:
Max memory: 16777216 KiB
Used memory: 16777216 KiB
========== szb122033 ==========
状态:
running
CPU:
current live 8
内存:
Max memory: 16777216 KiB
Used memory: 16777216 KiB
========== szb122034 ==========
状态:
running
CPU:
current live 8
内存:
Max memory: 16777216 KiB
Used memory: 16777216 KiB内存单位换算
| GiB | KiB | 说明 |
|---|---|---|
| 1 | 1048576 | 1 × 1024 × 1024 |
| 2 | 2097152 | 2 × 1024 × 1024 |
| 4 | 4194304 | 4 × 1024 × 1024 |
| 8 | 8388608 | 8 × 1024 × 1024 |
| 16 | 16777216 | 16 × 1024 × 1024 |
| 32 | 33554432 | 32 × 1024 × 1024 |
| 64 | 67108864 | 64 × 1024 × 1024 |
快速计算公式:
KiB = GiB × 1024 × 1024
注意事项
扩容前提条件
| 条件 | CPU 扩容 | 内存扩容 | 说明 |
|---|---|---|---|
| 热扩容 | ✅ 支持 | ❌ 不支持 | CPU 可在运行时扩容(需在最大值范围内) |
| 最大值限制 | 需提前配置 | 需停机修改 | 超出最大值需修改 XML 配置 |
| Guest OS 支持 | 需支持 CPU 热插拔 | 重启后生效 | 现代 Linux 内核均支持 |
技术限制
CPU 热扩容前提
<vcpu>的maximum值必须 ≥ 目标值- 如需超出最大值,需关机后修改 XML:bash
virsh edit <vm> # 修改 <vcpu placement='static' current='4'>8</vcpu> # 改为 <vcpu placement='static' current='16'>16</vcpu>
内存无法热扩容
- KVM 不支持在线增加最大内存上限
- 必须停机才能修改
<memory>和<currentMemory> - 使用
virsh setmaxmem和virsh setmem --config修改
ACPI 关机失败处理
- 部分 VM 未安装
acpid服务或qemu-guest-agent virsh shutdown命令可能无响应- 超时后使用
virsh destroy强制关机
- 部分 VM 未安装
数据风险
destroy相当于直接断电,可能导致:- 文件系统损坏
- 数据库事务丢失
- 应用状态不一致
- 操作前务必确认 VM 内无重要未落盘数据
配置方式选择
- 推荐:使用
virsh setmaxmem/virsh setmem命令 - 避免:
dumpxml → 手动编辑 → define流程(易出错) - 使用命令方式更安全可靠,自动处理 XML 格式
- 推荐:使用
故障排除
问题 1:CPU 热扩容失败
错误信息:
error: invalid argument: requested vcpus is greater than max allowed vcpus原因:目标 CPU 数超过 <vcpu> 最大值
解决方案:
bash
# 方法 1:关机后修改 XML
virsh shutdown <vm>
virsh edit <vm>
# 修改 <vcpu placement='static' current='4'>8</vcpu>
# 为 <vcpu placement='static' current='16'>16</vcpu>
virsh start <vm>
# 方法 2:重新创建 VM(需备份配置)问题 2:内存扩容后未生效
现象:virsh dominfo 显示内存仍为旧值
原因:可能是 define 操作未成功或 VM 未重启
解决方案:
bash
# 1. 确认 VM 已关机
virsh destroy <vm>
# 2. 重新设置内存
virsh setmaxmem <vm> 16777216 --config
virsh setmem <vm> 16777216 --config
# 3. 验证配置
virsh dumpxml <vm> | grep -E '<memory|currentMemory'
# 4. 启动 VM
virsh start <vm>问题 3:VM 无法优雅关机
现象:virsh shutdown 后状态仍为 running
原因:Guest OS 未安装或未运行 ACPI 服务
解决方案:
bash
# 1. 检查 acpid 服务(在 VM 内执行)
systemctl status acpid
# 2. 安装 acpid(如未安装)
# RHEL/CentOS/Rocky:
yum install -y acpid && systemctl enable --now acpid
# Ubuntu/Debian:
apt install -y acpid && systemctl enable --now acpid
# 3. 或安装 qemu-guest-agent
yum install -y qemu-guest-agent && systemctl enable --now qemu-guest-agent问题 4:XML 定义失败
错误信息:
error: (domain_definition):1: Document is empty原因:dumpxml 输出被截断或损坏
解决方案:
bash
# 方法 1:重新 dump
virsh dumpxml <vm> > /tmp/<vm>.xml
# 检查文件完整性
wc -l /tmp/<vm>.xml
xmllint --noout /tmp/<vm>.xml
# 方法 2:直接使用 virsh setmaxmem/setmem(推荐)
virsh setmaxmem <vm> 16777216 --config
virsh setmem <vm> 16777216 --config常用 virsh 命令速查
| 命令 | 用途 | 示例 |
|---|---|---|
virsh list --all | 列出所有 VM | 查看所有 VM 状态 |
virsh dominfo <vm> | 查看 VM 基本信息 | CPU、内存、状态 |
virsh vcpucount <vm> | 查看 CPU 配置 | 当前/最大 CPU 数 |
virsh domblklist <vm> | 查看磁盘列表 | 磁盘设备和路径 |
virsh domiflist <vm> | 查看网络接口 | MAC 地址和网桥 |
virsh domstate <vm> | 查看运行状态 | running/shut off |
virsh dumpxml <vm> | 导出 XML 配置 | 备份或修改配置 |
virsh setvcpus <vm> <n> --live --config | 热扩容 CPU | 运行时调整 CPU |
virsh setmem <vm> <kib> --config | 设置内存 | 关机后生效 |
virsh setmaxmem <vm> <kib> --config | 设置最大内存 | 修改内存上限 |
virsh shutdown <vm> | 优雅关机 | 发送 ACPI 信号 |
virsh destroy <vm> | 强制关机 | 相当于断电 |
virsh start <vm> | 启动 VM | 启动已关机的 VM |
virsh reboot <vm> | 重启 VM | 发送重启信号 |
virsh edit <vm> | 编辑 XML 配置 | 交互式编辑 |
参考资料
附录:本次操作日志
执行时间线
| 时间 | 操作 | VM | 结果 |
|---|---|---|---|
| 11:00 | 状态检查 | 全部 | ✅ 4C8G |
| 11:02 | CPU 热扩容 | szb122032/33/34 | ✅ 8C |
| 11:05 | 内存扩容 | szb122032 | ✅ 16G |
| 11:08 | 内存扩容 | szb122033 | ✅ 16G |
| 11:11 | 内存扩容 | szb122034 | ✅ 16G |
| 11:15 | 最终验证 | 全部 | ✅ 8C16G |
关键命令记录
bash
# CPU 热扩容
virsh setvcpus szb122032 8 --live --config
virsh setvcpus szb122033 8 --live --config
virsh setvcpus szb122034 8 --live --config
# 内存扩容(逐台执行)
# szb122032
virsh destroy szb122032
virsh setmaxmem szb122032 16777216 --config
virsh setmem szb122032 16777216 --config
virsh start szb122032
# szb122033
virsh destroy szb122033
virsh setmaxmem szb122033 16777216 --config
virsh setmem szb122033 16777216 --config
virsh start szb122033
# szb122034
virsh destroy szb122034
virsh setmaxmem szb122034 16777216 --config
virsh setmem szb122034 16777216 --config
virsh start szb122034
# 最终验证
virsh dominfo szb122032 | grep -E 'CPU|memory'
virsh dominfo szb122033 | grep -E 'CPU|memory'
virsh dominfo szb122034 | grep -E 'CPU|memory'