存储池是一种可以简化kvm存储管理的方法,它可以把服务器本地的,或者远程nfs,分布式文件系统,硬盘等组织在一起,来方便对于kvm环境下存储的管理。
存储池可以把多块硬盘资源池化使用,Libvirt可以以存储池的形式对存储进行统一管理,简化操作。

对虚拟机操作来说,存储池和卷不是必须的,管理员保证配置正确和连接即可。

目前我的环境有三个存储池

kvm 创建存储卷 kvm存储池类型_目标路径


找到它们的配置文档

kvm 创建存储卷 kvm存储池类型_kvm_02


里面有一些参数,但是不建议直接改动XML,通过virsh pool-edit iso改动不会出异常。

kvm 创建存储卷 kvm存储池类型_重启_03

virsh pool-edit iso

发现就是打开了一个vi

kvm 创建存储卷 kvm存储池类型_目标路径_04


过一下存储池的操作

pool-list

kvm 创建存储卷 kvm存储池类型_存储管理_05

pool-info

kvm 创建存储卷 kvm存储池类型_存储管理_06

基于目录的存储池

准备一个目录,设置目录权限,配置目录的SELinux上下文,隔离虚拟机与虚拟机的操作。

kvm 创建存储卷 kvm存储池类型_目标路径_07

semanage fcontext -a -t virt_image_t '/guest_images(/.*)?'

因为/guest_images这个目录是手工建立的,并不是系统默认目录,所以并没有默认安全上下文,需要我们手工设定。
这条命令会给/guest_images目录及目录下的所有内容设定默认安全上下文类型是virt_image_t
创建存储池也有两种方法:

通过virt-manager创建存储池

kvm 创建存储卷 kvm存储池类型_重启_08


目标路径选择刚才的/guest_images

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_09


删除池的时候必须先停止池,加号右边有圆点停止,然后最右边delete,删掉这个池。

通过virsh创建存储池
virsh pool-define as guest_images dir --target "/guest_images"

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_10


启动起来

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_11


设置自动启用

virsh pool-autostart guest_images

kvm 创建存储卷 kvm存储池类型_kvm_12


kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_13


这就是通过virsh来创建存储池

同样,删除池需要先停止池

virsh pool-destroy guest_images
virsh pool-delete guest_images

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_14

但是配置文件依然存在,所有要用undefine来清除

virsh pool-undefine guest_images

kvm 创建存储卷 kvm存储池类型_目标路径_15

基于分区的存储池

libvirtd会自动mount分区

首先先给KVM1添加一块40G新硬盘

kvm 创建存储卷 kvm存储池类型_存储管理_16


打开kvm1,分区,文件系统

fdisk /dev/sdc
mkfs.ext4  /dev/sdc1

然后通过virt-manager创建一个新的存储池,选择fs类型

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_17


源路径就是刚才的分区,目标路径可以理解为mount点,我的目录下现在是没有/guest_images_fs

kvm 创建存储卷 kvm存储池类型_kvm_18


但是可以看到已经自动给mount了,如果重启,也会自动mount

kvm 创建存储卷 kvm存储池类型_重启_19

实验:
如果这时在/guest_images_fs下新建一个文件,关掉libvirtd服务,
然后umount /guest_images_fs,此时/guest_images_fs下的文件已经无法访问。
这时再开启libvirtd服务,/guest_images_fs又可以访问了。

清空实验环境,删除掉存储池guest_images_fs

virsh的操作

kvm 创建存储卷 kvm存储池类型_重启_20


如果直接start会提示mount点不存在

kvm 创建存储卷 kvm存储池类型_重启_21


解决方法是先build池

virsh pool-build guest_imagesfs

然后就可以用了,清除实验环境。destroy,delete,undefine。

基于磁盘的存储池

先删除刚才sdc1的分区,fdisk /dev/sdc ,d是删除命令

然后仿照生产环境使用2T以上的磁盘,fdisk已经没法处理2T以上的分区了,换parted更改类型,用mklabel改成gpt

kvm 创建存储卷 kvm存储池类型_kvm_22


然后新建一个sdc.xml文件,标注好参数

kvm 创建存储卷 kvm存储池类型_kvm_23

virsh pool-define /tmp/sdc.xml

创建池完成,删除的时候发现不支持删除池,undefine就好。

kvm 创建存储卷 kvm存储池类型_目标路径_24

基于LVM的存储池

fdisk /dev/sdc

新建一个分区,格式改成LVM

因为有gpt盘,这里不太一样

kvm 创建存储卷 kvm存储池类型_存储管理_25


原来编号是8e,现在改成31,w写入后完成分区

用现有的vg创建池

pvcreate /dev/sdc1
vgcreate guest_lvm /dev/sdc1

打开virt-manager

kvm 创建存储卷 kvm存储池类型_存储管理_26


由于用的是现有的vg,这里不需要build池,把刚才创建的guest_lvm写上去

kvm 创建存储卷 kvm存储池类型_kvm_27


这样就建好了一个LVM的存储池

清除实验环境

删除池,vg,pv,分区

vgremove guest_lvm
pvremove /dev/sdc1
fdisk /dev/sdc
d
w

下面通过virt-manager来添加一个lvm池

kvm 创建存储卷 kvm存储池类型_目标路径_28


kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_29


出现报错

kvm 创建存储卷 kvm存储池类型_目标路径_30


估计是gpt不太支持。这里卡住,以后再解决。

命令行无影响

kvm 创建存储卷 kvm存储池类型_kvm 创建存储卷_31