ZFS卷或称 zvol ,是由ZFS池支持的空间块,用作块设备。zvol通常像文件支持的文件系统一样使用,并通过iSCSI导出到其他设备。zvol没有正常的数据集文件、目录和权限,而是依赖于使用卷提供文件系统的任何内容。Zvol通常用作其他网络设备的iSCSI目标,使您能够访问具有不太灵活的文件系统的操作系统上支持ZFS的存储。您还可以将zvols用作虚拟机的存储,使任何来宾操作系统都可以访问ZFS的完整性功能,即使客户端操作系统不能使用ZFS。此外,您可以跨网络复制zvol。
我们在《FreeBSD Mastery:ZFS》中谈到了zvols。本章揭示了一些常见的zvol陷阱。但让我们从zvol基础开始。
-V 选项告诉 zfs create 创建一个ZFS卷。给出所需的大小和卷的完整路径。以下示例在 vm 池创建一个2TB的zvol。由于此卷将导出到web服务器,我们将其命名为 www1 :
xxxxxxxxxx# zfs create -V 2T vm/www1Zvols必须是数据集的子对象。在这个例子中,zvol是池根数据集的子数据集。您不能将zvol创建为zvol的子对象。我们的体积显示在数据集列表中。
xxxxxxxxxx# zfs list -r vmNAME USED AVAIL REFER MOUNTPOINTvm 2.06T 563G 31.8K /vmvm/db1 2.06T 2.61T 15.9K -zvol会立即占用您为其分配的所有空间。我们创建了一个2 TB的卷,因此它使用了2 TB的空间以及一些额外的元数据空间。一个全新的卷还没有使用这么多空间——它还没有将一堆占位符数据写入池或类似的东西。它只是通过重新保存来声称空间。
使用 zfs destroy 命令销毁卷:
xxxxxxxxxx# zfs destroy vm/www1您可以在zvols上使用大多数其他ZFS命令,例如重命名和移动。这个卷实际上是用于数据的,所以我们给它起了一个更有意义的名字:
xxxxxxxxxx# zfs rename vm/www1 vm/db1zvol具有许多与其他ZFS数据集相同的属性,但并非全部。zvol具有独特的属性,如 volmode 和 volblocksize ,而您不能在zvol上设置 sharenfs 或 atime 。
通过设备节点访问zvol。大多数zvol在 /dev/zvol 中都有设备节点,位于以其池命名的目录中。我们的示例zvol的设备节点 vm/db1 将是 /dev/zvol/vm/db1 。根据其模式,zvol可能有其他设备节点。
ZFS允许您创建一个大于可用空间的ZFS卷,从而过度占用空间。保留一些空间但不够,称为精简配置(thin provisioning)。精简配置在较旧的文件系统上是相当危险的,因为您可以轻松地配置比文件系统包含的空间更多的空间。您可以通过添加更多硬盘来轻松扩展ZFS池,因此在这里没有那么大的风险。refreservation 属性控制一个卷为它保留了多少空间。在这里,我们创建了2 TB的zvol db5 ,但告诉ZFS只为它保留100 MB。
xxxxxxxxxx# zfs create -V 2T -o refreservation=100M db/db5我们中的一些人有几个空的SAS机架,并且已经计划添加更多硬盘驱动器,甚至可以使用稀疏卷(sparse volumes)。稀疏卷仅使用卷上使用的空间量。使用 -s 标志创建稀疏卷。
xxxxxxxxxx# zfs create -V 2T -s db/db5如果要将iSCSI卷导出到其他主机,并且客户端的文件系统不如ZFS灵活,则可以使用较小的保留。当底层磁盘扩展时,扩展NTFS或UFS文件系统可能会导致长期问题。使用稀疏卷意味着您可以告诉Windows主机iSCSI设备具有特定的大容量,即使底层池没有那么多可用空间。支持它的zvol会消耗设备上文件使用的空间量,以及任何文件系统元数据。
如果您准备支持,这可以让您创建真正令人印象深刻的卷。在这里,我们创建一个2EB的稀疏卷。它下面的池只有500GB也没关系。
xxxxxxxxxx# zfs create -V 2E -s db/db5使用 gpart show/dev/zvol/db/db5 ,您将看到这个磁盘设备实际上是2 EB。如果您真的需要在单个iSCSI卷上使用2 EB的空间,您可能可以负担得起一个仆人(flunky),以足够快的速度解压缩和挂载硬盘,以满足需求。
当你用完空间时,克服困难会变得非常丑陋(ugly)。当您的iSCSI客户端被告知这些卷空间不足时,即使操作系统实例坚持认为它们只有10%的空间,他们也可能完全失去冷静。许多iSCSI堆栈都能很好地应对这些问题。其他人…没有。
如果您没有足够的物理硬件容量来添加存储,请让ZFS卷占用与其大小相等的空间。不要占用过多空间。
在为您的应用程序创建卷之前,请考虑其预期用途以及哪些主机将访问它。FreeBSD的默认ZFS设置假定托管zvol的系统完全控制它。但是,如果您将zvol用作虚拟机的存储,客户操作系统希望完全控制它。这很重要,因为FreeBSD的GEOM层会自动配置存储。主机已配置的存储会给虚拟化客户机带来问题。
使用 volmode 属性控制哪个系统配置卷。
geom
geom 是默认的 volmod , 表示卷所在的系统控制它。如果我们在主机 A 上创建一个zvol,主机 A 将通过GEOM配置和管理卷。除了ZFS卷的设备节点外,它还获取 /dev/label 等文件中的设备节点。当您在本地使用zvol时,请使用geom volmode 。
dev
dev 意味着这个zvol只能通过 /dev/zvol 中的单个设备节点使用。GEOM不会尝试自动配置此卷。您可以为节点分配标签,但FreeBSD甚至不会尝试查看它。对虚拟机存储使用dev volmode ,如 bhyve(8) 主机。
none
none 意味着这个zvol甚至没有获得设备节点。您可以克隆此卷、快照或复制它。此模式仅适用于备份。
您无法更改实时zvol的模式——虽然您可以更改 volmode 属性的值,但卷的实际模式不会改变。要使 volmode 更改生效,请导出并重新导入卷。(您还可以重命名卷,这实际上是导出卷并以其他名称导入。)
通过在命令行中指定模式或设置全局默认值,使用所需模式创建卷。
与任何其他属性一样,在创建zvol时使用 -o 标志设置 volmode 。
xxxxxxxxxx# zfs create -V 10G -o volmode=dev vm/swap0这个新的zvol只能由设备节点 /dev/zvol/vm/swap0 访问。
如果主机通常需要使用geom以外的 volmode ,则更改默认 volmode 是有意义的。sysctl vfs.zfs.vol.mode 控制新zvols的默认 volmode 。
使用 sysctl(8) 更改默认值,或在下次重新启动时使用 /etc/sysctl.conf 条目使更改永久有效。这里有一个 /etc/sysctl.conf 条目,用于让虚拟化服务器创建 volmode 为 dev 的新zvol。
xxxxxxxxxxvfs.zfs.vol.mode=2没有必要明确定义geom volmode 。
你不能使用 zfs mount 像挂载文件系统数据集那样挂载zvol。zvol的全部意义在于它是一个块设备。要访问它,您必须访问设备节点或其GEOM提供程序。最常见的可能是设备节点。
zvol在 /dev/zvol 中获取一个设备节点,该节点位于以池命名的子目录中。我们的示例zvol的设备节点 vm/db1 将是 /dev/zvol/vm/db1 。
我们可能会将此zvol指定为 bhyve 虚拟机的存储,在这种情况下,我们可能会让虚拟机对磁盘进行分区。
对于其他用途,我们可能希望在本地对其进行分区。在这里,我们在zvol上创建一个GPT分区方案,并将其设置为一个大分区,GEOM标签为 db1 。我们还为它分配了一个GEOM标签。
xxxxxxxxxx# gpart create -s gpt /dev/zvol/vm/db1zvol/vm/db1 created# gpart add -t freebsd-ufs -l db1 /dev/zvol/vm/db1zvol/vm/db1p1 added# glabel create db1 /dev/zvol/vm/db1由于此zvol是使用默认 volmode ,geom创建的,因此现在也可以通过设备节点 /dev/label/db1 访问它。
一旦分区存在,您就可以在其上创建文件系统。
xxxxxxxxxx# newfs -j /dev/zvol/vm/db1/dev/zvol/vm/db1: 2097152.0MB (4294967296 sectors) block size 32768, fragment size 4096 using 3350 cylinder groups of 626.09MB, 20035 blks, 80256 inodes. with soft updates…等等,为什么我们可能想在zvol上使用UFS?
也许我们的iSCSI客户端或VM客户机没有足够的资源来有效地运行ZFS。通过为客户端提供一个由ZFS支持的卷和它可以支持的文件系统,客户端可以获得ZFS的额外保护,即使客户端不能直接使用ZFS。然而,我使用 -j 启用UFS软更新日志记录,因为ZFS数据完整性和UFS文件系统日志记录保护的内容完全不同。ZFS完整性检查确保写入是安全的,但文件系统日志记录会验证所有写入是否完成。
既然zvol有一个文件系统,您就可以挂载它了。
xxxxxxxxxx# mount /dev/gpt/db1 /media/瞧!我有一个由ZFS支持的UFS文件系统,可以随时使用。
zvols最常见的用途是作为虚拟机的后备存储。大量的虚拟机需要大量的硬件。接下来我们来看看。