JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11.1 管理:ZFS 文件系统     Oracle Solaris 11.1 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  Oracle Solaris ZFS 文件系统(介绍)

2.  Oracle Solaris ZFS 入门

3.  管理 Oracle Solaris ZFS 存储池

4.  管理 ZFS 根池组件

5.  管理 Oracle Solaris ZFS 文件系统

6.  使用 Oracle Solaris ZFS 快照和克隆

ZFS 快照概述

创建和销毁 ZFS 快照

保持 ZFS 快照

重命名 ZFS 快照

显示和访问 ZFS 快照

ZFS 快照的磁盘空间记帐

回滚 ZFS 快照

确定 ZFS 快照的差异 (zfs diff)

ZFS 克隆概述

创建 ZFS 克隆

销毁 ZFS 克隆

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

发送和接收 ZFS 数据

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

识别 ZFS 快照流

发送 ZFS 快照

接收 ZFS 快照

向 ZFS 快照流应用不同的属性值

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

远程复制 ZFS 数据

7.  使用 ACL 和属性保护 Oracle Solaris ZFS 文件

8.  Oracle Solaris ZFS 委托管理

9.  Oracle Solaris ZFS 高级主题

10.  Oracle Solaris ZFS 故障排除和池恢复

11.  归档快照和根池恢复

12.  建议的 Oracle Solaris ZFS 做法

A.  Oracle Solaris ZFS 版本说明

索引

发送和接收 ZFS 数据

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

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

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

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

有关 ZFS 和第三方备份产品的问题的最新信息,请参见 Oracle Solaris 11 发行说明。

识别 ZFS 快照流

通过使用 zfs send 命令,可以将 ZFS 文件系统或卷的快照转换为快照流。然后,可以使用快照流重新创建 ZFS 文件系统或卷(通过 zfs receive 命令)。

根据用于创建快照流的 zfs send 选项,将生成不同类型的流格式。

流数据包是包含一个或多个完整流或增量流的流类型。存在以下三种类型的流数据包:

发送 ZFS 快照

可以使用 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 文件系统必须已经存在,增量接收才能成功。


注 - 访问原始接收文件系统中的文件信息可能导致增量快照接收操作失败,并显示类似于以下的消息:

cannot receive incremental stream of tank/dana@snap2 into newtank/dana: 
most recent snapshot of tank/dana@snap2 does not match incremental source

如果需要访问原始接收文件系统中的文件信息,同时还需要将增量快照接收到该接收文件系统中,请考虑将 atime 属性设置为 off。


可将增量 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 快照

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

例如:

# 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 快照流应用不同的属性值

您可以发送带有特定文件系统属性值的 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/datacompression 值为 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 快照流

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

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

示例 6-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