14.2. 使用 CLI 管理虚拟机存储池

您可以使用 CLI 管理存储池的以下方面来为虚拟机分配存储:

14.2.1. 使用 CLI 查看存储池信息

通过使用 CLI,您可以查看所有存储池的列表,其中包含有关存储池的有限或完整的详情。您还可以过滤列出的存储池。

流程

  • 使用 virsh pool-list 命令来查看存储池信息。

    # virsh pool-list --all --details
     Name                State    Autostart  Persistent    Capacity  Allocation   Available
     default             running  yes        yes          48.97 GiB   23.93 GiB   25.03 GiB
     Downloads           running  yes        yes         175.62 GiB   62.02 GiB  113.60 GiB
     RHEL-Storage-Pool   running  yes        yes         214.62 GiB   93.02 GiB  168.60 GiB

其它资源

  • virsh pool-list --help 命令

14.2.2. 使用 CLI 创建基于目录的存储池

基于目录的存储池是基于现有挂载的文件系统中的目录。例如,当您想要将文件系统上的剩余空间用于其他用途时,这非常有用。您可以使用 virsh 工具来创建基于目录的存储池。

先决条件

  • 确定您的管理程序支持目录存储池:

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

    如果命令显示任何输出结果,则代表支持目录池。

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令来定义和创建目录类型的存储池。例如,要创建使用 /guest_images 目录的名为 guest_images_dir 的存储池:

    # virsh pool-define-as guest_images_dir dir --target "/guest_images"
    Pool guest_images_dir defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅基于目录的存储池参数

  2. 创建存储池目标路径

    使用 virsh pool-build 命令,来为事先格式化的文件系统存储池创建存储池目标路径,初始化存储源设备,并定义数据格式。

    # virsh pool-build guest_images_dir
      Pool guest_images_dir built
    
    # ls -la /guest_images
      total 8
      drwx------.  2 root root 4096 May 31 19:38 .
      dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
  3. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_dir
      Pool guest_images_dir started
    注意

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

  5. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_dir
      Pool guest_images_dir marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 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

14.2.3. 使用 CLI 创建基于磁盘的存储池

在基于磁盘的存储池中,池是基于磁盘分区的。例如,当您希望整个磁盘分区专门用于虚拟机(VM)存储时,这非常有用。您可以使用 virsh 工具来创建基于磁盘的存储池。

先决条件

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

    # 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. 创建存储池

    使用 virsh pool-define-as 命令来定义和创建磁盘类型的存储池。以下示例创建一个名为 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

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅基于磁盘的存储池参数

  2. 创建存储池目标路径

    使用 virsh pool-build 命令,为事先格式化的文件系统存储池创建存储池目标路径、初始化存储源设备,并定义数据格式。

    # virsh pool-build guest_images_disk
      Pool guest_images_disk built
    注意

    只有基于磁盘、基于文件系统和逻辑存储池才需要构建目标路径。如果 libvirt 检测到源存储设备的数据格式与所选存储池类型不同,则构建会失败,除非指定了 overwrite 选项。

  3. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_disk
      Pool guest_images_disk started
    注意

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

  5. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_disk
      Pool guest_images_disk marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_disk
      Name:           guest_images_disk
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB

14.2.4. 使用 CLI 创建基于文件系统的存储池

当您要在未挂载的文件系统上创建存储池时,请使用基于文件系统的存储池。此存储池基于给定的文件系统挂载点。您可以使用 virsh 工具来创建基于文件系统的存储池。

先决条件

  • 确保您的管理程序支持基于文件系统的存储池:

    # virsh pool-capabilities | grep "'fs' 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"

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义和创建文件系统类型的存储池。例如,要创建一个名为 guest_images_fs 的存储池,它使用 /dev/sdc1 分区,并挂载在 /guest_images 目录上:

    # virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
    Pool guest_images_fs defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请参阅基于文件系统的存储池参数

  2. 定义存储池目标路径

    使用 virsh pool-build 命令,为事先格式化的文件系统存储池创建存储池目标路径、初始化存储源设备,并定义数据格式。

    # virsh pool-build guest_images_fs
      Pool guest_images_fs built
    
    # ls -la /guest_images
      total 8
      drwx------.  2 root root 4096 May 31 19:38 .
      dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
  3. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_fs
      Pool guest_images_fs started
    注意

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

  5. 可选: 打开自动启动

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

    # virsh pool-autostart guest_images_fs
      Pool guest_images_fs marked as autostarted

验证

  1. 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_fs
      Name:           guest_images_fs
      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. 验证文件系统的目标路径中存在 lost+found 目录,这表示挂载该设备。

    # mount | grep /guest_images
      /dev/sdc1 on /guest_images type ext4 (rw)
    
    # ls -la /guest_images
      total 24
      drwxr-xr-x.  3 root root  4096 May 31 19:47 .
      dr-xr-xr-x. 25 root root  4096 May 31 19:38 ..
      drwx------.  2 root root 16384 May 31 14:18 lost+found

14.2.5. 使用 CLI 创建基于 iSCSI 的存储池

互联网小型计算机系统接口(iSCSI)是基于 IP 的存储网络标准,用于连接数据存储设施。如果要在 iSCSI 服务器上拥有一个存储池,您可以使用 virsh 工具来创建基于 iSCSI 的存储池。

先决条件

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

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

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

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令来定义和创建 iSCSI 类型的存储池。例如,要创建一个名为 guest_images_iscsi 的存储池,它使用 server1.example.com 上的 iqn.2010-05.com.example.server1:iscsirhel7guest IQN,并挂载在 /dev/disk/by-path 路径上:

    # virsh pool-define-as --name guest_images_iscsi --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
    Pool guest_images_iscsi defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看基于 iSCSI 的存储池参数

  2. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_iscsi
      Pool guest_images_iscsi started
    注意

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

  4. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_iscsi
      Pool guest_images_iscsi marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_iscsi
      Name:           guest_images_iscsi
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB

14.2.6. 使用 CLI 创建基于 LVM 的存储池

如果要拥有一个存储池,其是 LVM 卷组的一部分,您可以使用 virsh 工具来创建基于 LVM 的存储池。

建议

在创建基于 LVM 的存储池前请注意以下几点:

  • 基于 LVM 的存储池不能为 LVM 提供完整的灵活性。
  • libvirt 支持精简逻辑卷,但不提供精简存储池的功能。
  • 基于 LVM 的存储池是卷组。您可以使用 virsh 工具创建卷组,但使用这种方法,您在创建的卷组中只能有一个设备。要创建具有多个设备的卷组,请使用 LVM 工具,请参阅 如何在 Linux 中 使用 LVM 创建卷组

    有关卷组的详情,请参考 Red Hat Enterprise Linux Logical Volume Manager Administration Guide

  • 基于 LVM 的存储池需要一个完整磁盘分区。如果您使用 virsh 命令激活一个新分区或设备,分区将被格式化,所有数据都被清除。在这些过程中,如果您使用主机的现有卷组,则不会删除任何内容。

先决条件

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

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

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

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令来定义和创建 LVM 类型的存储池。例如,以下命令创建名为 guest_images_lvm 的存储池,该池使用 lvm_vg 卷组,并挂载在 /dev/lvm_vg 目录上:

    # virsh pool-define-as guest_images_lvm logical --source-name lvm_vg --target /dev/lvm_vg
    Pool guest_images_lvm defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看基于 LVM 的存储池参数

  2. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_lvm
      Pool guest_images_lvm started
    注意

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

  4. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_lvm
      Pool guest_images_lvm marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_lvm
      Name:           guest_images_lvm
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB

14.2.7. 使用 CLI 创建基于 NFS 的存储池

如果要在网络文件系统(NFS)服务器上拥有一个存储池,您可以使用 virsh 工具来创建基于 NFS 的存储池。

先决条件

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

    # virsh pool-capabilities | grep "<value>nfs</value>"

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

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令来定义和创建 NFS 类型的存储池。例如,要创建一个名为 guest_images_netfs 的存储池,它使用 IP 为 111.222.111.222 的 NFS 服务器,使用目标目录 /var/lib/libvirt/images/nfspool 挂载在服务器目录 /home/net_mount 上:

    # virsh pool-define-as --name guest_images_netfs --type netfs --source-host='111.222.111.222' --source-path='/home/net_mount' --source-format='nfs' --target='/var/lib/libvirt/images/nfspool'

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看基于 NFS 的存储池参数

  2. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_netfs
      Pool guest_images_netfs started
    注意

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

  4. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_netfs
      Pool guest_images_netfs marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_netfs
      Name:           guest_images_netfs
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB

14.2.8. 使用 CLI 创建带有 vHBA 设备的基于 SCSI 的存储池

如果要在小型计算机系统接口(SCSI)设备上有一个存储池,您的主机必须能够使用虚拟主机总线适配器(vHBA)连接到 SCSI 设备。然后,您可以使用 virsh 工具来创建基于 SCSI 的存储池。

先决条件

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

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

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

  • 在使用 vHBA 设备创建基于 SCSI 的存储池前,先创建一个 vHBA。如需更多信息,请参阅 创建 vHBA

流程

  1. 创建存储池

    使用 virsh pool-define-as 命令定义并创建使用 vHBA 的 SCSI 存储池。例如,以下命令会创建一个名为 guest_images_vhba 的存储池,它使用由 scsi_host3 父适配器识别的 vHBA、全球范围的端口号 5001a4ace3ee047d,以及全球范围的节点号 5001a4a93526d0a1。存储池挂载在 /dev/disk/ 目录上:

    # virsh pool-define-as guest_images_vhba scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/
    Pool guest_images_vhba defined

    如果您已经有要创建的存储池的 XML 配置,也可以根据 XML 定义池。详情请查看使用 vHBA 设备 的基于 SCSI 的存储池的参数

  2. 验证是否已创建池

    使用 virsh pool-list 命令来验证池是否已被创建。

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

    使用 virsh pool-start 命令来挂载存储池。

    # virsh pool-start guest_images_vhba
      Pool guest_images_vhba started
    注意

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

  4. [可选]自动启动过程

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

    # virsh pool-autostart guest_images_vhba
      Pool guest_images_vhba marked as autostarted

验证

  • 使用 virsh pool-info 命令来验证存储池是否处于 running 状态。检查报告的大小是否与预期一样,以及是否正确配置了自动启动。

    # virsh pool-info guest_images_vhba
      Name:           guest_images_vhba
      UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
      State:          running
      Persistent:     yes
      Autostart:      yes
      Capacity:       458.39 GB
      Allocation:     197.91 MB
      Available:      458.20 GB

14.2.9. 使用 CLI 删除存储池

要从主机系统中删除存储池,您必须停止池,并删除其 XML 定义。

流程

  1. 使用 virsh pool-list 命令列出定义的存储池。

    # virsh pool-list --all
    Name                 State      Autostart
    -------------------------------------------
    default              active     yes
    Downloads            active     yes
    RHEL-Storage-Pool   active     yes
  2. 使用 virsh pool-destroy 命令停止您要删除的存储池。

    # virsh pool-destroy Downloads
    Pool Downloads destroyed
  3. 可选 :对于某些类型的存储池,您可以使用 virsh pool-delete 命令删除存储池所在的目录。请注意,为此,目录必须为空。

    # virsh pool-delete Downloads
    Pool Downloads deleted
  4. 使用 virsh pool-undefine 命令删除存储池的定义。

    # virsh pool-undefine Downloads
    Pool Downloads has been undefined

验证

  • 确认删除了存储池。

    # virsh pool-list --all
    Name                 State      Autostart
    -------------------------------------------
    default              active     yes
    rhel-Storage-Pool   active     yes