ZFS系列(十二)ZVOLs

本文主要是讲如何把ZFS当作块设备使用–主要是通过ZFS卷(ZVOLS)。使用ZVOLS还可以享受底层ZFS带来的好处,比如有ZFS的数据清理,压缩,去重等等特性。

ZVOL是作为块设备导出到系统的“ZFS卷”。到目前为止,在处理ZFS文件系统时,除了创建池之外,我们根本没有处理块设备,甚至在挂载数据集时也没有。ZFS的行为更像是用户空间应用程序,而不是文件系统。我的意思是,在GNU/Linux上,当使用文件系统时,您总是在使用块设备,无论它们是完整的磁盘、分区、RAID阵列还是逻辑卷。然而,通过ZFS,我们成功地摆脱了这一切,现在我们开始搞ZVOLs了。

ZVOL是驻留在存储池中的ZFS块设备。这意味着单个块设备可以利用底层RAID阵列,如镜像或RAID- z。它可以利用写时复制的好处,比如快照,也可以利用数据清理、压缩和数据去重功能,还可以利用ZIL和ARC。因为它是一个合法的块设备,你可以用你的ZVOL做一些非常有趣的事情。我们将在这里研究其中的三个:swap、ext4和VM存储。
首先,我们需要学习如何创建一个ZVOL。
为了创建一个ZVOL,我们需要使用“-V”参数和“zfs create”命令,并给它指定一个大小。例如,如果我想创建一个1GB的ZVOL,我可以用以下命令。注意,在/dev/zvol/tank/和/dev/tank/中存在一些新的符号链接,指向/dev/中的一个新块设备:

1
2
3
4
5
# zfs create -V 1G tank/disk1
# ls -l /dev/zvol/tank/disk1
lrwxrwxrwx 1 root root 11 Dec 20 22:10 /dev/zvol/tank/disk1 -> ../../zd144
# ls -l /dev/tank/disk1
lrwxrwxrwx 1 root root 8 Dec 20 22:10 /dev/tank/disk1 -> ../zd144

因为这是一个100%真实的块设备,它的大小是1 GB,我们可以用它做任何其他块设备可以做的事情,并且享受底层ZFS的所有好处。此外,创建一个无论多大的ZVOL都几乎是瞬时的。现在,我可以从文件系统上的一个文件用GNU/Linux创建一个块设备。例如,如果运行ext4,我可以创建一个1GB的文件,然后创建一个块设备,如下所示:

1
2
# fallocate -l 1G /tmp/file.img
# losetup /dev/loop0 /tmp/file.img

我现在有了块设备/dev/loop0,它代表我的1GB文件。就像其他块设备一样,我可以格式化它,将它添加到swap等等。但它没有那么优雅,而且有严重的局限性。首先,默认情况下,你只有8个环回设备用来导出块设备,但是您可以更改这个数字。使用ZFS,您可以默认创建2^64个 zvol。另外,它需要在文件系统上预先分配映像。因此,您将管理三层数据:块设备、文件和文件系统上的块。 使用ZVOLs,块设备可以直接从存储池导出,就像任何其他数据集一样。

让我们看看我们可以用这个ZVOL做些什么。

ZVOL上的交换分区

就我个人而言,我不太喜欢swap(分区)。我知道它是RAM的物理扩展,但是swap只在RAM填满、缓存溢出时使用。如果这种情况经常发生,那么您可能应该考虑获得更多的RAM。swap分区可以充当健康系统的一部分,使RAM专用于内核主动需要的内容。但是,当活动RAM开始溢出到swap分区时,就会出现“the swap of death”,就像磁盘抖动一样,试图跟上内核的要求。因此,根据您的系统和需求,您可能需要也可能不需要交换。

首先,让我们为swap分区创建1 GB的块设备。我们将该数据集称为“tank/swap”,以方便知晓其目的。在我们开始之前,让我们用“free”命令检查一下系统上目前有多少swap:

1
2
3
4
5
# free
total used free shared buffers cached
Mem: 12327288 8637124 3690164 0 175264 1276812
-/+ buffers/cache: 7185048 5142240
Swap: 0 0 0

在本例中,我们目前还没有启用任何交换。因此,现在让我们在ZVOL上创建1 GB的swap,并将其添加到内核中:

1
2
3
4
5
6
7
8
# zfs create -V 1G tank/swap
# mkswap /dev/zvol/tank/swap
# swapon /dev/zvol/tank/swap
# free
total used free shared buffers cached
Mem: 12327288 8667492 3659796 0 175268 1276804
-/+ buffers/cache: 7215420 5111868
Swap: 1048572 0 1048572

可以看到已经生效了!我们在ZFS上有一个合法的Linux内核swap,很好。与典型的swap设备的情况一样,它们没有挂载点。它们要么是启用的,要么是禁用的,这个swap没有什么不同。

ZVOL上的Ex4

这听起来可能有些古怪,但您可以将另一个文件系统挂载到ZVOL上。换句话说,您可以有一个ext4格式的ZVOL并挂载到/mnt。您甚至可以对ZVOL进行分区,并在其上放置多个文件系统。让我们来这样试试!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# zfs create -V 100G tank/ext4
# fdisk /dev/tank/ext4
( follow the prompts to create 2 partitions- the first 1 GB in size, the second to fill the rest )
# fdisk -l /dev/tank/ext4

Disk /dev/tank/ext4: 107.4 GB, 107374182400 bytes
16 heads, 63 sectors/track, 208050 cylinders, total 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 8192 bytes
I/O size (minimum/optimal): 8192 bytes / 8192 bytes
Disk identifier: 0x000a0d54

Device Boot Start End Blocks Id System
/dev/tank/ext4p1 2048 2099199 1048576 83 Linux
/dev/tank/ext4p2 2099200 209715199 103808000 83 Linux

让我们创建一些文件系统,并挂载它们:

1
2
3
4
5
# mkfs.ext4 /dev/zd0p1
# mkfs.ext4 /dev/zd0p2
# mkdir /mnt/zd0p{1,2}
# mount /dev/zd0p1 /mnt/zd0p1
# mount /dev/zd0p2 /mnt/zd0p2

在ZVOL上启用压缩,复制一些数据,然后做快照:

1
2
3
4
# zfs set compression=lzjb pool/ext4
# tar -cf /mnt/zd0p1/files.tar /etc/
# tar -cf /mnt/zd0p2/files.tar /etc /var/log/
# zfs snapshot tank/ext4@001

您可能没有注意到,但是您刚刚启用了透明压缩,并对ext4文件系统做了快照。这是ext4本身无法完成的两件事。您还可以获得ext4通常无法提供的ZFS的所有好处。所以,现在你可以定期快照你的数据,可以执行在线数据清理,并把它发送到离线备份。最重要的是,您的数据是一致的。

将ZVOL作为VM的后端存储

最后,您可以使用这些块设备作为虚拟机的后端存储。创建逻辑卷块设备作为虚拟机存储的后端是很常见的。让块设备对Qemu可用之后,将块设备附加到虚拟机,从它的角度来看,根据设置,您将拥有“/dev/vda”或“/dev/sda”。

如果使用libvirt,则会有一个/etc/libvirt/qemu/vm.xml文件。在该文件中,可以有以下内容,其中“/dev/zd0”是ZVOL块设备:

1
2
3
4
5
6
7
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source dev='/dev/zd0'/>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

此时,您的VM将获得底层的所有ZFS优势,如快照、压缩、重复数据删除、数据完整性、冗余等等。

总结

ZVOLs是一种很好的方法,可以在利用所有底层ZFS特性的同时快速使用块设备。使用ZVOLs作为VM备份存储特别有吸引力。但是,我应该注意,在使用zvol时,不能在集群之间复制它们。 ZFS不是集群文件系统。如果希望跨集群进行数据复制,那么不应该使用ZVOLs,而应该使用文件映像作为虚拟机备份存储。除此之外,无论您的ZVOL中驻留了什么数据,您可以从ZFS中获得到目前为止我们一直在博客中讨论的所有的好处。

参考资料

https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/

如果你觉得本文对你有帮助,欢迎打赏