libvirt-qemu-虚拟机设备热插拔

本文详细介绍了在libvirt环境下虚拟机的各种热插拔技术,包括CPU、内存、网卡、磁盘、USB及PCI设备等的热插拔操作方法。此外,还深入解析了内存热插拔的工作原理及其与内存气泡之间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cpu热插拔
# virsh setvcpus $domain_name --count 4 --live (--config可写入配置文件永久保存)
#前提条件和后续激活参考《libvirt-qemu-虚拟机cpu分配和cpu热插拔》
 
内存热插拔
<memory model='dimm'>
    <target>
        <size unit='KiB'>524287</size>
        <node>0</node>
    </target>
</memory>
#和doamin中格式相同
# virsh attach-device $domain_name mem.xml (--config可写入配置文件永久保存)
#前提条件和后续激活参考《libvirt-qemu-虚拟机内存分配和内存热插拔》
 
网卡热插拔
<interface type='bridge'>
      <mac address='52:54:00:2d:ea:aa'/>
      <source bridge='br0'/>
      <model type='virtio'/>
</interface>
#和doamin中格式相同
# virsh attach-device $domain_name interface.xml  (--config可写入配置文件永久保存)
# virsh detach-device $domain_name interface.xml
 
磁盘热插拔
<disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/tmp/test.img'/>
      <target dev='vdd' bus='virtio'/>
</disk>
#和doamin中格式相同
# virsh attach-device $domain_name disk.xml (--config可写入配置文件永久保存)
# virsh detach-device $domain_name disk.xml
 
USB设备
<hostdev mode='subsystem' type='usb'>
  <source>
    <vendor id='0x096e'/>
    <product id='0x0405'/>
  </source>
</hostdev>
#和doamin中格式相同
# virsh attach-device $domain_name usb.xml (--config可写入配置文件永久保存)
# virsh detach-device $domain_name usb.xml
 
PCI设备热插拔
<hostdev mode='subsystem' type='pci' managed='yes'>
    <source>
        <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
    </source>
</hostdev>
#和doamin中格式相同
# virsh attach-device $domain_name pci.xml (--config可写入配置文件永久保存)
# virsh detach-device $domain_name pci.xml
 
 
  在使用libvirt给虚拟机分配内存大小时,涉及到memory和currentMemory两个字段,很多人都有这个疑惑,为什么需要两个呢。其实是和内存气泡动态调整内存有关系的。简单的来说,memory是虚拟机启动时分配给的内存,currentMemory是内存气泡生效后动态调整到的内存。下面看具体的解释。
 
一. 启动内存
<memory unit='KiB'>8388608</memory>
虚拟机启动时使用的内存
 
二. 内存气泡
 
在虚拟机的xml文件中配置:
 
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>158608</currentMemory>
  ......
  <devices>
    <memballoon model='virtio'>
      <stats period='10'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
参数说明:
memory:
在qemu命令中使用参数-m来设置的。表示虚拟机在启动阶段使用的内存。包括在启动或稍后热插拔时指定的可能的附加内存。
currentMemory:
通过libvirt调整balloon值的初始值是currentMemory。
说明:
1.在虚拟机启动后加载了内存balloon驱动后就开始对虚拟机内存进行热插拔,先设置内存为<currentMemory>大小,这个<currentMemory>qemu进程不知道,时记录在libvirt中的。然后根据需求对内存进行调整(balloon),调整的上限是<memory>,这个<memory>qemu进程是知道的,在虚拟机启动时使用了这个值。
2.要禁止memballoon设备,可以设置memballoon model='none'
禁止内存气泡设备后,虚拟机内部看到的内存就是<memory>,也不能通过气泡进行调整。
 
通过ballon调整虚拟机内存大小(调整后在虚拟机内部是可以看到虚拟机内存大小变化的):
# virsh qemu-monitor-command instance-00000005 --hmp "info balloon"
# virsh qemu-monitor-command instance-00000005 --hmp "balloon 1024"
或者:
# virsh setmem instance-00000005 2097152
# virsh dommemstat instance-00000005
 
 
三. 内存热插拔
 
虚拟机的xml文件
 <maxMemory slots='1' unit='KiB'>10388608</maxMemory>
  ......
 <cpu mode='host-model'>
    ......
    <numa>
      <cell id='0' cpus='0' memory='4194304' unit='KiB'/>
    </numa>
  </cpu>
<maxMemory>的值表示通过 hot-plug 可以达到的内存的上限(包含虚拟机初始内存)。其中 slots 表示 DIMM 插槽的数量,每个插槽在运行时都可以插入一个内存设备,上限是 255 个。
<numa>内的配置用于指定虚拟机内的 NUMA 拓扑。
 
要插入内存设备xml文件
<memory model='dimm'>
    <target>
        <size unit='KiB'>524287</size>
        <node>0</node>
    </target>
</memory>
<size>指定设备的内存容量,<node>指定插入到虚拟机的哪个 NUMA 节点。
 
插入内存前虚拟机内部:
插入内存:
# virsh attach-device --live instance-00000005 mem.xml
 
插入内存后虚拟机内部:
激活新插入的内存,并查看内存:
注:新的内存设备插入之后,内存气泡可调整的上限值也随之增大相应的大小。
 
四. 热插拔内存后虚拟机内部自动 online 内存
为了让系统自动 online 添加的内存,可以设置 udev 规则,内容如下:
/etc/udev/rules.d/99-hotplug-memory.rules
# automatically online hot-plugged memory
ACTION=="add", SUBSYSTEM=="memory",ATTR{state}="online"

转载于:https://www.cnblogs.com/klb561/p/9236437.html

将可移动设备连入系统时,系统的后台中会依次发生如下事件: l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。 l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。 l hotplug装入了相应的内核模块之后,会把这一消息通知给hald。 l hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc/fstab,为相应的设备节点创建适合的挂载点。 l 卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。 当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助: l hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。 l 卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。 要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。
### 实现 Linux 虚拟机中的 CPU 热插拔配置方法 在 AArch64 架构下的 Linux 虚拟环境中,实现 vCPU 的热插拔功能涉及多个层面的技术支持和配置。以下是详细的说明: #### 1. **内核支持** 要实现 vCPU 的热插拔,首先需要确保使用的 Linux 内核启用了 `CONFIG_HOTPLUG_CPU` 和 `CONFIG_ACPI_HOTPLUG_CPU` 配置选项[^3]。这些选项允许内核逻辑上启用或禁用 CPU,并通过 ACPI 支持物理级别的添加或移除。 对于 ARM 架构而言,由于缺乏对物理 CPU 热插拔设计的支持,因此需要额外的工作来完善 Guest 内核的功能,使其能够在虚拟化环境下正常处理 vCPU 的增减请求[^1]。 #### 2. **KVM 和 QEMU 支持** KVM 默认情况下并不支持动态调整正在运行的虚拟机中 vCPU 的数量。一旦虚拟机启动,KVM 将拒绝任何针对目标虚拟机增加或减少 vCPU 的尝试。然而,在较新的 QEMU 版本中已经引入了部分实验性的支持,可以通过特定分支(如 https://github.com/imammedo/qemu/tree/cpu_add.v2)实现 vCPU 的热插功能[^2]。 需要注意的是,当前实现仅限于热插而未完全覆盖热拔需求。此外,即使实现了热插功能,也可能因潜在 bug 或限制而导致不稳定行为。 #### 3. **具体配置步骤** ##### (a) 修改虚拟机 XML 文件 使用 libvirt 工具管理 KVM/QEMU 虚拟机时,可以编辑虚拟机定义文件以指定最大可分配的 vCPU 数量 (`<maxvcpus>`) 及初始分配的数量 (`<vcpus>`): ```xml <domain> ... <vcpu placement='static'>4</vcpu> <maxvcpus>8</maxvcpus> ... </domain> ``` 上述示例表示虚拟机最初有 4 个 vCPU,但最多可以扩展到 8 个。 ##### (b) 动态添加 vCPU 执行以下命令向正在运行的虚拟机添加更多 vCPU: ```bash virsh setvcpus --domain <vm_name> --count <new_count> --config --live ``` 其中 `<vm_name>` 是虚拟机名称,`<new_count>` 表示期望的新 vCPU 总数。此操作会即时生效并更新持久化的配置。 ##### (c) 客户端操作系统检测新增资源 为了让客户端操作系统识别新加入的 vCPU,通常需要触发一次设备重扫描过程。这可能依赖具体的发行版及其工具链完成。 #### 4. **注意事项** 尽管技术上可行,但在实际部署前仍需考虑诸多因素: - 测试环境应尽可能接近生产条件; - 关注所选软件版本间的兼容性问题; - 提供充分文档记录整个实施流程以便后续维护。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值