Skip to content

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)内存自启动
szb122032running4 / 88 GiBenable
szb122033running4 / 88 GiBenable
szb122034running4 / 88 GiBenable

关键配置分析

  • CPU 最大值:8 核(已预配置)
  • 当前 CPU:4 核
  • 内存最大值:未设置(等于当前值 8 GiB)
  • 当前内存:8 GiB

扩容可行性判断

  • ✅ CPU 可热扩容:当前 4 核 < 最大 8 核,目标 8 核在范围内
  • ❌ 内存需停机扩容:需要修改最大内存上限,从 8 GiB → 16 GiB

扩容后状态

VM状态CPU内存变更
szb122032running8 核16 GiB✅ 成功
szb122033running8 核16 GiB✅ 成功
szb122034running8 核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-7096958d4a21

2. 批量扩容执行

bash
./batch-resize.sh 8 16 szb122032 szb122033 szb122034

脚本会自动:

  1. 逐台停机扩容内存
  2. CPU 热扩容(无需停机)
  3. 每台完成后自动验证
  4. 输出汇总报告

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           8

2. 内存扩容(需要停机)

内存从 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 szb122032
2.4 逐台执行顺序

为避免服务中断,建议逐台操作:

步骤szb122032szb122033szb122034说明
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

内存单位换算

GiBKiB说明
110485761 × 1024 × 1024
220971522 × 1024 × 1024
441943044 × 1024 × 1024
883886088 × 1024 × 1024
161677721616 × 1024 × 1024
323355443232 × 1024 × 1024
646710886464 × 1024 × 1024

快速计算公式KiB = GiB × 1024 × 1024

注意事项

扩容前提条件

条件CPU 扩容内存扩容说明
热扩容✅ 支持❌ 不支持CPU 可在运行时扩容(需在最大值范围内)
最大值限制需提前配置需停机修改超出最大值需修改 XML 配置
Guest OS 支持需支持 CPU 热插拔重启后生效现代 Linux 内核均支持

技术限制

  1. CPU 热扩容前提

    • <vcpu>maximum 值必须 ≥ 目标值
    • 如需超出最大值,需关机后修改 XML:
      bash
      virsh edit <vm>
      # 修改 <vcpu placement='static' current='4'>8</vcpu>
      # 改为 <vcpu placement='static' current='16'>16</vcpu>
  2. 内存无法热扩容

    • KVM 不支持在线增加最大内存上限
    • 必须停机才能修改 <memory><currentMemory>
    • 使用 virsh setmaxmemvirsh setmem --config 修改
  3. ACPI 关机失败处理

    • 部分 VM 未安装 acpid 服务或 qemu-guest-agent
    • virsh shutdown 命令可能无响应
    • 超时后使用 virsh destroy 强制关机
  4. 数据风险

    • destroy 相当于直接断电,可能导致:
      • 文件系统损坏
      • 数据库事务丢失
      • 应用状态不一致
    • 操作前务必确认 VM 内无重要未落盘数据
  5. 配置方式选择

    • 推荐:使用 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:02CPU 热扩容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'