.. _libvirt_zfs_pool:
=======================
libvirt ZFS存储池
=======================
:ref:`arch_linux` 的 ``X86_64`` 架构对 :ref:`zfs` 和 :ref:`stratis` 都有良好支持,所以我计划:
- 在MacBook Pro 2013笔记本上同时采用这两种存储技术来构建 ``libvit`` 存储后端
- 在 :ref:`priv_cloud_infra` 上利用3块旧的HDD构建ZFS扩展 ``libvit`` 存储后端 (感觉性能会比较差,所以考虑这个ZFS存储作为离线数据存储)
- 在 :ref:`priv_cloud_infra` 使用购买的二手SSD磁盘 :ref:`sandisk_cloudspeed_eco_gen_ii_sata_ssd` 构建ZFS存储池提供虚拟机集群模拟
.. note::
libvirt ZFS存储池 非常类似 :ref:`libvirt_lvm_pool` ,基于卷来管理虚拟机的存储分配和隔离,是适合大型云计算的基础存储方案。虽然没有 :ref:`ceph_rbd_libvirt` 方案提供了分布式存储的容灾和高可用,但是非常适合构建低成本 spot vm 的存储。通过 ZFS 强大的海量存储管理能力,精简掉RAID功能,使用基础的卷管理能力来实现。
准备工作
=========
- SSD磁盘 :ref:`sandisk_cloudspeed_eco_gen_ii_sata_ssd` 已经在 :ref:`zfs_startup_zcloud` 已经构建了一个基础ZFS pool ``zpool-data`` :
.. literalinclude:: ../../../linux/storage/zfs/admin/zfs_startup_zcloud/zpool_create
:caption: 在磁盘 ``sda`` 上创建ZFS的存储池,名字为 ``zpool-data``
检查 ``zpool list`` 输出如下:
.. literalinclude:: ../../../linux/storage/zfs/admin/zfs_startup_zcloud/zpool_list_output
:caption: 使用 ``zpool list`` 检查现有的zpool存储池 可以看到刚创建的 ``zpool-data``
- 当前 ``zcloud`` 上构建的 :ref:`libvirt` 存储:
.. literalinclude:: libvirt_zfs_pool/virsh_pool-list_output
:caption: ``virsh pool-list`` 查看当前系统已经具备的 libvirt 存储池
:emphasize-lines: 4-6
其中:
- ``images`` 是默认本地磁盘存储池 ``/var/lib/libvirt/images`` 目录
- ``images_lvm`` 是 :ref:`libvirt_lvm_pool`
- ``images_rbd`` 是 :ref:`ceph_rbd_libvirt`
接下来我们创建一个ZFS存储池 ``images_zfs``
- 在 :ref:`ubuntu_linux` 平台,需要安装 libvirt 的 ZFS 存储驱动软件包:
.. literalinclude:: libvirt_zfs_pool/ubuntu_install_libvirt_zfs_driver
:caption: 在 Ubuntu 系统上安装libvirt的ZFS驱动
ZFS存储池定义
==============
- 对于已经存在的 ZFS 存储池 ``zpool-data`` 需要定义为libvirt的存储池:
.. literalinclude:: libvirt_zfs_pool/virsh_pool_define_zfs
:caption: 定义 ``zpool-data`` 存储池作为libvirt的存储池
遇到报错显示没有zfs存储池后端:
.. literalinclude:: libvirt_zfs_pool/virsh_pool_define_zfs_err
:caption: 定义 ``zpool-data`` 存储池作为libvirt的存储池报错,显示没有zfs后端
这是因为没有安装上文所说的 **libvirt 的 ZFS 存储驱动软件包** ``libvirt-daemon-driver-storage-zfs`` ,此外,安装了这个libvirt的ZFS驱动之后,一定要重新启动一次 ``libvirtd`` 服务,否则也会报上述错误。
如果一切正常,则会看到输出
.. literalinclude:: libvirt_zfs_pool/virsh_pool_define_zfs_output
:caption: 定义 ``zpool-data`` 存储池作为libvirt的存储池的成功输出信息
.. note::
我发现重启一次 ``libvirtd`` 服务,会出现 :ref:`ceph_rbd_libvirt` 的存储池 ``images_rbd`` 处于 ``inactive`` 状态,需要手工激活一次
- 设置libvirt的ZFS存储池自动启动,并激活:
.. literalinclude:: libvirt_zfs_pool/virsh_pool_zfs_start
:caption: libvirt的ZFS存储池自动启动,并激活
完成后检查 ``virsh pool-list`` 输出如下:
.. literalinclude:: libvirt_zfs_pool/virsh_pool-list_all
:caption: ``virsh pool-list`` 输出
:emphasize-lines: 7
创建虚拟机
============
- 为虚拟机创建ZFS卷(方法类似 :ref:`libvirt_lvm_pool` ):
.. literalinclude:: libvirt_zfs_pool/virsh_vol_create_zfs
:caption: 为虚拟机创建20G容量的ZFS卷
这里创建的将要用于虚拟机的ZFS卷并不会挂载到物理主机目录,不过可以通过 ``zfs list`` 命令查看:
.. literalinclude:: libvirt_zfs_pool/zfs_list
:caption: ``zfs list`` 可以查看到为虚拟机创建的卷
:emphasize-lines: 5
- 创建虚拟机( :ref:`create_vm` ):
.. literalinclude:: ../../startup/create_vm/create_centos7_vm_zfs
:caption: 在 :ref:`libvirt_zfs_pool` 创建CentOS 7虚拟机
clone虚拟机
============
``virsh`` 不支持clone ZFS卷
----------------------------
- 使用 virt-clone 克隆新的虚拟机( 参考 :ref:`libvirt_lvm_pool` ) **实践失败**
.. literalinclude:: libvirt_zfs_pool/virt-clone
:caption: 使用 ``virt-clone`` 复制虚拟机,但是 **实际上对 ZFS 卷失败**
提示错误:
.. literalinclude:: libvirt_zfs_pool/virt-clone_err
:caption: 使用 ``virt-clone`` 复制虚拟机,但是 **实际上对 ZFS 卷失败**
这个报错实际上就是 ``virsh clone-vol`` 的报错,原因是 ``libvirt`` 不支持 ZFS 卷clone。举例:
.. literalinclude:: libvirt_zfs_pool/virsh_vol-clone
:caption: 使用 ``virsh vol-clone`` 尝试clone出ZFS卷
.. literalinclude:: libvirt_zfs_pool/virsh_vol-clone_err
:caption: 使用 ``virsh vol-clone`` 尝试clone出ZFS卷报错信息
手工处理
参考
=======
- `ZFS and libvirt `_
- `Lucanuscervus Notes: ZFS Using ZFS with libvirt `_
- `libvirt storage: ZFS pool `_
- `KVM with ZFS support `_