13.4.3. 使用命令行将基于磁盘的存储附加到虚拟机


要为虚拟机(VM)提供本地存储,您可以使用基于磁盘的磁盘镜像。这种类型的磁盘镜像基于主机上的磁盘分区,并使用 .qcow2.raw 格式。

要使用命令行将基于磁盘的存储附加到虚拟机,请使用以下方法之一:

  • 创建新虚拟机时,使用 the-disk 选项创建并附加新磁盘作为 virt-install 命令的一部分。具体步骤请参阅创建虚拟机
  • 对于现有虚拟机,创建基于磁盘的存储卷并将其附加到虚拟机。具体步骤请查看以下步骤。

先决条件

  • 确定您的管理程序支持基于磁盘的存储池:

    # virsh pool-capabilities | grep "'disk' supported='yes'"

    如果命令显示任何输出结果,则代表支持基于磁盘的池。

  • 准备一个设备,以此作为存储池的基础。因此,首选分区(例如 /dev/sdb1)或 LVM 卷。如果您提供对整个磁盘或块设备(例如 /dev/sdb)的写入访问权限的虚拟机,则虚拟机可能会对其分区或创建自己的 LVM 组。这可能会导致主机上的系统错误。

    但是,如果您需要为存储池使用整个块设备,红帽建议保护设备上的任何重要分区不受 os-prober 功能的影响。要做到这一点,编辑 /etc/default/grub 文件,并应用以下配置之一:

    • 禁用 os-prober

      GRUB_DISABLE_OS_PROBER=true
    • 防止 os-prober 发现您要使用的分区。例如:

      GRUB_OS_PROBER_SKIP_LIST="5ef6313a-257c-4d43@/dev/sdb1"
  • 在创建存储池前,备份所选存储设备上的任何数据。根据所使用的 libvirt 版本,在存储池中指定一个磁盘可能会重新格式化并清除当前存储在磁盘设备上的所有数据。

流程

  1. 创建并设置基于磁盘的新存储池(如果还没有池)。

    1. 定义并创建磁盘类型存储池。以下示例创建一个名为 guest_images_disk 的存储池,它使用 /dev/sdb 设备,并挂载在 /dev 目录。

      # virsh pool-define-as guest_images_disk disk --source-format=gpt --source-dev=/dev/sdb --target /dev
      Pool guest_images_disk defined
    2. 为预格式化的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据的格式。

      # virsh pool-build guest_images_disk
        Pool guest_images_disk built
    3. 可选:验证是否已创建池。

      # virsh pool-list --all
      
        Name                 State      Autostart
        -----------------------------------------
        default              active     yes
        guest_images_disk    inactive   no
    4. 启动存储池。

      # virsh pool-start guest_images_disk
        Pool guest_images_disk started
      注意

      virsh pool-start 命令只用于持久存储池。临时存储池创建时会自动启动。

    5. 可选:打开自动启动。

      默认情况下,使用 virsh 定义的存储池不会被设置为在每次虚拟化服务启动时自动启动。使用 virsh pool-autostart 命令将存储池配置为 autostart。

      # virsh pool-autostart guest_images_disk
        Pool guest_images_disk marked as autostarted
  2. 创建基于磁盘的存储卷。例如,以下命令创建一个名为 vm-disk1 的 20 GB qcow2 卷,并基于 guest_images_disk 存储池:

    # virsh vol-create-as --pool guest_images_disk --name sdb1 --capacity 20GB --format extended
    
    Vol vm-disk1 created
  3. 将存储卷作为虚拟磁盘附加到虚拟机。

    1. 找到您创建的存储卷。要做到这一点,检查卷所属的存储池:

      # virsh vol-list --pool guest_images_disk --details
      
       Name        Path                      Type   Capacity    Allocation
      ---------------------------------------------------------------------
       sdb1      /dev/sdb1                  block   20.00 GiB   20.00 GiB
    2. 找到在要附加磁盘的虚拟机中使用哪些目标设备:

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

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

      # virsh attach-disk testguest1 /dev/sdb1 vdc --persistent

验证

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

    # virsh dumpxml testguest1
    
    ...
      <disk type="block" device="disk">
        <driver name="qemu" type="raw"/>
        <source dev="/dev/sdb1" index="2"/>
        <backingStore/>
        <target dev="vdc" bus="virtio"/>
        <alias name="virtio-disk2"/>
        <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/>
      </disk>
    ...
  2. 在虚拟机的客户机操作系统中,确认磁盘映像已作为未格式化和未分配的磁盘提供。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

關於紅帽

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

让开源更具包容性

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

关于红帽文档

Legal Notice

Theme

© 2026 Red Hat
返回顶部