What You See Is What You Get Element

使用 ZFS 快照

适用于 Oracle Solaris 11.1

作者:Alexandre Borges

本文是系列文章的第 6 部分,介绍 Oracle Solaris 11.1 中 ZFS 的关键特性,并提供分步过程说明如何使用这些特性。本文重点介绍如何使用 ZFS 快照创建文件系统的只读副本,然后将快照流从一个系统传递到另一个系统。


2014 年 5 月发布


右箭头 第 1 部分 — 使用 COMSTAR 和 ZFS 配置虚拟化存储环境
右箭头 第 2 部分 — 使用交换监视和使用 ZFS 卷扩大交换空间
右箭头 第 3 部分 — 使用 ZFS 影子迁移
右箭头 第 4 部分 — 将 ZFS 数据集委托给非全局区域
右箭头 第 5 部分 — 使用 ZFS 加密
右箭头 第 6 部分 — 使用 ZFS 快照

过去 5 年,我一直在从事备份软件工作。众所周知,创建备份可为所有环境提供基本安全底线。但对备份概念的理解和运用并不像大家通常所认为的那么简单。

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

:使用 ZFS 快照创建数据副本非常简单、轻松。如果需要按文件恢复、备份介质验证和介质管理功能,可以考虑使用企业备份解决方案。

幸运的是,Oracle Solaris 11(及 Oracle Solaris 10 版本)提供了一些简单但非常有用的命令,可以帮助我们保存数据副本:zfs sendzfs recv。此外,因为 zfs sendzfs recv 的所有操作都基于接收到的用于重新创建文件系统的 ZFS 快照流,所以它们不能单独工作。

对于不熟悉快照概念的人来说,快照就是文件系统的“照片”。快照通常是只读的,此特性让我们可以创建文件系统的时间点副本。

而且,快照最初只占用少量空间;只有从原始文件系统删除或更改文件和目录之后,才开始占用空间。这是因为写入时复制 (COW) 的概念,COW 意味着快照最初保存的是一组指向原始文件和目录(如 f1f2f3f4)的指针,当原始文件系统发生更改(如 f1'f2'f3'f4')时,必须保存文件以保持与创建快照时相同的状态(f1f2f3f4)。

必须强调的一点是,使用快照流时保存的是整个文件系统,不可能从流中排除任何个别的目录,甚至不能选择任何单个文件或目录来恢复。

创建快照很简单。首先,我们创建一个新池,然后在该池中创建一个文件系统,然后在该文件系统中填充一些文件:

root@solaris11-1:~# zpool create snap_pool c8t3d0
root@solaris11-1:~# zfs create snap_pool/fs_1
root@solaris11-1:~# cp /etc/[a-m]* / snap_pool/fs_1            
root@solaris11-1:~# zfs list -r snap_pool
NAME             USED  AVAIL  REFER  MOUNTPOINT
snap_pool       84.3M  78.2G    32K  /snap_pool
snap_pool/fs_1  84.2M  78.2G  84.2M  /snap_pool/fs_1

现在需要使用 zfs snapshot 命令创建快照:

root@solaris11-1:~# zfs snapshot snap_pool/fs_1@snap1
root@solaris11-1:~# zfs list -r snap_pool
NAME                   USED  AVAIL  REFER  MOUNTPOINT
snap_pool             80.8M  78.2G    32K  /snap_pool
snap_pool/fs_1        80.7M  78.2G  80.7M  /snap_pool/fs_1

嗯……遗憾的是,默认情况下不会列出快照,但我们可以通过一个属性启用该特性:

root@solaris11-1:~# zpool listsnapshots=on snap_pool
root@solaris11-1:~# zfs list -r snap_pool
NAME                   USED  AVAIL  REFER  MOUNTPOINT
snap_pool             80.8M  78.2G    32K  /snap_pool
snap_pool/fs_1        80.7M  78.2G  80.7M  /snap_pool/fs_1
snap_pool/fs_1@snap1      0      -  80.7M  -

为了证实快照的神奇功能,删除一些(以“i”打头的)文件,然后回滚快照,显示所有文件均被恢复:

root@solaris11-1:~# cd /snap_pool/fs_1/
root@solaris11-1:/snap_pool/fs_1# ls -al [f-j]*
-rw-r--r--   1 root     root        6967 Dec  9 21:56 format.dat
-rw-r--r--   1 root     root         209 Dec  9 21:56 ftpusers
-rw-r--r--   1 root     root       10834 Dec  9 21:56 gnome-vfs-mime-magic
-rw-r--r--   1 root     root         420 Dec  9 21:56 group
-rw-r--r--   1 root     root         393 Dec  9 21:56 hba.conf
-rw-r--r--   1 root     root          27 Dec  9 21:56 hostid
-rw-r--r--   1 root     root         357 Dec  9 21:56 hosts
-rw-r--r--   1 root     root         394 Dec  9 22:06 ima.conf
-rw-r--r--   1 root     root         812 Dec  9 22:06 inetd.conf
-rw-r--r--   1 root     root         955 Dec  9 22:06 inittab
-rw-r--r--   1 root     root          39 Dec  9 22:06 ioctl.syscon
-rw-r--r--   1 root     root         596 Dec  9 22:06 iu.ap

root@solaris11-1:/snap_pool/fs_1# rm i*
root@solaris11-1:/snap_pool/fs_1# ls -al [f-j]*
-rw-r--r--   1 root     root        6967 Dec  9 21:56 format.dat
-rw-r--r--   1 root     root         209 Dec  9 21:56 ftpusers
-rw-r--r--   1 root     root       10834 Dec  9 21:56 gnome-vfs-mime-magic
-rw-r--r--   1 root     root         420 Dec  9 21:56 group
-rw-r--r--   1 root     root         393 Dec  9 21:56 hba.conf
-rw-r--r--   1 root     root          27 Dec  9 21:56 hostid
-rw-r--r--   1 root     root         357 Dec  9 21:56 hosts

root@solaris11-1:/snap_pool/fs_1# cd
root@solaris11-1:~# zfs rollback snap_pool/fs_1@snap1
root@solaris11-1:~# cd /snap_pool/fs_1/
root@solaris11-1:/snap_pool/fs_1# ls -al [f-j]*
-rw-r--r--   1 root     root        6967 Dec  9 21:56 format.dat
-rw-r--r--   1 root     root         209 Dec  9 21:56 ftpusers
-rw-r--r--   1 root     root       10834 Dec  9 21:56 gnome-vfs-mime-magic
-rw-r--r--   1 root     root         420 Dec  9 21:56 group
-rw-r--r--   1 root     root         393 Dec  9 21:56 hba.conf
-rw-r--r--   1 root     root          27 Dec  9 21:56 hostid
-rw-r--r--   1 root     root         357 Dec  9 21:56 hosts
-rw-r--r--   1 root     root         394 Dec  9 22:06 ima.conf
-rw-r--r--   1 root     root         812 Dec  9 22:06 inetd.conf
-rw-r--r--   1 root     root         955 Dec  9 22:06 inittab
-rw-r--r--   1 root     root          39 Dec  9 22:06 ioctl.syscon
-rw-r--r--   1 root     root         596 Dec  9 22:06 iu.ap

将快照流发送到第二台 Oracle Solaris 11 主机 (solaris11-2) 之前,必须在第二台主机上创建一个名为 backup_pool 的池。然后可以启动 ZFS send 流流程:

root@solaris11-1:~# ssh solaris11-2
Password:
Last login: Mon Dec  9 18:42:02 2013
Oracle Corporation      SunOS 5.11      11.1    September 2012

root@solaris11-2:~# zpool create backup_pool c8t3d0        
root@solaris11-2:~# zpool list backup_pool
NAME          SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
backup_pool  3.97G    85K  3.97G   0%  1.00x  ONLINE  -

root@solaris11-1:~# zfs send snap_pool/fs_1@snap1 | ssh solaris11-2 zfs recv -F backup_pool/fs_1_backup
Password:

root@solaris11-2:~# zpool list      
NAME               SIZE  ALLOC   FREE  CAP  DEDUP  HEALTH  ALTROOT
backup_pool       3.97G  80.8M  3.89G   1%  1.00x  ONLINE  -
repo_pool         15.9G  7.64G  8.24G  48%  1.00x  ONLINE  -
rpool             79.5G  28.4G  51.1G  35%  1.00x  ONLINE  -
softtoken_pool_2  3.97G   193K  3.97G   0%  1.00x  ONLINE  -
softtooken_pool   3.97G   194K  3.97G   0%  1.00x  ONLINE  -
solaris11-2-pool  3.97G   540M  3.44G  13%  1.00x  ONLINE  -

root@solaris11-2:~# zfs list -r backup_pool
NAME                      USED  AVAIL  REFER  MOUNTPOINT
backup_pool              80.8M  3.83G    32K  /backup_pool
backup_pool/fs_1_backup  80.7M  3.83G  80.7M  /backup_pool/fs_1_backup

root@solaris11-2:~# cd /backup_pool/fs_1_backup
root@solaris11-2:/backup_pool/fs_1_backup# ls -l
total 165286
-rw-r--r--   1 root     root        1436 Dec  9 21:56 aliases
-rw-r--r--   1 root     root         182 Dec  9 21:56 auto_home
-rw-r--r--   1 root     root         220 Dec  9 21:56 auto_master
-rw-------   1 root     root     84034034 Dec  9 21:53 core
-rw-r--r--   1 root     root        1931 Dec  9 21:56 dacf.conf
-r--r--r--   1 root     root         516 Dec  9 21:56 datemsk
...

ZFS 依然很棒。使用文件系统的快照 (snap_pool/fs_1@snap1) 生成文件系统 snap_pool/fs_1 的备份,将其发送到第二台主机 (solaris11-2) 上的 /backup_pool 中。存在于第一台主机上的现在也存在于第二台 Oracle Solaris 11 主机上。

以几乎相同的方式测试 ZFS 接收功能。为了说明这一点,第一台主机 (solaris11-1) 上删除了一些文件,并销毁了 snap_pool/fs_1 的现有快照:

root@solaris11-1:~# rm /snap_pool/fs_1/[d-j]*
root@solaris11-1:~# zfs list -r snap_pool
NAME                   USED  AVAIL  REFER  MOUNTPOINT
snap_pool              162M  78.1G    34K  /snap_pool
snap_pool@snap1       80.7M      -  80.7M  -
snap_pool/fs_1        80.7M  78.1G  80.6M  /snap_pool/fs_1
snap_pool/fs_1@snap1   114K      -  80.7M  -

root@solaris11-1:~# zfs destroy snap_pool/fs_1@snap1

然后,在第二台主机 (solaris11-2) 上执行接收过程:

root@solaris11-2:~# zpool set listsnapshots=on backup_pool
root@solaris11-2:~# zfs list -r backup_pool
NAME                            USED  AVAIL  REFER  MOUNTPOINT
backup_pool                    80.8M  3.83G    32K  /backup_pool
backup_pool/fs_1_backup        80.7M  3.83G  80.7M  /backup_pool/fs_1_backup
backup_pool/fs_1_backup@snap1      0      -  80.7M  -

root@solaris11-2:~# zfs send -Rv backup_pool/fs_1_backup@snap1 | ssh solaris11-1 zfs recv -F snap_pool/fs_1
sending from @ to backup_pool/fs_1_backup@snap1
Password:
root@solaris11-2:~#

返回第一台主机,列出 snap_pool/fs_1 文件系统中的文件:

root@solaris11-1:~# ls -al /snap_pool/fs_1/
total 165288
drwxr-xr-x   2 root     root          40 Dec  9 22:06 .
drwxr-xr-x   3 root     root           3 Dec 10 01:08 ..
-rw-r--r--   1 root     root        1436 Dec  9 21:56 aliases
-rw-r--r--   1 root     root         182 Dec  9 21:56 auto_home
-rw-r--r--   1 root     root         220 Dec  9 21:56 auto_master
-rw-------   1 root     root     84034034 Dec  9 21:53 core
-rw-r--r--   1 root     root        1931 Dec  9 21:56 dacf.conf
-r--r--r--   1 root     root         516 Dec  9 21:56 datemsk
-r--------   1 root     root        5900 Dec  9 21:53 delegated_zone.xml
...

不可思议。这些文件回到 snap_pool/fs_1 文件系统。

另请参见

以下是我撰写的其他一些文章的链接:

以下是有关 Oracle Solaris 11 的一些资源:

关于作者

Alexandre Borges 是一位 Oracle ACE,曾于 2001 至 2010 年任职于 Sun Microsystems,并担任签约讲师,主要负责讲授 Oracle Solaris、Oracle Solaris Cluster、Oracle Solaris 安全性、Java EE、Sun 硬件和 MySQL 课程。目前,他为 Symantec、Oracle 合作伙伴、Hitachi 和 EC-Council 提供课程教学,并且讲授一些关于信息安全的非常专业的课程。此外,他还是 Linux Magazine Brazil 的特约撰稿人和专栏作家。

修订版 1.0,2014 年 5 月 1 日

关注我们:
博客 | Facebook | Twitter | YouTube