第 14 章 为虚拟机管理存储

虚拟机(VM)与物理机一样,需要用于数据、程序和系统文件的存储。作为虚拟机管理员,您可以将物理或基于网络的存储分配给虚拟机作为虚拟存储。您还可以修改存储是如何呈现给虚拟机的,无论底层硬件是什么。

以下小节提供有关不同类型的虚拟机存储、它们是如何工作的,以及如何使用 CLI 或 Web 控制台管理它们的信息。

14.1. 了解虚拟机存储

如果您对虚拟机(VM)存储不熟悉,或者不确定它是如何工作的,以下章节提供了有关虚拟机存储各个组件的概括介绍、它是如何工作的、管理基础知识以及红帽提供的支持的解决方案。

您可以找到以下相关信息:

14.1.1. 存储池简介

存储池是由 libvirt 管理的文件、目录或存储设备,来为虚拟机(VM)提供存储。您可以将存储池划分为存储卷,用于存储虚拟机镜像或作为额外存储附加到虚拟机。

此外,多个虚拟机可以共享相同的存储池,从而更好地分配存储资源。

  • 存储池可以是持久的或临时的:

    • 主机系统重启后,持久性存储池会保留下来。您可以使用 virsh pool-define 来创建持久性存储池。
    • 临时存储池仅在主机重启前存在。您可以使用 virsh pool-create 命令来创建临时性存储池。

存储池存储类型

存储池可以是本地的也可以基于网络的(共享):

  • 本地存储池

    本地存储池直接附加到主机服务器。它们包括本地设备中的本地目录、直接附加磁盘、物理分区以及逻辑卷管理(LVM)卷组。

    本地存储池可用于开发、测试,以及不需要迁移或有大量虚拟机的小型部署。

  • 网络(共享)存储池

    网络存储池包括使用标准协议在网络上共享的存储设备。

14.1.2. 存储卷简介

存储池划分为 存储卷。存储卷是物理分区、LVM 逻辑卷、基于文件的磁盘映像,以及由 libvirt 处理的其他存储类型的抽象。无论底层硬件是什么,存储卷都以本地存储设备(如磁盘)的形式出现在虚拟机中。

在主机上,存储卷通过其名称以及从中派生的存储池的标识符来引用。在 virsh 命令行上,它采用 --pool storage_pool volume_name 的形式。

例如:要在 guest_images 池中显示名为 firstimage 的卷信息。

# virsh vol-info --pool guest_images firstimage
  Name:             firstimage
  Type:             block
  Capacity:         20.00 GB
  Allocation:       20.00 GB

14.1.3. 使用 libvirt 进行存储管理

通过使用 libvirt 远程协议,您可以管理虚拟机存储的所有方面。这些操作也可以在远程主机上执行。因此,使用 libvirt 的管理应用程序(如 RHEL web 控制台)可用来执行配置虚拟机存储的所有所需的任务。

您可以使用 libvirt API 来查询存储池中卷的列表,或者获取有关该存储池中容量、分配和可用存储的信息。对于支持它的存储池,您还可以使用 libvirt API 来创建、克隆、调整大小和删除存储卷。另外,您可以使用 libvirt API 来上传数据到存储卷,从存储卷下载数据,或者从存储卷中删除数据。

14.1.4. 存储管理概述

为了说明用于管理存储的可用选项,以下示例介绍了使用 mount -t nfs nfs.example.com:/path/to/share /path/to/data 的 NFS 服务器的一个示例。

作为存储管理员:

  • 您可以在虚拟化主机上定义 NFS 存储池来描述导出的服务器路径和客户端目标路径。因此,libvirt 可以在 libvirt 启动时自动挂载存储,或者在 libvirt 运行时根据需要自动挂载存储。
  • 您可以根据名称简单地将存储池和存储卷添加到虚拟机。您不需要添加卷的目标路径。因此,即使目标客户端路径有变化,也不会影响虚拟机。
  • 您可以将存储池配置为自动启动。执行此操作时,libvirt 会在libvirt 启动时自动将 NFS 共享磁盘挂载到指定的目录上。libvirt 将共享挂载到指定的目录上,类似于命令 mount nfs.example.com:/path/to/share /vmdata
  • 您可以使用 libvirt API 查询存储卷路径。这些存储卷基本上是 NFS 共享磁盘中的文件。然后,您可以将这些路径复制到虚拟机 XML 定义中的 部分,该定义描述了虚拟机块设备的源存储。
  • 对于 NFS,您可以使用一个使用 libvirt API 的应用程序来在存储池中创建和删除存储卷(NFS 共享中的文件),不超过池大小的限制(共享的存储容量)。

    请注意,并非所有存储池类型都支持创建和删除卷。

  • 当不再需要时,您可以停止存储池。停止存储池(pool-destroy) 可撤销启动操作,在这种情况下,即卸载 NFS 共享。销毁操作不会修改共享中的数据,即使该命令的名称看似象要删除。如需更多信息,请参阅 man virsh

14.1.5. 支持和不支持的存储池类型

支持的存储池类型

以下是 RHEL 支持的存储池类型列表:

  • 基于目录的存储池
  • 基于磁盘的存储池
  • 基于分区的存储池
  • 基于 iSCSI 的存储池
  • 基于 LVM 的存储池
  • 基于 NFS 的存储池
  • 使用 vHBA 设备基于 SCSI 的存储池
  • 基于多路径的存储池
  • 基于 RBD 的存储池

不支持的存储池类型

以下是 RHEL 不支持的 libvirt 存储池类型的列表:

  • 基于 Sheepdog 的存储池
  • 基于 Vstorage 的存储池
  • 基于 ZFS 的存储池
  • iscsi-direct 存储池
  • glusterfs 存储池