Overview of ZFS Clones
A clone is a writable volume or file system whose initial contents are
the same as the dataset from which it was created. As with
snapshots, creating a clone is nearly instantaneous, and initially consumes no additional disk
space. In addition, you can snapshot a clone.
Clones can only be created from a snapshot. When a snapshot is
cloned, an implicit dependency is created between the clone and snapshot. Even though the
clone is created somewhere else in the dataset hierarchy, the original snapshot cannot
be destroyed as long as the clone exists. The origin property exposes this
dependency, and the zfs destroy command lists any such dependencies, if they exist.
Clones do not inherit the properties of the dataset from which it
was created. Use the zfs get and zfs set commands to view and change the properties
of a cloned dataset. For more information about setting ZFS dataset properties, see
Setting ZFS Properties.
Because a clone initially shares all its disk space with the original snapshot,
its used property is initially zero. As changes are made to the clone,
it uses more space. The used property of the original snapshot does not
consider the disk space consumed by the clone.
Creating a ZFS Clone
To create a clone, use the zfs clone command, specifying the snapshot from which
to create the clone, and the name of the new file system or
volume. The new file system or volume can be located anywhere in the
ZFS hierarchy. The type of the new dataset (for example, file system
or volume) is the same type as the snapshot from which the clone
was created. You cannot create clone of a file system in a pool
that is different from where the original file system snapshot resides.
In the following example, a new clone named tank/home/ahrens/bug123 with the same
initial contents as the snapshot tank/ws/gate@yesterday is created.
# zfs snapshot tank/ws/gate@yesterday
# zfs clone tank/ws/gate@yesterday tank/home/ahrens/bug123
In the following example, a cloned workspace is created from the projects/newproject@today
snapshot for a temporary user as projects/teamA/tempuser. Then, properties are set on
the cloned workspace.
# 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
Destroying a ZFS Clone
ZFS clones are destroyed by using the zfs destroy command. For example:
# zfs destroy tank/home/ahrens/bug123
Clones must be destroyed before the parent snapshot can be destroyed.
Replacing a ZFS File System With a ZFS Clone
You can use the zfs promote command to replace an active ZFS file system
with a clone of that file system. This feature facilitates the ability to
clone and replace file systems so that the “origin” file system become the
clone of the specified file system. In addition, this feature makes it possible
to destroy the file system from which the clone was originally created. Without
clone promotion, you cannot destroy a “origin” file system of active clones. For
more information about destroying clones, see Destroying a ZFS Clone.
In the following example, the tank/test/productA file system is cloned and then the
clone file system, tank/test/productAbeta becomes the tank/test/productA file system.
# 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 314K 8.24G 25.5K /tank/test
tank/test/productA 288K 8.24G 288K /tank/test/productA
tank/test/productA@today 0 - 288K -
tank/test/productAbeta 0 8.24G 288K /tank/test/productAbeta
# zfs promote tank/test/productAbeta
# zfs list -r tank/test
NAME USED AVAIL REFER MOUNTPOINT
tank/test 316K 8.24G 27.5K /tank/test
tank/test/productA 0 8.24G 288K /tank/test/productA
tank/test/productAbeta 288K 8.24G 288K /tank/test/productAbeta
tank/test/productAbeta@today 0 - 288K -
In the above zfs -list output, you can see that the space accounting
of the original productA file system has been replaced with the productAbeta file
system.
Complete the clone replacement process by renaming the file systems. For example:
# zfs rename tank/test/productA tank/test/productAlegacy
# zfs rename tank/test/productAbeta tank/test/productA
# zfs list -r tank/test
NAME USED AVAIL REFER MOUNTPOINT
tank/test 316K 8.24G 27.5K /tank/test
tank/test/productA 288K 8.24G 288K /tank/test/productA
tank/test/productA@today 0 - 288K -
tank/test/productAlegacy 0 8.24G 288K /tank/test/productAlegacy
Optionally, you can remove the legacy file system. For example:
# zfs destroy tank/test/productAlegacy