第8章 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设备的直通
- ✅ 资源监控和验证方法
- ✅ 常见问题的排查和解决
热添加技术极大提高了虚拟机的灵活性,使得资源调整无需停机,特别适合生产环境的动态资源管理。下一章将介绍虚拟机迁移技术。