跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris ZFS 管理指南 Oracle Solaris 10 8/11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
5. 安装和引导 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 均能正确转换 NFSv 样式的 ACL,但是 pax 还不行。
除 zfs send 和 zfs receive 命令外,还可以使用归档实用程序(如 tar 和 cpio 命令)保存 ZFS 文件。这些实用程序可以保存和恢复 ZFS 文件属性和 ACL。请选中 tar 和 cpio 命令的适当选项。
有关 ZFS 问题和第三方备份产品的最新信息,请参见 Solaris 10 发行说明或位于以下位置的 ZFS 常见问题解答:
http://hub.opensolaris.org/bin/view/Community+Group+zfs/faq/#backupsoftware
可以使用 zfs send 命令来发送某个快照流的副本,并在同一系统的另一个池中或用于存储备份数据的不同系统上的另一个池中接收快照流。例如,要将不同池上的快照流发送到同一系统,请使用类似如下的语法:
# zfs send tank/dana@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 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
如果对目标文件系统进行更改并且要再次以增量方式发送快照,则必须先回滚接收文件系统。
请参考以下示例。首先更改文件系统,如下所示:
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 receive 命令所指定的增量源不匹配的其他文件系统名称,则回滚和接收都无法完成,并且会返回以下错误消息。
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
您可以发送带有特定文件系统属性值的 ZFS 快照流,但在接收快照流时,可以指定不同的本地属性值。或者,您可以指定收到快照流时使用原始属性值以重新创建原始文件系统。此外,收到快照流时,还可以禁用文件系统属性。
在某些情况下,发送流中的文件系统属性可能不适用于接收方文件系统,或者本地文件系统属性(如 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 选项可发送所有后代文件系统的复制流。接收复制流时,所有属性、快照、后代文件系统和克隆都将被保留。
使用这两个选项发送增量复制流。
对属性所做的更改得到保留,就像快照和文件系统的 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。