KVM虚拟化:(九)存储配置简介

admin 2022年11月04日 909次浏览

1、简介

1.1、存储池

存储池是由 libvirt 管理的文件、目录或存储设备,用于为虚拟机提供存储。可以将存储池分为多个存储卷,用于存储虚拟机镜像或作为额外存储附加到虚拟机。多个虚拟机可以共享同一个存储池,从而更好地分配存储资源

存储池可以是持久的或临时的,使用 virsh pool-define 创建持久性存储池,主机系统重启后,持久性存储池会保留下来;使用 virsh pool-create 命令创建临时存储池,临时存储池在主机重启销毁

  • 存储池存储类型

    • 本地存储池

      本地存储池直接附加到主机服务器,包括本地设备中的本地目录、直接附加磁盘、物理分区以及逻辑卷管理(LVM)卷组,本地存储池对不需要迁移或具有大量虚拟机的部署非常有用

    • 共享存储池

      联网的存储池包括使用标准协议通过网络共享的存储设备

1.2、存储卷

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

在主机机器中,存储卷的名称由其名称和存储池的标识符来引用,例如查看某个卷的信息

[root@kvm ~]# virsh vol-info --pool vmhost --vol omv6.qcow2
名称:       omv6.qcow2
类型:       文件
容量:       20.00 GiB
分配:       4.63 GiB

1.3、使用 libvirt 进行存储管理

可以使用 libvirt 的管理应用程序来执行虚拟机存储所需的所有任务,可以使用 libvirt API 查询存储池中的卷列表,或者获取有关该存储池中容量、分配和可用存储的信息

对于支持它的存储池,还可以使用 libvirt API 创建、克隆、调整大小和删除存储卷。另外,可以使用 libvirt API 将数据上传到存储卷,从存储卷下载数据,或者从存储卷中擦除数据

1.4、RHEL9支持和不支持的存储池类型

1.4.1、支持的存储类型

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

1.4.2、不支持的存储类型

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

2、管理存储池

2.1、查看存储池信息

[root@kvm ~]# virsh pool-list --all --details
 名称                         状态     自动开始   持久   容量         分配        可用
----------------------------------------------------------------------------------------------
 iso-1                        运行     是         是     457.38 GiB   68.91 GiB   388.46 GiB
 vdisk-1                      运行     是         是     457.38 GiB   68.91 GiB   388.46 GiB
 vmhost                       运行     是         是     384.90 GiB   78.53 GiB   306.37 GiB

2.2、创建基于目录的存储池

基于目录的存储池是基于现有挂载的文件系统中的目录而创建

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

    [root@kvm ~]# virsh pool-capabilities | grep "'dir' supported='yes'"
      <pool type='dir' supported='yes'>
    
  • 创建存储池

    使用 virsh pool-define-as <name> <type> --target <string> 创建目录存储池

    name:存储池名称

    type:存储池类型

    –target:基本存储的目标(存储路径)

    [root@kvm ~]# virsh pool-define-as test-pool dir --target "/data/test-pool"
    定义池 test-pool
    
  • 创建存储池目标路径

    [root@kvm ~]# virsh pool-build --pool test-pool
    构建池 test-pool
    
  • 查看创建的存储池

    [root@kvm ~]# ls -lah /data/
    drwx--x--x.  2 root root 4.0K  6月  6 16:47 test-pool
    
    [root@kvm ~]# virsh pool-list --all
     名称                         状态     自动开始
    -------------------------------------------------
     test-pool                    活动     否
    
  • 启动存储池

    # 启动存储池
    [root@kvm ~]# virsh pool-start test-pool
    
    # 自动启动存储池
    [root@kvm ~]# virsh pool-autostart test-pool
    
  • 查看存储池信息

    [root@kvm ~]# virsh pool-info test-pool
    名称:       test-pool
    UUID:           3ef05431-2f42-49b6-95f1-c96419f21720
    状态:       运行
    持久:       是
    自动启动: 否
    容量:       384.90 GiB
    分配:       78.54 GiB
    可用:       306.37 GiB
    
  • 创建目录存储池XML文件

    <pool type='dir'>
      <name>vmhost</name>
      <target>
        <path>/data/vmhost</path>
      </target>
    </pool>
    

2.3、创建基于硬盘的存储池

在基于磁盘的存储池中,存储池基于磁盘分区,可以让整个磁盘分区为某个虚拟机(VM)做专用存储

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

    [root@kvm ~]# virsh pool-capabilities | grep "'disk' supported='yes'"
      <pool type='disk' supported='yes'>
    
  • 准备一个用于基础存储池的设备(硬盘),如果需要将整个块设备用于存储池,建议防止设备中的所有重要分区被 GRUB 的 os-prober 功能保护

    [root@kvm ~]# vim /etc/default/grub
    GRUB_DISABLE_OS_PROBER=true
    GRUB_OS_PROBER_SKIP_LIST="/dev/sda1"
    
  • 创建存储池前备份所选存储设备中的所有数据,在存储池中指定一个磁盘可能会重新格式化并清除当前存储在磁盘设备上的所有数据

  • 创建存储池

    [root@kvm ~]# virsh pool-define-as test-pool-disk disk --source-format=gpt --source-dev=/dev/sda --target /dev
    定义池 test-pool-disk
    
  • 创建存储池目标路径

    [root@kvm ~]# virsh pool-build test-pool-disk --overwrite
    构建池 test-pool-disk
    

    如果目标硬盘存在分区表,就需要使用 –overwrite 强制覆盖,否则会创建失败

  • 验证存储池是否创建成功

    [root@kvm ~]# virsh pool-list
     名称                         状态   自动开始
    -----------------------------------------------
     test-pool-disk               活动   否
    
  • 启动存储池

    [root@kvm ~]# virsh pool-start --pool test-pool-disk
    
  • 查看存储池信息

    [root@kvm ~]# virsh pool-info test-pool-disk
    名称:       test-pool-disk
    UUID:           a1297a48-d5f3-4949-8e2d-ced1f0369ff6
    状态:       运行
    持久:       是
    自动启动:    否
    容量:       149.05 GiB
    分配:       0.00 B
    可用:       149.05 GiB
    
  • 创建硬盘存储池XML文件

    <pool type='disk'>
    <name>disk-pool</name>
    <source>
    <device path='/dev/sdb'/>
    <format type='gpt'/>
    </source>
    <target>
    <path>/dev</path>
    </target>
    </pool>
    

2.4、创建基于iSCSI的存储池

互联网小型计算机系统接口(iSCSI)是一种基于 IP 的存储网络标准,用于连接数据存储设施

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

    [root@kvm ~]#  virsh pool-capabilities | grep "'iscsi' supported='yes'"
      <pool type='iscsi' supported='yes'>
    
  • 创建存储池

    [root@kvm ~]# virsh pool-define-as \
    --name test-pool-iscsi \
    --type iscsi \
    --source-host 192.168.10.200 \
    --source-dev iqn.2023-06.local.omv6:test-pool-50gb \
    --target /dev/disk/by-path
    
    定义池 test-pool-iscsi
    
  • 验证存储池创建

    [root@kvm ~]# virsh pool-list --all
     名称                         状态     自动开始
    -------------------------------------------------
     test-pool-iscsi              不活跃   否
     vdisk-1                      活动     是
    
  • 启动存储池

    [root@kvm ~]# virsh pool-start test-pool-iscsi
    池 test-pool-iscsi 已启动
    
  • 查看存储池信息

    [root@kvm ~]# virsh pool-info test-pool-iscsi
    名称:       test-pool-iscsi
    UUID:       4566753c-5e3e-4976-8ecd-95a6e59dbc4a
    状态:       运行
    持久:       是
    自动启动:   否
    容量:       95.00 GiB
    分配:       95.00 GiB
    可用:       0.00 B
    
  • 创建iSCSI存储池XML文件

    <pool type='iscsi'>
      <name>test-pool-iscsi</name>
      <source>
        <host name='192.168.1.20' port='3260'/>
        <device path='iqn.2023-06.local.omv:test-pool-50gb'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
    

2.5、删除存储池

  • 查看存储池

    [root@kvm ~]# virsh pool-list
     名称                         状态   自动开始
    -----------------------------------------------
     test-pool-disk               活动   否
     vdisk-1                      活动   是
    
  • 停止存储池

    [root@kvm ~]# virsh pool-destroy test-pool-disk
    销毁池 test-pool-disk
    
  • 删除存储池定义

    [root@kvm ~]# virsh pool-undefine test-pool-disk
    池 test-pool-disk 已经被取消定义
    
  • 确认是否删除成功

    [root@kvm ~]# virsh pool-list --all
     名称                         状态     自动开始
    -------------------------------------------------
     vdisk-1                      活动     是
    

3、管理存储卷

3.1、查看存储卷信息

  • 查看存储池中的存储卷信息

    [root@kvm ~]# virsh vol-list --pool vmhost --details
     名称              路径                           类型   容量         分配
    ---------------------------------------------------------------------------------
     omv6.qcow2        /data/vmhost/omv6.qcow2        文件   20.00 GiB    4.75 GiB
     rocky9.qcow2      /data/vmhost/rocky9.qcow2      文件   50.00 GiB    10.12 GiB
     windows10.qcow2   /data/vmhost/windows10.qcow2   文件   100.00 GiB   42.80 GiB
     windows11.qcow2   /data/vmhost/windows11.qcow2   文件   100.00 GiB   22.23 GiB
    
  • 查看指定存储卷信息

    [root@kvm ~]# virsh  vol-info --pool vmhost --vol omv6.qcow2
    名称:       omv6.qcow2
    类型:       文件
    容量:       20.00 GiB
    分配:       4.75 GiB
    

3.2、创建并分配存储卷

  • 创建存储卷

    [root@kvm ~]# virsh vol-create-as --pool vmhost --name test-disk-10gb --capacity 10gb --format qcow2
    卷 test-disk-10gb 创建了
    
  • 创建存储卷XML文件

    [root@kvm ~]# vim /etc/libvirt/qemu/test-disk-10gb.xml
    <disk type='volume' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source pool='vmhost' volume='test-disk-10gb'/>
    <target dev='sdc' bus='virtio'/>
    </disk>
    
  • 分配存储卷给虚拟机

    [root@kvm ~]# virsh attach-device --config windows10 /etc/libvirt/qemu/test-disk-10gb.xml
    成功附加设备
    

3.3、删除卷

  • 查看存储池中的卷

    [root@kvm ~]# virsh vol-list vmhost
     名称              路径
    -------------------------------------------------
     omv6.qcow2        /data/vmhost/omv6.qcow2
     rocky9.qcow2      /data/vmhost/rocky9.qcow2
     test-disk-10gb    /data/vmhost/test-disk-10gb
    
  • 从虚拟机分离存储卷

    [root@kvm ~]# virsh detach-device --domain windows10 --config /etc/libvirt/qemu/test-disk-10gb.xml
    成功分离设备
    

    存储卷分离成功后,需要关闭计算机,存储卷才能完全从虚拟机中脱离

  • 删除存储卷

    [root@kvm ~]# virt-manager
    [root@kvm ~]# virsh vol-delete --pool vmhost --vol test-disk-10gb
    卷 test-disk-10gb 被删除
    
    [root@kvm ~]# virsh vol-list --pool vmhost
     名称              路径
    -------------------------------------------------
     omv6.qcow2        /data/vmhost/omv6.qcow2
     rocky9.qcow2      /data/vmhost/rocky9.qcow2