libvirt ZFS存储池

Arch LinuxX86_64 架构对 ZFSStratis - Linux存储系统 都有良好支持,所以我计划:

备注

libvirt ZFS存储池 非常类似 libvirt LVM卷管理存储池 ,基于卷来管理虚拟机的存储分配和隔离,是适合大型云计算的基础存储方案。虽然没有 Libvirt集成Ceph RBD 方案提供了分布式存储的容灾和高可用,但是非常适合构建低成本 spot vm 的存储。通过 ZFS 强大的海量存储管理能力,精简掉RAID功能,使用基础的卷管理能力来实现。

准备工作

在磁盘 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  -
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

其中:

接下来我们创建一个ZFS存储池 images_zfs

  • Ubuntu Linux 平台,需要安装 libvirt 的 ZFS 存储驱动软件包:

在 Ubuntu 系统上安装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存储池自动启动,并激活:

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

创建虚拟机

为虚拟机创建20G容量的ZFS卷
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
libvirt ZFS存储池 创建CentOS 7虚拟机
# 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 复制虚拟机,但是 实际上对 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

手工处理

参考