Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第 12 章 存储池

本章包含创建分类类型的存储池的说明。存储池是 管理员设置的存储数量(通常是专用存储管理员)供虚拟机使用。存储池通常由存储管理员或系统管理员划分到存储卷,卷则作为块设备分配给客户机虚拟机。

例 12.1. NFS 存储池

假设负责 NFS 服务器的存储管理员创建了共享来存储客户机虚拟机的数据。系统管理员将在主机物理计算机上定义具有共享详细信息的池(nfs.example.com:/path/to/share should mounted on /vm_data)。当池启动时,libvirt 将共享挂载到指定目录中,就像系统管理员登录并执行 nfs.example.com:/path/to/share /vmdata 一样。如果池配置为自动启动,libvirt 可确保 NFS 共享挂载到 libvirt 启动时指定的目录中。
池启动后,NFS 共享的文件会被报告为卷,然后使用 libvirt API 查询存储卷的路径。然后可将卷的路径复制到客户机虚拟机 XML 定义文件的部分,该文件描述了客户机虚拟机块设备的源存储。使用 NFS 时,使用 libvirt API 的应用程序可以在池中创建和删除卷(NFS 共享中的文件)到池大小的限制(共享的最大存储容量)。并非所有池类型都支持创建和删除卷。在这种情况下,停止池需要启动操作,卸载 NFS 共享。销毁操作不会修改共享中的数据,尽管名称也是如此。详情请查看 man virsh。
注意
正确操作客户机虚拟机不需要存储池和卷。池和卷为 libvirt 提供了一种方式,可确保特定的存储可供虚拟机使用,但有些管理员更喜欢管理自己的存储和客户机虚拟机,无需定义的任何池或卷即可正确运行。在不使用池的系统上,系统管理员必须确保 guest 虚拟机存储的可用性使用自己喜欢的任何工具(例如,将 NFS 共享添加到主机物理计算机的 fstab 中),以便在启动时挂载共享。
警告
在客户机上创建存储池时,请务必遵循安全性注意事项。Red Hat Enterprise Linux 虚拟化安全指南 中会更加详细地探讨此信息,网址为: https://access.redhat.com/site/documentation/

12.1. 基于磁盘的存储池

本节介绍为客户机虚拟机创建基于磁盘存储设备。
警告
不应该向客户机授予对整个磁盘或块设备的写入权限(例如: /dev/sdb)。使用分区(例如 /dev/sdb1)或 LVM 卷。
如果您将整个块设备传递给客户机,客户机可能会对其分区或者创建自己的 LVM 组。这可能导致主机物理机器检测到这些分区或 LVM 组并导致错误。

12.1.1. 使用 virsh 创建基于磁盘的存储池

这个过程使用 virsh 命令的磁盘设备创建新存储池。
警告
将磁盘专用于存储池将重新格式化并清除在磁盘设备上存储的所有数据。强烈建议您在以以下步骤开始前备份存储设备。
  1. 在磁盘上创建 GPT 磁盘标签

    磁盘必须使用 GUID 分区表 (GPT)磁盘标签重新标记。GPT 磁盘标签允许在每个设备中创建大量分区(最多 128 个分区)。GPT 分区表可以存储比 MS-DOS 分区表更多的分区数据。
    # parted /dev/sdb
    GNU Parted 2.1
    Using /dev/sdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) mklabel
    New disk label type? gpt
    (parted) quit
    Information: You may need to update /etc/fstab.
    #
    
  2. 创建存储池配置文件

    创建包含新设备所需的存储池信息的临时 XML 文本文件。
    该文件必须采用如下所示的格式,并包含以下字段:
    <name>guest_images_disk</name>
    name 参数决定存储池的名称。本例在示例中使用名称 guest_images_disk
    <device path='/dev/sdb'/>
    带有 device 属性的 path 参数指定存储设备的设备路径。这个示例使用 /dev/sdb 设备。
    <target> <path>/dev</path></target>
    带有 target 子参数的文件系统 path 参数决定主机物理机器文件系统中的位置,以附加使用此存储池创建的卷。
    例如:sdb1、sdb2、sdb3。使用 /dev/,如以下示例所示,从这个存储池创建的卷可以作为 /dev /sdb1、/dev/sdb2、/ dev/sdb3 进行访问。
    <format type='gpt'/>
    format 参数指定分区表类型。这个示例使用以下示例中的 gpt 与上一步中创建的 GPT 磁盘标签类型匹配。
    使用文本编辑器为存储池设备创建 XML 文件。

    例 12.2. 基于磁盘的存储设备存储池

    <pool type='disk'>
      <name>guest_images_disk</name>
      <source>
        <device path='/dev/sdb'/>
        <format type='gpt'/>
      </source>
      <target>
        <path>/dev</path>
      </target>
    </pool>
    
  3. 附加该设备

    使用 virsh pool-define 命令和上一步中创建的 XML 配置文件添加存储池定义。
    # virsh pool-define ~/guest_images_disk.xml
    Pool guest_images_disk defined from /root/guest_images_disk.xml
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    inactive   no
    
  4. 启动存储池

    使用 virsh pool-start 命令启动存储池。验证已使用 virsh pool-list --all 命令启动池。
    # virsh pool-start guest_images_disk
    Pool guest_images_disk started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    active     no
    
  5. 打开自动启动

    为存储池打开 autostart。autostart 将 libvirtd 服务配置为在服务启动时启动存储池。
    # virsh pool-autostart guest_images_disk
    Pool guest_images_disk marked as autostarted
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    active     yes
    
  6. 验证存储池配置

    验证存储池是否已正确创建,报告的大小是否正确,以及状态报告 正在运行
    # virsh pool-info guest_images_disk
    Name:           guest_images_disk
    UUID:           551a67c8-5f2a-012c-3844-df29b167431c
    State:          running
    Capacity:       465.76 GB
    Allocation:     0.00
    Available:      465.76 GB
    # ls -la /dev/sdb
    brw-rw----. 1 root disk 8, 16 May 30 14:08 /dev/sdb
    # virsh vol-list guest_images_disk
    Name                 Path
    -----------------------------------------
    
  7. 可选:删除临时配置文件

    如果不需要,请删除临时存储池 XML 配置文件。
    # rm ~/guest_images_disk.xml
基于磁盘的存储池现在可用。

12.1.2. 使用 virsh 删除存储池

以下命令演示了如何使用 virsh 删除存储池:
  1. 为了避免同一池的其他客户机虚拟机出现任何问题,最好停止存储池并释放其使用中的任何资源。
    # virsh pool-destroy guest_images_disk
  2. 删除存储池的定义
    # virsh pool-undefine guest_images_disk