libvirt ZFS存储池
Arch Linux 的 X86_64
架构对 ZFS 和 Stratis - Linux存储系统 都有良好支持,所以我计划:
在MacBook Pro 2013笔记本上同时采用这两种存储技术来构建
libvit
存储后端在 私有云架构 上利用3块旧的HDD构建ZFS扩展
libvit
存储后端 (感觉性能会比较差,所以考虑这个ZFS存储作为离线数据存储)在 私有云架构 使用购买的二手SSD磁盘 SanDisk CloudSpeed Eco Gen. II SATA SSD企业级固态硬盘 构建ZFS存储池提供虚拟机集群模拟
备注
libvirt ZFS存储池 非常类似 libvirt LVM卷管理存储池 ,基于卷来管理虚拟机的存储分配和隔离,是适合大型云计算的基础存储方案。虽然没有 Libvirt集成Ceph RBD 方案提供了分布式存储的容灾和高可用,但是非常适合构建低成本 spot vm 的存储。通过 ZFS 强大的海量存储管理能力,精简掉RAID功能,使用基础的卷管理能力来实现。
准备工作
SSD磁盘 SanDisk CloudSpeed Eco Gen. II SATA SSD企业级固态硬盘 已经在 ZFS快速起步(zcloud) 已经构建了一个基础ZFS pool
zpool-data
:
sda
上创建ZFS的存储池,名字为 zpool-data
zpool create zpool-data sda
# 设置了从zpool的根开始激活压缩
zfs set compression=lz4 zpool-data
检查 zpool list
输出如下:
zpool list
检查现有的zpool存储池 可以看到刚创建的 zpool-data
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
zpool-data 1.73T 456K 1.73T - - 0% 0% 1.00x ONLINE -
当前
zcloud
上构建的 Libvirt虚拟机管理器 存储:
virsh pool-list
查看当前系统已经具备的 libvirt 存储池 Name State Autostart
------------------------------------
boot-scratch active yes
images active yes
images_lvm active yes
images_rbd active yes
nvram active yes
其中:
images
是默认本地磁盘存储池/var/lib/libvirt/images
目录
images_lvm
是 libvirt LVM卷管理存储池
images_rbd
是 Libvirt集成Ceph RBD
接下来我们创建一个ZFS存储池 images_zfs
在 Ubuntu Linux 平台,需要安装 libvirt 的 ZFS 存储驱动软件包:
apt install libvirt-daemon-driver-storage-zfs
ZFS存储池定义
对于已经存在的 ZFS 存储池
zpool-data
需要定义为libvirt的存储池:
zpool-data
存储池作为libvirt的存储池virsh pool-define-as --name images_zfs --source-name zpool-data --type zfs
遇到报错显示没有zfs存储池后端:
zpool-data
存储池作为libvirt的存储池报错,显示没有zfs后端error: Failed to define pool images_zfs
error: internal error: missing backend for pool type 12 (zfs)
这是因为没有安装上文所说的 libvirt 的 ZFS 存储驱动软件包 libvirt-daemon-driver-storage-zfs
,此外,安装了这个libvirt的ZFS驱动之后,一定要重新启动一次 libvirtd
服务,否则也会报上述错误。
如果一切正常,则会看到输出
zpool-data
存储池作为libvirt的存储池的成功输出信息Pool images_zfs defined
备注
我发现重启一次 libvirtd
服务,会出现 Libvirt集成Ceph RBD 的存储池 images_rbd
处于 inactive
状态,需要手工激活一次
设置libvirt的ZFS存储池自动启动,并激活:
virsh pool-autostart images_zfs
virsh pool-start images_zfs
完成后检查 virsh pool-list
输出如下:
virsh pool-list
输出 Name State Autostart
------------------------------------
boot-scratch active yes
images active yes
images_lvm active yes
images_rbd active yes
images_zfs active yes
nvram active yes
创建虚拟机
为虚拟机创建ZFS卷(方法类似 libvirt LVM卷管理存储池 ):
virsh vol-create-as images_zfs centos7-zfs 20G
这里创建的将要用于虚拟机的ZFS卷并不会挂载到物理主机目录,不过可以通过 zfs list
命令查看:
zfs list
可以查看到为虚拟机创建的卷NAME USED AVAIL REFER MOUNTPOINT
zpool-data 283G 1.40T 112K /zpool-data
zpool-data/android 262G 1.40T 262G /zpool-data/android
zpool-data/ccache 96K 1.40T 96K /zpool-data/ccache
zpool-data/centos7-zfs 20.6G 1.42T 56K -
zpool-data/y-k8s 96K 1.40T 96K /zpool-data/y-k8s
创建虚拟机( 创建KVM虚拟机 ):
# virsh vol-create-as images_zfs centos7-zfs 20G
virt-install \
--network bridge:br0 \
--name centos7-zfs \
--ram=4096 \
--vcpus=2 \
--os-type=Linux --os-variant=rhl7 \
--boot uefi --cpu host-passthrough \
--disk vol=images_zfs/centos7-zfs,sparse=false,format=raw,bus=virtio,cache=none,io=native \
--graphics none \
--location=http://mirrors.163.com/centos-vault/7.8.2003/os/x86_64/ \
--extra-args="console=tty0 console=ttyS0,115200"
clone虚拟机
virsh
不支持clone ZFS卷
使用 virt-clone 克隆新的虚拟机( 参考 libvirt LVM卷管理存储池 ) 实践失败
virt-clone
复制虚拟机,但是 实际上对 ZFS 卷失败virt-clone --original centos7-zfs --name gfs-0 --auto-clone
提示错误:
virt-clone
复制虚拟机,但是 实际上对 ZFS 卷失败ERROR Couldn't create storage volume 'gfs-0': 'this function is not supported by the connection driver: storage pool does not support volume creation from an existing volume'
libguestfs: error: no libvirt domain called ‘gfs-0’: Domain not found: no domain with matching name 'gfs-0'
这个报错实际上就是 virsh clone-vol
的报错,原因是 libvirt
不支持 ZFS 卷clone。举例:
virsh vol-clone
尝试clone出ZFS卷vol-clone centos7-zfs gfs-0 --pool images_zfs
virsh vol-clone
尝试clone出ZFS卷报错信息error: Failed to clone vol from centos7-zfs
error: this function is not supported by the connection driver: storage pool does not support volume creation from an existing volume
手工处理