文章
服务器与存储管理
作者:Alexandre Borges
2014 年 5 月发布
第 1 部分 — 使用 COMSTAR 和 ZFS 配置虚拟化存储环境
第 2 部分 — 使用交换监视和使用 ZFS 卷扩大交换空间
第 3 部分 — 使用 ZFS 影子迁移
第 4 部分 — 将 ZFS 数据集委托给非全局区域
第 5 部分 — 使用 ZFS 加密
第 6 部分 — 使用 ZFS 快照
过去 5 年,我一直在从事备份软件工作。众所周知,创建备份可为所有环境提供基本安全底线。但对备份概念的理解和运用并不像大家通常所认为的那么简单。
|
注:使用 ZFS 快照创建数据副本非常简单、轻松。如果需要按文件恢复、备份介质验证和介质管理功能,可以考虑使用企业备份解决方案。
幸运的是,Oracle Solaris 11(及 Oracle Solaris 10 版本)提供了一些简单但非常有用的命令,可以帮助我们保存数据副本:zfs send 和 zfs recv。此外,因为 zfs send 和 zfs recv 的所有操作都基于接收到的用于重新创建文件系统的 ZFS 快照流,所以它们不能单独工作。
对于不熟悉快照概念的人来说,快照就是文件系统的“照片”。快照通常是只读的,此特性让我们可以创建文件系统的时间点副本。
而且,快照最初只占用少量空间;只有从原始文件系统删除或更改文件和目录之后,才开始占用空间。这是因为写入时复制 (COW) 的概念,COW 意味着快照最初保存的是一组指向原始文件和目录(如 f1、f2、f3 和 f4)的指针,当原始文件系统发生更改(如 f1'、f2'、f3' 和 f4')时,必须保存文件以保持与创建快照时相同的状态(f1、f2、f3 和 f4)。
必须强调的一点是,使用快照流时保存的是整个文件系统,不可能从流中排除任何个别的目录,甚至不能选择任何单个文件或目录来恢复。
创建快照很简单。首先,我们创建一个新池,然后在该池中创建一个文件系统,然后在该文件系统中填充一些文件:
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 日 |