第 15 章 为虚拟机管理存储
虚拟机(VM)与物理机一样,需要用于数据、程序和系统文件的存储。作为虚拟机管理员,您可以将物理或基于网络的存储分配给虚拟机作为虚拟存储。您还可以修改存储是如何呈现给虚拟机的,无论底层硬件是什么。
以下小节提供有关不同类型的虚拟机存储、它们是如何工作的,以及如何使用 CLI 或 Web 控制台管理它们的信息。
15.1. 了解虚拟机存储
如果您对虚拟机(VM)存储不熟悉,或者不确定它是如何工作的,以下章节提供了有关虚拟机存储各个组件的概括介绍、它是如何工作的、管理基础知识以及红帽提供的支持的解决方案。
您可以找到以下相关信息:
15.1.1. 存储池简介
存储池是由 libvirt
管理的文件、目录或存储设备,来为虚拟机(VM)提供存储。您可以将存储池划分为存储卷,用于存储虚拟机镜像或作为额外存储附加到虚拟机。
此外,多个虚拟机可以共享同一个存储池,从而更好地分配存储资源。
存储池可以是持久的或临时的:
-
主机系统重启后,持久性存储池会保留下来。您可以使用
virsh pool-define
来创建持久性存储池。 -
临时存储池仅在主机重启前存在。您可以使用
virsh pool-create
命令来创建临时性存储池。
存储池可以是本地的也可以基于网络的(共享):
本地存储池
本地存储池直接附加到主机服务器。它们包括本地设备上的本地目录、直接附加磁盘、物理分区和逻辑卷管理器(LVM)卷组。
本地存储池可用于开发、测试,以及不需要迁移或有大量虚拟机的小型部署。
网络(共享)存储池
网络存储池包括使用标准协议在网络上共享的存储设备。
15.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
15.1.3. 使用 libvirt 进行存储管理
通过使用 libvirt
远程协议,您可以管理虚拟机存储的所有方面。这些操作也可以在远程主机上执行。因此,使用 libvirt
的管理应用程序(如 RHEL web 控制台)可用来执行配置虚拟机存储的所有所需的任务。
您可以使用 libvirt
API 来查询存储池中卷的列表,或者获取有关该存储池中容量、分配和可用存储的信息。对于支持它的存储池,您还可以使用 libvirt
API 来创建、克隆、调整大小和删除存储卷。另外,您可以使用 libvirt
API 来上传数据到存储卷,从存储卷下载数据,或者从存储卷中删除数据。
15.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
。
15.1.5. 支持和不支持的存储池类型
支持的存储池类型
以下是 RHEL 支持的存储池类型列表:
- 基于目录的存储池
- 基于磁盘的存储池
- 基于分区的存储池
- 基于 iSCSI 的存储池
- 基于 LVM 的存储池
- 基于 NFS 的存储池
- 使用 vHBA 设备基于 SCSI 的存储池
- 基于多路径的存储池
- 基于 RBD 的存储池
不支持的存储池类型
以下是 RHEL 不支持的 libvirt
存储池类型的列表:
- 基于 Sheepdog 的存储池
- 基于 Vstorage 的存储池
- 基于 ZFS 的存储池
- iscsi-direct 存储池
- glusterfs 存储池