Oracle Solaris ZFS 管理指南

发送和接收 ZFS 数据

zfs send 命令创建写入标准输出的快照流表示。缺省情况下,生成完整的流。可以将输出重定向到文件或其他系统。zfs receive 命令创建其内容在标准输入提供的流中指定的快照。如果接收了完整的流,那么同时会创建一个新文件系统。可通过这些命令来发送 ZFS 快照数据并接收 ZFS 快照数据和文件系统。请参见下一节中的示例。

以下是用于保存 ZFS 数据的备份解决方案:

使用其他备份产品保存 ZFS 数据

zfs sendzfs receive 命令外,还可以使用归档实用程序(如 tarcpio 命令)保存 ZFS 文件。这些实用程序可以保存和恢复 ZFS 文件属性和 ACL。请选中 tarcpio 命令的适当选项。

有关 ZFS 问题和第三方备份产品的最新信息,请参见 Solaris 10 发行说明或位于以下位置的 ZFS 常见问题解答:

http://hub.opensolaris.org/bin/view/Community+Group+zfs/faq/#backupsoftware

发送 ZFS 快照

可以使用 zfs send 命令来发送某个快照流的副本,并在同一系统的另一个池中或用于存储备份数据的不同系统上的另一个池中接收快照流。例如,要将不同池上的快照流发送到同一系统,请使用类似如下的语法:


# zfs send tank/data@snap1 | zfs recv spool/ds01

可以将 zfs recv 用作 zfs receive 命令的别名。

如果要将快照流发送到不同的系统,请通过 ssh 命令传输 zfs send 输出。例如:


host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana

发送完整的流时,目标文件系统必须不能存在。

使用 zfs send -i 选项可以发送增量数据。例如:


host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana

请注意,第一个参数 (snap1) 是较早的快照,第二个参数 (snap2) 是较晚的快照。这种情况下,newtank/dana 文件系统必须已经存在,增量接收才能成功。

可将增量 snap1 源指定为快照名称的最后一个组成部分。此快捷方式意味着只需在 @ 符号后指定 snap1 的名称,假定它与 snap2 都来自同一文件系统。例如:


host1# zfs send -i snap1 tank/dana@snap2 > ssh host2 zfs recv newtank/dana

这一快捷方式语法等效于上例中的增量语法。

尝试从其他文件系统 snapshot1 生成增量流时,将显示以下消息:


cannot send 'pool/fs@name': not an earlier snapshot from the same fs

如果需要存储许多副本,可以考虑使用 gzip 命令压缩 ZFS 快照流表示。例如:


# zfs send pool/fs@snap | gzip > backupfile.gz

接收 ZFS 快照

接收文件系统快照时,请牢记以下要点:

例如:


# zfs send tank/gozer@0830 > /bkups/gozer.083006
# zfs receive tank/gozer2@today < /bkups/gozer.083006
# zfs rename tank/gozer tank/gozer.old
# zfs rename tank/gozer2 tank/gozer

如果对目标文件系统进行更改并且要再次以增量方式发送快照,则必须先回滚接收文件系统。

请参考以下示例。首先更改文件系统,如下所示:


host2# rm newtank/dana/file.1

然后以增量方式发送 tank/dana@snap3。但是,要接收新的增量快照,首先必须回滚接收文件系统。或者,使用 -F 选项可以取消回滚步骤。例如:


host1# zfs send -i tank/dana@snap2 tank/dana@snap3 | ssh host2 zfs recv -F newtank/dana

接收增量快照时,目标文件系统必须已存在。

如果对文件系统进行更改,但不回滚接收文件系统以接收新的增量快照,或者不使用 -F 选项,则会看到类似以下的消息:


host1# zfs send -i tank/dana@snap4 tank/dana@snap5 | ssh host2 zfs recv newtank/dana
cannot receive: destination has been modified since most recent snapshot

-F 选项成功之前,会执行以下检查:

发送和接收复杂的 ZFS 快照流

本节介绍如何使用 zfs send -I-R 选项来发送和接收更复杂的快照流。

发送和接收复杂的 ZFS 快照流时,请牢记以下要点:


示例 7–1 发送和接收复杂的 ZFS 快照流

可以使用 zfs send -I 选项将一组增量快照合并为一个快照。例如:


# zfs send -I pool/fs@snapA pool/fs@snapD > /snaps/fs@all-I

然后,您可以删除 snapBsnapCsnapD


# zfs destroy pool/fs@snapB
# zfs destroy pool/fs@snapC
# zfs destroy pool/fs@snapD

要接收组合快照,可以使用以下命令。


# zfs receive -d -F pool/fs < /snaps/fs@all-I
# zfs list
NAME                      USED  AVAIL  REFER  MOUNTPOINT
pool                      428K  16.5G    20K  /pool
pool/fs                    71K  16.5G    21K  /pool/fs
pool/fs@snapA              16K      -  18.5K  -
pool/fs@snapB              17K      -    20K  -
pool/fs@snapC              17K      -  20.5K  -
pool/fs@snapD                0      -    21K  -

您还可以使用 zfs send -I 命令来合并快照和克隆快照,以创建一个合并数据集。例如:


# zfs create pool/fs
# zfs snapshot pool/fs@snap1
# zfs clone pool/fs@snap1 pool/clone
# zfs snapshot pool/clone@snapA
# zfs send -I pool/fs@snap1 pool/clone@snapA > /snaps/fsclonesnap-I
# zfs destroy pool/clone@snapA
# zfs destroy pool/clone
# zfs receive -F pool/clone < /snaps/fsclonesnap-I

可以使用 zfs send -R 命令将 ZFS 文件系统和所有后代文件系统复制到一个已命名的快照中。接收此流时,所有属性、快照、后代文件系统和克隆都将被保留。

在以下示例中,将创建用户文件系统的快照。为所有用户快照创建一个复制流。然后,原始文件系统和快照将被销毁并恢复。


# zfs snapshot -r users@today
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
users               187K  33.2G    22K  /users
users@today            0      -    22K  -
users/user1          18K  33.2G    18K  /users/user1
users/user1@today      0      -    18K  -
users/user2          18K  33.2G    18K  /users/user2
users/user2@today      0      -    18K  -
users/user3          18K  33.2G    18K  /users/user3
users/user3@today      0      -    18K  -
# zfs send -R users@today > /snaps/users-R
# zfs destroy -r users
# zfs receive -F -d users < /snaps/users-R
# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
users               196K  33.2G    22K  /users
users@today            0      -    22K  -
users/user1          18K  33.2G    18K  /users/user1
users/user1@today      0      -    18K  -
users/user2          18K  33.2G    18K  /users/user2
users/user2@today      0      -    18K  -
users/user3          18K  33.2G    18K  /users/user3
users/user3@today      0      -    18K  -

以下示例使用 zfs send -R 命令来复制 users 数据集及其后代,并将复制的流发送到另一个池 users2


# zfs create users2 mirror c0t1d0 c1t1d0
# zfs receive -F -d users2 < /snaps/users-R
# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
users                224K  33.2G    22K  /users
users@today             0      -    22K  -
users/user1           33K  33.2G    18K  /users/user1
users/user1@today     15K      -    18K  -
users/user2           18K  33.2G    18K  /users/user2
users/user2@today       0      -    18K  -
users/user3           18K  33.2G    18K  /users/user3
users/user3@today       0      -    18K  -
users2               188K  16.5G    22K  /users2
users2@today            0      -    22K  -
users2/user1          18K  16.5G    18K  /users2/user1
users2/user1@today      0      -    18K  -
users2/user2          18K  16.5G    18K  /users2/user2
users2/user2@today      0      -    18K  -
users2/user3          18K  16.5G    18K  /users2/user3
users2/user3@today      0      -    18K  -

远程复制 ZFS 数据

可以使用 zfs sendzfs recv 命令,将快照流表示从一个系统远程复制到另一个系统。例如:


# zfs send tank/cindy@today | ssh newsys zfs recv sandbox/restfs@today

此命令发送 tank/cindy@today 快照数据,并在 sandbox/restfs 文件系统中予以接收。该命令还会在 newsys 系统上创建 restfs@today 快照。在此示例中,已将用户配置为在远程系统上使用 ssh