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
:
zpool create zpool-data sda
# 设置了从zpool的根开始激活压缩
zfs set compression=lz4 zpool-data
检查 zpool list
输出如下:
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虚拟机管理器 存储:
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的存储池:
virsh pool-define-as --name images_zfs --source-name zpool-data --type zfs
遇到报错显示没有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
服务,否则也会报上述错误。
如果一切正常,则会看到输出
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
输出如下:
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
命令查看:
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 --original centos7-zfs --name gfs-0 --auto-clone
提示错误:
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。举例:
vol-clone centos7-zfs gfs-0 --pool images_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
手工处理