跳到主要内容

第8章 KVM热添加技术

热添加(Hot-add)技术允许在虚拟机运行时动态添加或移除硬件资源,无需关机即可调整配置。本章将详细介绍KVM支持的各种热添加功能。

热添加概述

支持的热添加资源

资源类型热添加热移除限制条件
硬盘需要virtio驱动
网卡需要virtio驱动
内存需要预设最大内存
CPU需要预设最大CPU数
USB设备-
PCI设备需要硬件支持
重要提示
  1. 热添加功能需要客户机操作系统支持
  2. 建议使用virtio驱动以获得最佳兼容性
  3. 某些资源只能增加不能减少(如内存、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. 先在宿主机扩容磁盘文件
  2. 通知虚拟机重新识别磁盘大小
  3. 在虚拟机内扩展文件系统
# 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

故障排查

常见问题

  1. 热添加失败:不支持的操作

    • 检查虚拟机配置是否启用ACPI
    • 确认使用virtio驱动
    • 验证客户机内核版本
  2. 资源未被识别

    # 重新扫描SCSI总线(磁盘)
    echo "- - -" > /sys/class/scsi_host/host0/scan

    # 重新扫描PCI总线
    echo 1 > /sys/bus/pci/rescan
  3. 内存热添加限制

    # 检查内存热添加支持
    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

性能影响

性能考虑
  1. 磁盘热添加:影响最小,推荐使用
  2. 网卡热添加:可能需要重新配置网络,影响较小
  3. 内存热添加:可能触发内存重分配,短暂影响性能
  4. CPU热添加:可能影响进程调度,建议在低负载时操作

总结

本章介绍了KVM热添加技术的各个方面:

  • ✅ 热添加硬盘的方法和在线扩容
  • ✅ 网卡的动态添加和配置
  • ✅ 内存和CPU的热添加配置
  • ✅ USB和PCI设备的直通
  • ✅ 资源监控和验证方法
  • ✅ 常见问题的排查和解决

热添加技术极大提高了虚拟机的灵活性,使得资源调整无需停机,特别适合生产环境的动态资源管理。下一章将介绍虚拟机迁移技术。