13.4. 将存储附加到虚拟机


要将存储添加到虚拟机(VM),您可以将存储资源附加到虚拟机作为虚拟磁盘。与物理存储设备类似,虚拟磁盘与它们所附加的虚拟机无关,并可移动到其他虚拟机。

您可以使用多种类型的存储资源向虚拟机添加虚拟磁盘。

要为虚拟机提供本地存储,最简单的选项通常是附加带有 .qcow2.raw 格式的基于文件的虚拟磁盘。

要在命令行中这样做,您可以使用以下方法之一:

  • 在由 libvirt 管理的基于目录的存储池中创建基于文件的存储卷。这需要多个步骤,但提供更好的与 hypervisor 集成。

    请注意,在 RHEL 10 主机上创建第一个虚拟机时,会自动创建默认的基于目录的存储卷。此存储池的名称基于保存磁盘镜像的目录名称。例如,默认情况下,在 libvirt 的系统 会话中,磁盘镜像保存在 /var/lib/libvirt/images/ 目录中,存储池名为 images

  • 使用 qemu-img 命令,将虚拟磁盘创建为主机文件系统上的文件。这是一个更快的方法,但不提供与 libvirt 的集成。

    因此,在创建后,使用 qemu-img 创建的虚拟磁盘更为困难。

注意

在命令行中创建新虚拟机时,也可以创建并附加基于文件的虚拟磁盘。要做到这一点,请在 virt-install 工具中使用- disk 选项。具体步骤请参阅创建虚拟机

流程

  1. 可选:如果要将虚拟磁盘创建为存储卷,但您不想在主机上使用 默认镜像 存储池或另一个现有存储池,请创建和设置新的目录的存储池。

    1. 配置目录类型存储池。例如,要创建一个名为 guest_images_dir 的存储池,它使用 /guest_images 目录:

      # virsh pool-define-as guest_images_dir dir --target "/guest_images"
      Pool guest_images_dir defined
    2. 根据您之前定义的配置,为存储池创建目标路径。

      # virsh pool-build guest_images_dir
        Pool guest_images_dir built
    3. 启动存储池。

      # virsh pool-start guest_images_dir
        Pool guest_images_dir started
    4. 可选:将存储池设置为在主机引导时启动。

      # virsh pool-autostart guest_images_dir
        Pool guest_images_dir marked as autostarted
    5. 可选:验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

      # virsh pool-info guest_images_dir
        Name:           guest_images_dir
        UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
        State:          running
        Persistent:     yes
        Autostart:      yes
        Capacity:       458.39 GB
        Allocation:     197.91 MB
        Available:      458.20 GB
  2. 创建基于文件的虚拟磁盘。要做到这一点,请使用以下方法之一:

    • 要快速创建不是由 libvirt 管理的基于文件的虚拟机磁盘,请使用 qemu-img 工具。

      例如,以下命令会创建一个名为 test-imageqcow2 磁盘镜像,大小为 30GB:

      # qemu-img create -f qcow2 test-image 30G
      
      Formatting 'test-image', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=32212254720 lazy_refcounts=off refcount_bits=16
    • 要创建由 libvirt 管理的基于文件的虚拟机磁盘,请根据基于目录的现有存储池将磁盘定义为存储卷。

      例如,以下命令创建一个名为 vm-disk1 的 20 GB qcow2 卷,并基于 guest_images_dir 存储池:

      # virsh vol-create-as --pool guest_images_dir --name vm-disk1 --capacity 20GB --format qcow2
      
      Vol vm-disk1 created
  3. 找到您创建的虚拟磁盘:

    • 对于使用 qemu-img 创建的虚拟机磁盘,这通常是您的当前目录。
    • 对于存储卷,检查卷所属的存储池:

      # virsh vol-list --pool guest_images_dir --details
      
       Name        Path                          Type   Capacity    Allocation
      --------------------------------------------------------------------------
       vm-disk1    /guest-images/vm-disk1      file   20.00 GiB   196.00 KiB
  4. 找到在要附加磁盘的虚拟机中使用哪些目标设备:

    # virsh domblklist --details <vm-name> Type Device Target Source ---------------------------------------------------------------- file disk *vda      /home/VirtualMachines/vm-name.qcow2
     file   cdrom    vdb      -
  5. 可选:检查磁盘的一致性,以避免出现数据崩溃或磁盘碎片的问题。具体步骤请参阅 检查虚拟磁盘的一致性
  6. 使用 virsh attach-disk 命令将磁盘附加到虚拟机。提供虚拟机中没有使用的目标设备。

    例如,以下命令将之前创建的 test-disk1 作为 vdc 设备附加到 testguest1 虚拟机:

    # virsh attach-disk testguest1 /guest-images/vm-disk1 vdc --persistent

验证

  1. 检查您附加磁盘的虚拟机 XML 配置,以查看配置是否正确。

    # virsh dumpxml testguest1
    
    ...
        <disk type='file' device='disk'>
          <driver name='qemu' type='qcow2' discard='unmap'/>
          <source file='/guest-images/vm-disk1' index='1'/>
          <backingStore/>
          <target dev='vdc' bus='virtio'/>
          <alias name='virtio-disk2'/>
          <address type='drive' controller='0' bus='0' target='0' unit='0'/>
        </disk>
    ...
  2. 在虚拟机的客户机操作系统中,确认磁盘映像已作为未格式化和未分配的磁盘提供。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部