18.4.2.3. 将 virtio-mem 设备附加到虚拟机


要将额外内存附加到正在运行的虚拟机(也称为内存热插拔),之后能够调整热插拔内存的大小,您可以使用 virtio-mem 设备。特别是,您可以使用 libvirt XML 配置文件和 virsh 命令来定义并将 virtio-mem 设备附加到虚拟机(VM)。

先决条件

  • 主机使用 Intel 64、AMD64 或 ARM 64 CPU 架构。
  • 主机使用 RHEL 10 作为操作系统。
  • 运行在主机上的虚拟机使用以下操作系统版本之一:

    • 在 Intel 64 和 AMD64 主机上: RHEL 8.10 或 RHEL 9.4 或更高版本

      重要

      从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。

    • 在 ARM 64 主机上: RHEL 9.6 或更高版本
    • 在任何支持的主机上: RHEL 10
  • 虚拟机配置了内存在线。具体步骤请参阅: 在虚拟机中配置内存

流程

  1. 确保目标虚拟机的 XML 配置包含 maxMemory 参数:

    # virsh edit testguest1
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <maxMemory unit='GiB'>128</maxMemory>
      ...
    </domain>

    在本例中,testguest1 虚拟机的 XML 配置定义了一个 maxMemory 参数,其大小为 128 G(GiB)。maxMemory 大小指定虚拟机可以使用的最大内存,其包括初始内存和热插拔内存。

  2. 创建并打开 XML 文件,来在主机上定义 virtio-mem 设备,例如:

    # vim virtio-mem-device.xml
  3. 在文件中添加 virtio-mem 设备的 XML 定义并保存:

    <memory model='virtio-mem'>
            <target>
                    <size unit='GiB'>48</size>
                    <node>0</node>
                    <block unit='MiB'>2</block>
                    <requested unit='GiB'>16</requested>
                    <current unit='GiB'>16</current>
            </target>
            <alias name='ua-virtiomem0'/>
            <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </memory>
    <memory model='virtio-mem'>
            <target>
                    <size unit='GiB'>48</size>
                    <node>1</node>
                    <block unit='MiB'>2</block>
                    <requested unit='GiB'>0</requested>
                    <current unit='GiB'>0</current>
            </target>
            <alias name='ua-virtiomem1'/>
            <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memory>

    在本例中,使用以下参数定义了两个 virtio-mem 设备:

    • size :这是设备的最大大小。在示例中,它是 48 GiB。size 必须是 block 大小的倍数。
    • node :这是为 virtio-mem 设备分配的 vNUMA 节点。
    • block :这是设备的块大小。它必须至少是 Transparent Huge Page (THP)的大小,在 Intel 64 和 AMD64 CPU 构架上是 2 MiB。在 ARM64 架构上,THP 的大小可以是 2 MiB 或 512 MiB,具体取决于基本页大小。Intel 64 或 AMD64 架构上的 2 MiB 块大小通常是好的默认选择。当使用带有 虚拟功能 I/O(VFIO)中介设备(mdev)virtio-mem 时,跨所有 virtio-mem 设备的总块数不能大于 32768,否则 RAM 的插入可能会失败。
    • requested :这是您附加到具有 virtio-mem 设备的虚拟机的内存量。但是,它只对虚拟机的请求,可能无法成功解决,例如如果虚拟机没有正确配置。requested 大小必须是 block 大小的倍数,且不能超过定义的 size最大值。
    • current:这代表提供给虚拟机的当前 virtio-mem 设备的大小。current 大小可能与 requested 不同,例如当请求无法完成或重启虚拟机时。
    • alias :这是一个可选d 用户定义的别名,您可用来指定预期的 virtio-mem 设备,例如使用 libvirt 命令编辑设备时。libvirt 中所有用户定义的别名必须以 "ua-" 前缀开头。

      除了这些特定的参数外,libvirt 像处理任何其他 PCI 设备一样处理 virtio-mem 设备。

      有关管理附加到虚拟机的 PCI 设备的更多信息,请参阅: 管理虚拟设备

  4. 使用 XML 文件将定义的 virtio-mem 设备附加到虚拟机。例如,要将 virtio-mem-device.xml 中定义的两个设备永久附加到正在运行的 testguest1 虚拟机:

    # virsh attach-device testguest1 virtio-mem-device.xml --live --config

    --live 选项仅将设备附加到正在运行的虚拟机,在引导间不持久。--config 选项使配置更改持久。您还可以将设备附加到没有 --live 选项的关闭的虚拟机。

  5. 可选:要动态更改附加到正在运行的虚拟机的 请求的 virtio-mem 设备的大小,请使用 virsh update-memory-device 命令:

    # virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB

    在本例中:

    • testguest1 是您要更新的虚拟机。
    • --alias ua-virtiomem0 是之前由定义的别名指定的 virtio-mem 设备。
    • --requested-size 4GiBvirtio-mem 设备的 requested 大小更改为 4 GiB。

      警告

      通过减少 requested 大小,从正在运行的虚拟机中拔出内存可能不可靠。此过程是否成功取决于各种因素,如所使用的内存在线策略。

      在某些情况下,客户机操作系统无法成功完成请求,因为当时无法更改热插拔内存量。

      另外,从正在运行的虚拟机中拔出内存在 RHEL 8.10 虚拟机中默认被禁用。

  6. 可选:要从关闭的虚拟机中拔出 virtio-mem 设备,请使用 virsh detach-device 命令:

    # virsh detach-device testguest1 virtio-mem-device.xml
  7. 可选:要从正在运行的虚拟机中拔出 virtio-mem 设备:

    1. virtio-mem 设备的 requested 大小改为 0,否则尝试从正在运行的虚拟机中拔出 virtio-mem 设备将失败。

      # virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 0
    2. 从正在运行的虚拟机中拔出 virtio-mem 设备:

      # virsh detach-device testguest1 virtio-mem-device.xml --config

验证

  • 在虚拟机中,检查可用的 RAM ,并查看总内存现在是否包含热插拔内存:

    # free -h
    
            total    used    free   shared  buff/cache   available
    Mem:    31Gi     5.5Gi   14Gi   1.3Gi   11Gi         23Gi
    Swap:   8.0Gi    0B      8.0Gi
    # numactl -H
    
    available: 1 nodes (0)
    node 0 cpus: 0 1 2 3 4 5 6 7
    node 0 size: 29564 MB
    node 0 free: 13351 MB
    node distances:
    node   0
      0:  10
  • 也可以通过显示正在运行的虚拟机的 XML 配置来查看主机上当前的插入的 RAM 量:

    # virsh dumpxml testguest1
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <currentMemory unit='GiB'>31</currentMemory>
      ...
      <memory model='virtio-mem'>
          <target>
            <size unit='GiB'>48</size>
            <node>0</node>
            <block unit='MiB'>2</block>
            <requested unit='GiB'>16</requested>
            <current unit='GiB'>16</current>
          </target>
          <alias name='ua-virtiomem0'/>
          <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/>
      ...
    </domain>

    在本例中:

    • <currentMemory unit='GiB'>31</currentMemory> 代表虚拟机中所有源的可用 RAM 总量。
    • <current unit='GiB'>16</current> 代表 virtio-mem 设备提供的插入的 RAM 的当前大小。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部