Oracle Solaris ZFS 管理指南

ZFS 克隆概述

克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。

克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在数据集分层结构中的某个其他位置创建的,但只要克隆存在,就无法销毁原始快照。origin 属性显示此相关性,而 zfs destroy 命令会列出任何此类相关性(如果存在)。

克隆不继承从其中创建它的数据集的属性。使用 zfs getzfs set 命令,可以查看和更改克隆数据集的属性。有关设置 ZFS 数据集属性的更多信息,请参见设置 ZFS 属性

由于克隆最初与原始快照共享其所有磁盘空间,因此其 used 属性值最初为零。随着不断对克隆进行更改,它使用的磁盘空间将越来越多。原始快照的 used 属性不包括克隆所占用的磁盘空间。

创建 ZFS 克隆

要创建克隆,请使用 zfs clone 命令,指定从中创建克隆的快照以及新文件系统或卷的名称。新文件系统或卷可以位于 ZFS 分层结构中的任意位置。新数据集与从其中创建克隆的快照属同一类型(例如文件系统或卷)。不能在原始文件系统快照所在池以外的池中创建该文件系统的克隆。

在以下示例中,将创建一个名为 tank/home/ahrens/bug123 的新克隆,其初始内容与快照 tank/ws/gate@yesterday 的内容相同:


# zfs snapshot tank/ws/gate@yesterday
# zfs clone tank/ws/gate@yesterday tank/home/ahrens/bug123

在以下示例中,将从 projects/newproject@today 快照为临时用户创建克隆工作区 projects/teamA/tempuser。然后,在克隆工作区上设置属性。


# zfs snapshot projects/newproject@today
# zfs clone projects/newproject@today projects/teamA/tempuser
# zfs set sharenfs=on projects/teamA/tempuser
# zfs set quota=5G projects/teamA/tempuser

销毁 ZFS 克隆

使用 zfs destroy 命令可以销毁 ZFS 克隆。例如:


# zfs destroy tank/home/ahrens/bug123

必须先销毁克隆,才能销毁父快照。

使用 ZFS 克隆替换 ZFS 文件系统

借助 zfs promote 命令可以用活动的 ZFS 文件系统的克隆来替换该文件系统。利用此功能可以克隆并替换文件系统,使文件系统变为指定文件系统的克隆。此外,通过此功能还可以销毁最初创建克隆所基于的文件系统。如果没有克隆提升 (clone promotion) 功能,就无法销毁活动克隆的源文件系统。有关销毁克隆的更多信息,请参见销毁 ZFS 克隆

在以下示例中,对 tank/test/productA 文件系统进行了克隆,然后克隆文件系统 tank/test/productAbeta 成为原始 tank/test/productA 文件系统。


# zfs create tank/test
# zfs create tank/test/productA
# zfs snapshot tank/test/productA@today
# zfs clone tank/test/productA@today tank/test/productAbeta
# zfs list -r tank/test
NAME                       USED  AVAIL  REFER  MOUNTPOINT
tank/test                  104M  66.2G    23K  /tank/test
tank/test/productA         104M  66.2G   104M  /tank/test/productA
tank/test/productA@today      0      -   104M  -
tank/test/productAbeta        0  66.2G   104M  /tank/test/productAbeta
# zfs promote tank/test/productAbeta
# zfs list -r tank/test
NAME                           USED  AVAIL  REFER  MOUNTPOINT
tank/test                      104M  66.2G    24K  /tank/test
tank/test/productA                0  66.2G   104M  /tank/test/productA
tank/test/productAbeta         104M  66.2G   104M  /tank/test/productAbeta
tank/test/productAbeta@today      0      -   104M  -

在此 zfs list 输出中,注意源 productA 文件系统的磁盘空间记帐信息已被 productAbeta 文件系统取代。

可以通过重命名文件系统完成克隆替换过程。例如:


# zfs rename tank/test/productA tank/test/productAlegacy
# zfs rename tank/test/productAbeta tank/test/productA
# zfs list -r tank/test

或者,也可以删除传统的文件系统。例如:


# zfs destroy tank/test/productAlegacy