跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:ZFS 文件系统 Oracle Solaris 11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
7. 使用 Oracle Solaris ZFS 快照和克隆
8. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
zfs send 命令创建写入标准输出的快照流表示。缺省情况下,生成完整的流。可以将输出重定向到文件或其他系统。zfs receive 命令创建其内容在标准输入提供的流中指定的快照。如果接收了完整的流,那么同时会创建一个新文件系统。可通过这些命令来发送 ZFS 快照数据并接收 ZFS 快照数据和文件系统。请参见下一节中的示例。
以下是用于保存 ZFS 数据的备份解决方案:
企业备份产品-如果需要以下功能,则应考虑企业备份解决方案:
按文件恢复
备份介质验证
介质管理
文件系统快照和回滚快照-如果要轻松创建文件系统的副本并恢复到以前的文件系统版本(如有必要),请使用 zfs snapshot 和 zfs rollback 命令。例如,要从文件系统的早期版本恢复一个或多个文件,可以使用此解决方案。
有关创建快照和回滚到快照的更多信息,请参见ZFS 快照概述。
保存快照-使用 zfs send 和 zfs receive 命令可发送和接收 ZFS 快照。可以保存快照之间的增量更改,但不能逐个恢复文件。必须恢复整个文件系统快照。这些命令不提供用于保存 ZFS 数据的完整备份解决方案。
远程复制-要将文件系统从一个系统复制到另一个系统,请使用 zfs send 和 zfs receive 命令。此过程与可能跨 WAN 镜像设备的传统卷管理产品有所不同。不需要特殊的配置或硬件。复制 ZFS 文件系统的优点是,可以在其他系统的存储池上重新创建文件系统,并为新创建的池指定不同的配置级别(如 RAID-Z),但是新创建的池使用相同的文件系统数据。
归档实用程序-使用归档实用程序(如 tar、cpio 和 pax)或第三方备份产品保存 ZFS 数据。目前,tar 和 cpio 均能正确转换 NFSv4 样式的 ACL,但是 pax 还不行。
除 zfs send 和 zfs receive 命令外,还可以使用归档实用程序(如 tar 和 cpio 命令)保存 ZFS 文件。这些实用程序可以保存和恢复 ZFS 文件属性和 ACL。请选中 tar 和 cpio 命令的适当选项。
有关 ZFS 和第三方备份产品的问题的最新信息,请参见 Oracle Solaris 11 发行说明。
通过使用 zfs send 命令,可以将 ZFS 文件系统或卷的快照转换为快照流。然后,可以使用快照流重新创建 ZFS 文件系统或卷(通过 zfs receive 命令)。
根据用于创建快照流的 zfs send 选项,将生成不同类型的流格式。
完整流-包含从创建数据集时开始到指定的快照为止的所有数据集内容。
zfs send 命令生成的缺省流是完整流。它包含一个文件系统或卷,直到并包括指定的快照。流不会包含在命令行上指定的快照之外的快照。
增量流-包含一个快照与另一个快照之间的差异。
流数据包是包含一个或多个完整流或增量流的流类型。存在以下三种类型的流数据包:
复制流数据包-包含指定的数据集及其后代。它包括所有的中间快照。如果克隆数据集的源不是在命令行上指定的快照的后代,则该源数据集将不包括在流数据包中。要接收流,源数据集必须存在于目标存储池中。
请考虑以下列表中的数据集及其源。假定它们是按如下所示顺序创建的。
NAME ORIGIN pool/a - pool/a/1 - pool/a/1@clone - pool/b - pool/b/1 pool/a/1@clone pool/b/1@clone2 - pool/b/2 pool/b/1@clone2 pool/b@pre-send - pool/b/1@pre-send - pool/b/2@pre-send - pool/b@send - pool/b/1@send - pool/b/2@send -
使用以下语法创建的复制流数据包:
# zfs send -R pool/b@send ....
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@pre-send - incr pool/b@send pool/b@pre-send incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@pre-send pool/b/1@clone2 incr pool/b/1@send pool/b/1@send incr pool/b/2@pre-send pool/b/1@clone2 incr pool/b/2@send pool/b/2@pre-send
在上面的输出中,pool/a/1@clone 快照未包括在复制流数据包中。因此,只能在已具有 pool/a/1@clone 快照的池中接收此复制流数据包。
递归流数据包-包含指定的数据集及其后代。与复制流数据包不同,除非中间快照是流中包括的克隆数据集的源,否则将不包括它们。缺省情况下,如果数据集的源不是在命令行上指定的快照的后代,则行为类似于复制流。不过,下面讨论的自包含递归流是以没有外部相关项的方式创建的。
使用以下语法创建的递归流数据包:
# zfs send -r pool/b@send ...
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - incr pool/b/1@clone2 pool/a/1@clone incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
在上面的输出中,pool/a/1@clone 快照未包括在递归流数据包中。因此,只能在已具有 pool/a/1@clone 快照的池中接收此递归流数据包。此行为与上面所述的复制流数据包情况类似。
自包含递归流数据包-不依赖于流数据包中未包括的任何数据集。此递归流数据包是使用以下语法创建的:
# zfs send -rc pool/b@send ...
包含以下完整流和增量流:
TYPE SNAPSHOT INCREMENTAL FROM full pool/b@send - full pool/b/1@clone2 incr pool/b/1@send pool/b/1@clone2 incr pool/b/2@send pool/b/1@clone2
可以看到,该自包含递归流具有 pool/b/1@clone2 快照的完整流,这使得接收没有外部相关项的 pool/b/1 快照成为可能。
可以使用 zfs send 命令来发送某个快照流的副本,并在同一系统的另一个池中或用于存储备份数据的不同系统上的另一个池中接收快照流。例如,要将不同池上的快照流发送到同一系统,请使用类似如下的语法:
# zfs send tank/dana@snap1 | zfs recv spool/ds01
可以将 zfs recv 用作 zfs receive 命令的别名。
如果要将快照流发送到不同的系统,请通过 ssh 命令传输 zfs send 输出。例如:
sys1# zfs send tank/dana@snap1 | ssh sys2 zfs recv newtank/dana
发送完整的流时,目标文件系统必须不能存在。
使用 zfs send -i 选项可以发送增量数据。例如:
sys1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh sys2 zfs recv newtank/dana
请注意,第一个参数 (snap1) 是较早的快照,第二个参数 (snap2) 是较晚的快照。这种情况下,newtank/dana 文件系统必须已经存在,增量接收才能成功。
可将增量 snap1 源指定为快照名称的最后一个组成部分。此快捷方式意味着只需在 @ 符号后指定 snap1 的名称,假定它与 snap2 都来自同一文件系统。例如:
sys1# zfs send -i snap1 tank/dana@snap2 | ssh sys2 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 rename 命令重命名文件系统。
例如:
# 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
如果对目标文件系统进行更改并且要再次以增量方式发送快照,则必须先回滚接收文件系统。
请参考以下示例。首先更改文件系统,如下所示:
sys2# rm newtank/dana/file.1
然后以增量方式发送 tank/dana@snap3。但是,要接收新的增量快照,首先必须回滚接收文件系统。或者,使用 -F 选项可以取消回滚步骤。例如:
sys1# zfs send -i tank/dana@snap2 tank/dana@snap3 | ssh sys2 zfs recv -F newtank/dana
接收增量快照时,目标文件系统必须已存在。
如果对文件系统进行更改,但不回滚接收文件系统以接收新的增量快照,或者不使用 -F 选项,则会看到类似以下的消息:
sys1# zfs send -i tank/dana@snap4 tank/dana@snap5 | ssh sys2 zfs recv newtank/dana cannot receive: destination has been modified since most recent snapshot
在 -F 选项成功之前,会执行以下检查:
如果最新快照与增量源不匹配,则回滚和接收都无法完成,并且会返回一条错误消息。
如果意外地提供了与 zfs receive 命令所指定的增量源不匹配的其他文件系统名称,则回滚和接收都无法完成,并且会返回以下错误消息。
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
您可以发送带有特定文件系统属性值的 ZFS 快照流,但在接收快照流时,可以指定不同的本地属性值。或者,您可以指定收到快照流时使用原始属性值以重新创建原始文件系统。此外,收到快照流时,还可以禁用文件系统属性。
使用 zfs inherit -S 将本地属性值恢复为接收值(如有)。如果属性没有接收值,则 zfs inherit - S 命令的行为与不带 -S 选项的 zfs inherit 命令相同。如果属性有接收值,则 zfs inherit 命令会用继承的值覆盖接收的值,直到发出 zfs inherit -S 命令将其恢复为接收的值。
可以使用 zfs get -o 以包括新的非缺省栏 RECEIVED。或者,可以使用 zfs get -o all 命令以包括所有栏,其中包括 RECEIVED。
您可以使用 zfs send -p 选项以包括发送流中的属性,而无需使用 -R 选项。
可以使用 zfs send -e 选项以利用所发送的快照名的最后一个元素确定新的快照名。以下示例将 poola/bee/cee@1 快照发送给 poold/eee 文件系统,并仅利用快照名的最后一个元素 (cee@1) 创建接收的文件系统和快照。
# zfs list -rt all poola NAME USED AVAIL REFER MOUNTPOINT poola 134K 134G 23K /poola poola/bee 44K 134G 23K /poola/bee poola/bee/cee 21K 134G 21K /poola/bee/cee poola/bee/cee@1 0 - 21K - # zfs send -R poola/bee/cee@1 | zfs receive -e poold/eee # zfs list -rt all poold NAME USED AVAIL REFER MOUNTPOINT poold 134K 134G 23K /poold poold/eee 44K 134G 23K /poold/eee poold/eee/cee 21K 134G 21K /poold/eee/cee poold/eee/cee@1 0 - 21K -
在某些情况下,发送流中的文件系统属性可能不适用于接收方文件系统,或者本地文件系统属性(如 mountpoint 属性值)可能会干扰恢复。
例如,tank/data 文件系统禁用了 compression 属性。tank/data 文件系统的一个快照在发送到备份池时带有属性(-p 选项),在接收该快照时启用了 compression 属性。
# zfs get compression tank/data NAME PROPERTY VALUE SOURCE tank/data compression off default # zfs snapshot tank/data@snap1 # zfs send -p tank/data@snap1 | zfs recv -o compression=on -d bpool # zfs get -o all compression bpool/data NAME PROPERTY VALUE RECEIVED SOURCE bpool/data compression on off local
在该示例中,bpool 池接收快照时启用了 compression 属性。因此 bpool/data 的 compression 值为 on。
如果将此快照流发送到新池 restorepool 以用于恢复,您可能要保留所有原始的快照属性。在这种情况下,可使用 zfs send -b 命令恢复原始的快照属性。例如:
# zfs send -b bpool/data@snap1 | zfs recv -d restorepool # zfs get -o all compression restorepool/data NAME PROPERTY VALUE RECEIVED SOURCE restorepool/data compression off off received
在该示例中,"compression" 的值是 off,代表来自原始 tank/data 文件系统的快照的 "compression" 值。
如果快照流中有本地文件系统属性值,而您希望在接收快照流时禁用该属性,可使用 zfs receive -x 命令。例如,以下命令发送一个起始目录文件系统的递归快照流,并将所有文件系统属性保留到备份池,但没有配额属性值:
# zfs send -R tank/home@snap1 | zfs recv -x quota bpool/home # zfs get -r quota bpool/home NAME PROPERTY VALUE SOURCE bpool/home quota none local bpool/home@snap1 quota - - bpool/home/lori quota none default bpool/home/lori@snap1 quota - - bpool/home/mark quota none default bpool/home/mark@snap1 quota - -
如果未使用 -x 选项接收该递归快照,将在接收方文件系统设置配额属性。
# zfs send -R tank/home@snap1 | zfs recv bpool/home # zfs get -r quota bpool/home NAME PROPERTY VALUE SOURCE bpool/home quota none received bpool/home@snap1 quota - - bpool/home/lori quota 10G received bpool/home/lori@snap1 quota - - bpool/home/mark quota 10G received bpool/home/mark@snap1 quota - -
本节介绍如何使用 zfs send -I 和 -R 选项来发送和接收更复杂的快照流。
发送和接收复杂的 ZFS 快照流时,请牢记以下要点:
使用 zfs send -I 选项可将所有增量流从一个快照发送到某个累积快照。或者,使用此选项可从源快照发送增量流,以创建一个克隆。原始快照必须已存在于接收方之上才能接受增量流。
使用 zfs send -R 选项可发送所有后代文件系统的复制流。接收复制流时,所有属性、快照、后代文件系统和克隆都将被保留。
在没有 -c 选项的情况下使用 zfs send -r 选项时以及使用 zfs send -R 选项时,流数据包在某些情况下将忽略克隆的源。有关更多信息,请参见识别 ZFS 快照流。
使用这两个选项发送增量复制流。
对属性所做的更改得到保留,就像快照和文件系统的 rename 和 destroy 操作得到保留一样。
如果在接收复制流时未指定 zfs recv -F,则将忽略数据集 destroy 操作。本例中的 zfs recv -F 语法还将保留其“如有必要则回滚”的含义。
与其他(非 zfs send -R)-i 或 -I 情况一样,如果使用 -I,则将发送 snapA 与 snapD 之间的所有快照。如果使用 -i,则只发送 snapD(对于所有后代)。
要接收任何这些新类型的 zfs send 流,接收系统必须正在运行能够发送这些流的软件版本。流版本将递增。
但是,您可以使用较新的软件版本来访问较旧池版本中的流。例如,您可以将使用较新的选项创建的流发送到版本 3 池,并可从版本 3 池中接收这些流。但是,要接收使用较新的选项发送的流,必须运行最新软件。
示例 7-1 发送和接收复杂的 ZFS 快照流
可以使用 zfs send -I 选项将一组增量快照合并为一个快照。例如:
# zfs send -I pool/fs@snapA pool/fs@snapD > /snaps/fs@all-I
然后,您可以删除 snapB、snapC 和 snapD。
# 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 send 和 zfs recv 命令,将快照流表示从一个系统远程复制到另一个系统。例如:
# zfs send tank/cindy@today | ssh newsys zfs recv sandbox/restfs@today
此命令发送 tank/cindy@today 快照数据,并在 sandbox/restfs 文件系统中予以接收。该命令还会在 newsys 系统上创建 restfs@today 快照。在此示例中,已将用户配置为在远程系统上使用 ssh。