virsh setvcpus --live 要求虚拟机创建时已通过 --maximum 和 placement='auto' 预留热插拔能力,Guest 内核需启用 CONFIG_HOTPLUG_CPU=y,且新增 CPU 在 Guest 中需处于 online 状态;减 CPU 不支持 --live,必须关机后用 --config 修改。

virsh setvcpus --live 要求虚拟机支持热插拔 CPU
直接执行 virsh setvcpus vm-name 4 --live 失败,通常是因为虚拟机启动时没预留热插拔能力。KVM 不是默认允许在线加 CPU 的——它依赖于创建时设置的 maxcpus 上限,且 Guest OS 内核需启用 CPU 热插拔支持(如 Linux 的 CONFIG_HOTPLUG_CPU=y)。CentOS 7+/RHEL 7+、Ubuntu 16.04+ 默认满足,但老系统或精简内核可能关闭该选项。
- 检查当前最大 CPU 数:
virsh dominfo vm-name | grep "Max CPU",若显示Max CPU: 1,说明无法热加 - 确认 Guest 是否识别新 CPU:
cat /proc/cpuinfo | grep processor | wc -l,热加后应立即增加 - 宿主机需开启 Intel VT-x / AMD-V,且 libvirt/QEMU 版本 ≥ 1.2.0(RHEL 7.0+ 或 Ubuntu 14.04+ 基本达标)
必须先用 --config 设置 maxcpus,再 --live 生效
在线加 CPU 是“上限已定、动态启用”的过程。你不能把一个初始只配了 1 vCPU 且未声明上限的虚拟机,突然从 1 加到 4——--live 只能启用已预分配但未激活的逻辑 CPU。
- 关机状态下设上限(关键一步):
virsh setvcpus vm-name --maximum 8 --config - 确保 XML 中
<vcpu placement="static">2</vcpu>改为<vcpu placement="auto" current="2">8</vcpu>(placement='auto'才支持热插拔) - 启动虚拟机后,才能执行:
virsh setvcpus vm-name 4 --live - 若报错
operation failed: cannot change vcpu count for running domain,大概率是placement还是static或--maximum未生效
Guest 内部需手动 online 新增 CPU(部分发行版需要)
Linux Guest 一般会自动 online 新 CPU,但某些场景下(如内核参数禁用自动上线、或使用 custom initramfs),新 CPU 会处于 offline 状态,lscpu 显示 CPU(s): 4,但 cat /sys/devices/system/cpu/online 可能仍是 0-1。
- 查看状态:
ls /sys/devices/system/cpu/cpu[0-9]* | xargs -I{} sh -c 'echo {} && cat {}/online 2>/dev/null' - 手动 online:
echo 1 > /sys/devices/system/cpu/cpu2/online(逐个执行,或写脚本循环) - 永久生效(可选):在 Guest 中添加 udev rule 或 systemd service,在热插拔事件触发时自动 online
- 注意:
cpu2编号不保证连续,实际编号以ls /sys/devices/system/cpu/列出为准
减 CPU 不能用 --live,只能改配置后重启
virsh setvcpus vm-name 2 --live 在运行中减少 CPU 数量,libvirt 会直接拒绝,报错 operation not supported: cannot decrease vcpu count for running domain。这是 KVM/QEMU 的硬限制:CPU 只能热添加,不能热移除(hot unplug)。
- 要减 CPU,必须先
virsh shutdown vm-name - 再
virsh setvcpus vm-name 2 --config(此时 --config 是唯一有效方式) - 启动后,
dominfo中 CPU(s) 才会更新为 2 - 如果之前设过
--maximum 8,现在改成 2 并不会降低上限,只是当前生效数;上限仍需--maximum 2 --config才能收紧
真正容易被忽略的是 placement='auto' 和 --maximum 的组合——很多人只改了 XML 里的数字,却忘了改 placement 属性,或者漏掉 --config 导致上限没写入磁盘配置。这两步缺一不可,否则 --live 就是无源之水。

















