08-KVM热添加技术
热添加(Hot-add)技术允许在虚拟机运行时动态添加或移除硬件资源,无需关机即可调整配置。本章将详细介绍KVM支持的各种热添加功能。
热添加概述
支持的热添加资源
| 资源类型 | 热添加 | 热移除 | 限制条件 | 
|---|---|---|---|
| 硬盘 | ✅ | ✅ | 需要virtio驱动 | 
| 网卡 | ✅ | ✅ | 需要virtio驱动 | 
| 内存 | ✅ | ❌ | 需要预设最大内存 | 
| CPU | ✅ | ❌ | 需要预设最大CPU数 | 
| USB设备 | ✅ | ✅ | - | 
| PCI设备 | ✅ | ✅ | 需要硬件支持 | 
重要提示
- 热添加功能需要客户机操作系统支持
- 建议使用virtio驱动以获得最佳兼容性
- 某些资源只能增加不能减少(如内存、CPU)
热添加硬盘
创建并添加硬盘
# 1. 创建新硬盘
qemu-img create -f qcow2 /data/web01-add.qcow2 10G
# 2. 临时添加硬盘(重启后失效)
virsh attach-disk web01 /data/web01-add.qcow2 vdb \
  --driver qemu --subdriver qcow2
# 3. 永久添加硬盘(写入配置)
virsh attach-disk web01 /data/web01-add.qcow2 vdb \
  --driver qemu --subdriver qcow2 --config
# 4. 同时临时和永久生效
virsh attach-disk web01 /data/web01-add.qcow2 vdb \
  --driver qemu --subdriver qcow2 --config --live
在虚拟机内使用新硬盘
# 连接到虚拟机
virsh console web01
# 查看新硬盘
lsblk
# 或
fdisk -l
# 格式化并挂载
mkfs.xfs /dev/vdb
mkdir /data
mount /dev/vdb /data
# 添加到fstab实现开机自动挂载
echo "/dev/vdb /data xfs defaults 0 0" >> /etc/fstab
热移除硬盘
# 在虚拟机内先卸载
umount /data
# 热移除硬盘
virsh detach-disk web01 vdb --live
# 永久移除(从配置中删除)
virsh detach-disk web01 vdb --config
在线扩容硬盘
在线扩容步骤
- 先在宿主机扩容磁盘文件
- 通知虚拟机重新识别磁盘大小
- 在虚拟机内扩展文件系统
# 1. 分离硬盘
virsh detach-disk web01 vdb
# 2. 扩容磁盘文件
qemu-img resize /data/web01-add.qcow2 +10G
# 3. 重新附加硬盘
virsh attach-disk web01 /data/web01-add.qcow2 vdb \
  --driver qemu --subdriver qcow2
# 4. 在虚拟机内扩展文件系统
# 对于XFS
xfs_growfs /dev/vdb
# 对于ext4
resize2fs /dev/vdb
热添加网卡
添加网卡
# 添加NAT网络网卡
virsh attach-interface web01 --type network \
  --source default --model virtio --live
# 添加桥接网卡
virsh attach-interface web01 --type bridge \
  --source br0 --model virtio --live --config
# 指定MAC地址
virsh attach-interface web01 --type bridge \
  --source br0 --model virtio \
  --mac 52:54:00:11:22:33 --live --config
查看和配置新网卡
# 在虚拟机内查看
ip link show
# 或
ifconfig -a
# 配置IP地址
# 方式1:临时配置
ip addr add 192.168.1.100/24 dev eth1
ip link set eth1 up
# 方式2:永久配置(CentOS/RHEL)
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
EOF
systemctl restart network
热移除网卡
# 查看网卡MAC地址
virsh domiflist web01
# 通过MAC地址移除
virsh detach-interface web01 --type bridge \
  --mac 52:54:00:11:22:33 --live --config
热添加内存
配置支持内存热添加
创建虚拟机时需要预设最大内存:
virt-install \
  --name web-server \
  --memory 1024,maxmemory=4096 \
  --vcpus 2 \
  --disk /data/web-server.qcow2,size=20 \
  --network network=default \
  --cdrom /data/centos7.iso \
  --graphics vnc,listen=0.0.0.0 \
  --noautoconsole
动态调整内存
# 查看当前内存配置
virsh dominfo web-server | grep memory
# 临时增加内存(立即生效)
virsh setmem web-server 2048M --live
# 永久修改内存配置
virsh setmem web-server 2048M --config
# 同时修改当前和配置
virsh setmem web-server 2048M --live --config
内存调整限制
- 只能在初始内存和最大内存之间调整
- 减少内存可能导致系统不稳定
- 建议只增加不减少内存
内存热插拔(高级)
<!-- 在虚拟机XML中配置NUMA和内存热插拔 -->
<maxMemory slots='16' unit='KiB'>16777216</maxMemory>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<cpu>
  <numa>
    <cell id='0' cpus='0-1' memory='1048576' unit='KiB'/>
  </numa>
</cpu>
# 添加内存设备
virsh attach-device web-server --live << EOF
<memory model='dimm'>
  <target>
    <size unit='KiB'>1048576</size>
    <node>0</node>
  </target>
</memory>
EOF
热添加CPU
配置支持CPU热添加
# 创建时指定最大CPU数
virt-install \
  --name web-server \
  --memory 2048 \
  --vcpus 2,maxvcpus=8 \
  --disk /data/web-server.qcow2,size=20 \
  --network network=default \
  --cdrom /data/centos7.iso \
  --graphics vnc,listen=0.0.0.0 \
  --noautoconsole
动态调整CPU
# 查看当前CPU配置
virsh vcpucount web-server
# 查看详细CPU信息
virsh vcpuinfo web-server
# 临时增加CPU
virsh setvcpus web-server 4 --live
# 永久修改CPU配置
virsh setvcpus web-server 4 --config
# 查看可以设置的CPU范围
virsh maxvcpus web-server
在虚拟机内启用新CPU
# 查看CPU状态
ls /sys/devices/system/cpu/
# 启用新CPU(如果需要)
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
# 验证
lscpu
高级热添加配置
USB设备热添加
# 查看主机USB设备
lsusb
# 添加USB设备(通过vendor:product ID)
virsh attach-device web-server --live << EOF
<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor id='0x0781'/>
    <product id='0x5567'/>
  </source>
</hostdev>
EOF
# 移除USB设备
virsh detach-device web-server usb-device.xml
PCI设备直通
# 查看可用PCI设备
virsh nodedev-list --tree
# 准备PCI设备
virsh nodedev-detach pci_0000_01_00_0
# 添加PCI设备
virsh attach-device web-server --live << EOF
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
</hostdev>
EOF
热添加配置最佳实践
<!-- 优化的虚拟机配置示例 -->
<domain type='kvm'>
  <name>web-server</name>
  <memory unit='KiB'>2097152</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <maxMemory unit='KiB'>8388608</maxMemory>
  <vcpu placement='static' current='2'>8</vcpu>
  
  <!-- 启用热添加特性 -->
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  
  <!-- CPU热添加拓扑 -->
  <cpu mode='host-model'>
    <topology sockets='2' cores='2' threads='2'/>
  </cpu>
  
  <!-- 内存热添加配置 -->
  <memoryBacking>
    <hugepages/>
  </memoryBacking>
</domain>
监控和验证
监控资源使用
# 实时监控虚拟机资源
virt-top
# 查看虚拟机统计信息
virsh domstats web-server
# 查看块设备统计
virsh domblkstat web-server vda
# 查看网络统计
virsh domifstat web-server vnet0
验证热添加效果
# 创建测试脚本
cat > /tmp/test-hotadd.sh << 'EOF'
#!/bin/bash
echo "=== 系统资源信息 ==="
echo "CPU核心数: $(nproc)"
echo "内存总量: $(free -h | grep Mem | awk '{print $2}')"
echo "磁盘设备: $(lsblk -d | grep -v NAME | wc -l)"
echo "网络接口: $(ip -o link show | grep -v lo | wc -l)"
EOF
chmod +x /tmp/test-hotadd.sh
# 热添加前后执行对比
/tmp/test-hotadd.sh
故障排查
常见问题
- 
热添加失败:不支持的操作 - 检查虚拟机配置是否启用ACPI
- 确认使用virtio驱动
- 验证客户机内核版本
 
- 
资源未被识别 # 重新扫描SCSI总线(磁盘)
 echo "- - -" > /sys/class/scsi_host/host0/scan
 # 重新扫描PCI总线
 echo 1 > /sys/bus/pci/rescan
- 
内存热添加限制 # 检查内存热添加支持
 grep CONFIG_MEMORY_HOTPLUG /boot/config-$(uname -r)
日志分析
# 查看libvirt日志
tail -f /var/log/libvirt/qemu/web-server.log
# 查看系统日志
journalctl -u libvirtd -f
# 虚拟机内核日志
dmesg | tail -50
性能影响
性能考虑
- 磁盘热添加:影响最小,推荐使用
- 网卡热添加:可能需要重新配置网络,影响较小
- 内存热添加:可能触发内存重分配,短暂影响性能
- CPU热添加:可能影响进程调度,建议在低负载时操作
总结
本章介绍了KVM热添加技术的各个方面:
- ✅ 热添加硬盘的方法和在线扩容
- ✅ 网卡的动态添加和配置
- ✅ 内存和CPU的热添加配置
- ✅ USB和PCI设备的直通
- ✅ 资源监控和验证方法
- ✅ 常见问题的排查和解决
热添加技术极大提高了虚拟机的灵活性,使得资源调整无需停机,特别适合生产环境的动态资源管理。下一章将介绍虚拟机迁移技术。