Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25881577
  • 博文数量: 271
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-12 15:28
文章分类

全部博文(271)

文章存档

2010年(71)

2009年(164)

2008年(36)

我的朋友

分类:

2009-09-08 20:16:00

文档选项
将打印机的版面设置成横向打印模式

将此页作为电子邮件发送

将此页作为电子邮件发送

未显示需要 JavaScript 的文档选项


王 荣, 技术支持工程师, IBM 科技产品(深圳)有限公司

2008 年 2 月 28 日

随着 AIX V6.1 的发布,使用 IBM System p 系列服务器的客户将能体会到新系统所带来的强大的功能和更高的安全性、稳定性。本文将介绍在 AIX 6 系统中 JFS2 文件系统分区的快照功能以及一些使用技巧。

您可以通过以下的资源了解更多的 AIX 6 的新特性:

AIX 中 JFS2 文件系统分区(enhanced journaled file system),是自 AIX V5.2L 引入的增强的日志文件系统分区,相比上一代文件系统分区(JFS),其动态扩展性以及支持的最大文件大小和容量都有较大的提高,并且也增加了一些实用功能,比如:外部快照。在 AIX 6 中 JFS2 功能得到进一步加强,主要改进有三个方面:内部快照功能,关闭文件系统分区日志,文件系统分区加密。本文将就文件系统分区快照功能做一个简单介绍。

JFS2 文件系统分区快照类似于存储的快照功能,就是将某个时刻的文件系统分区状态和数据保存成一个映像,就像是使用‘相机’将某个时刻的硬盘上的数据状态捕捉下来。快照功能的主要作用是在于保持各系统文件时间点的一致性。假如我们需要备份一个系统,该系统中有多个文件间的数据具有相关性,并且这些文件经常被读写。如果采用普通的备份方式的话,由于备份需要较长时间以及文件备份先后顺序的关系,会破坏这多个文件间的数据一致性,导致无效的备份。而使用快照备份方式就可以避免这一问题。在存储中快照还会被用来做一些远程灾备的异步备份。

JFS2 文件系统分区的快照与存储不同地方在于,它是基于“文件系统块”级别的操作,也就是它只会监控文件系统级的 IO 操作。




在 AIX V6.1 以前 JFS2 的快照功能需要使用一个额外的 LV 来保存快照镜像,所以也被称之为外置快照。在 AIX V5.2L 以上版本的 JFS2 文件系统都默认支持该功能。保存快照的 LV 可以使用现有的未被使用的 LV,也可以在创建快照时自动创建新的 LV。每个 JFS2 文件系统分区的外置快照数最大支持 15 个;每个快照都需要占用一个 LV。在用户需要查看某一快照内容时,其访问方式类似于文件系统分区,也就是将指定快照 LV 挂载在某一目录下进行访问。

在 AIX V6.1 上,JFS2 文件系统分区保持了外置快照功能的支持,同时新增加了的内置快照的方式。所谓内置快照,即将所有快照镜像保存在同一 LV 上,不需要使用额外的 LV。最大支持的快照数提高到 64 个。所有快照内容都可以通过 /mountpoint/.snapshot/ 这一目录下直接访问,不要再手动挂载。内置快照功能不是默认属性,在创建 JFS2 文件系统分区时需要特别声明。原有的 JFS2 文件系统分区想升级支持内置快照,需要先删除然后重新创建。

通过实现快照的“内置”,大大降低了快照功能的复杂性,相应的也提高了其可管理性。总得来说内置有下面几个主要的优势。

  • 访问快照不再需要使用 root 账户。由于不需要使用 root 权限挂载快照 LV,所以普通用户也可以依照原有权限去访问快照内容。
  • 管理更简单,更易操作。使用内部空间保存快照,无需管理额外的快照 LV,也减少了访问快照的相关操作。
  • 通过 NFS 共享快照内容更方便,快照与文件系统分区在同一个挂载目录 (mount point)下可以一同 export 给用户。




回页首


下面将介绍使用 snapshot 的基本命令参数。在 AIX 中,快照的相关操作都是同过 snapshot 这个命令来完成的。

创建一个外置的快照

在 AIX V5.2L 以后我们可以为任意现有的 JFS2 文件系统分区创建一个外置的快照

例如:为根目录(/)创建一个快照。通过 -o snapfrom 参数指定被快照的系统分区对象, -o size 指定创建的快照 LV 的大小。

# snapshot -o snapfrom=/ -o size=128M
Snapshot for file system / created on /dev/fslv04

我们先通过 snapfrom 指定快照的对象,然后通过 size 参数指定自动生成的快照 lv 的大小。自动生成的 lv 名称是 fslv04。

我们还可以通过利用现有 lv 来创建快照。例如已有一个闲置的 lv fslv04。

# snapshot -o snapfrom=/ /dev/fslv04
Snapshot for file system / created on /dev/fslv04

查询快照状态
我们可以通过 -q 参数查询当前快照状态及剩余空间大小,当 Free 的块太少时,我们可以用–o size 参数改变快照的空间大小。

# snapshot -q /
Snapshots for /
Current Location 512-blocks Free Time
* /dev/fslv04 65536 58112 Fri Jan 4 22:49:59 2008

挂载快照

我们将快照 fslv00 mount 在 /mnt 目录下,并查看其内容。

# mount -o snapshot /dev/fslv00 /mnt/* 挂载快照 */
# ls /mnt/* 列出快照内容 */
.SPOT dev smit.log
.image.data.removetag etc smit.script
.profile export smit.transaction
.rhosts home test
.rhosts.nim lib tftpboot
.rhosts.prev lost+found tmp
.sh_history lpp u
.snapshot mnt unix
.vi_history opt usr
admin pconsole var
audit proc
bin sbin

删除快照

我们为根目录创建了 2 个快照,我们已经不需要 fslv00 这个快照,我们可以通过以下命令删除,删除前请检查是否已经 umount 该快照。注意:在删除操作时,如果要删除某一时间点的快照,那么该时间点之前的快照都将自动移除,比如我们删除 fslv04 这个快照,那么 fslv00 也将自动移除。

# snapshot -d /dev/fslv00
rmlv: Logical volume fslv00 is removed.

创建一个内置快照

内置快照与外置不同,不需要使用 lv 设备保存快照信息,所以命令的参数也略有不同。内置快照使用快照名来定义每一个快照。内置快照功能需要在创建文件系统分区的时候申明,否则默认不支持,并且也无法通过 chfs 直接打开该功能,需要删除并重新创建文件系统分区。创建内置快照的命令参数需要通过 -n 来制定一个快照名,无需创建快照 LV。

# mkdir /tmp/test/* 创建文件分区挂载点 */
# crfs -v jfs2 -m /tmp/test -a isnapshot=yes -a size=256M -g rootvg 
File system created successfully./* 创建新的分区 . 并打开 snapshot 功能 */
261932 kilobytes total disk space.
New File System size is 524288
# mount /tmp/test/* 挂载新创建的分区 */
# echo "this's snapshot one" > /tmp/test/data /* 创建一个数据文件 , 用来校验快照功能 */
# snapshot -o snapfrom=/tmp/test -n snapshot00/* 创建一个快照 , 快照名为 snapshot00 */
Snapshot for file system /tmp/test created on snapshot00

查看内置快照状态

内置快照状态查询方式与外置快照相同,不同的是,内置快照不会显示可用的快照空间,这是因为内置快照使用的是文件系统分区内的资源空间。查看快照可用空间与查看分区相同使用 df 命令。当文件系统分区空间不足时,该分区的快照信息将自动全部删除,并在错误日志里添加一条记录。

# snapshot -q /tmp/test
Snapshots for /tmp/test
Current Name Time
* snapshot00 Fri Jan 4 20:29:18 2008

访问快照文件内容

内置快照可以实时的在挂载点的 ./.snapshot 目录下查看,该目录处于隐藏状态。通过 ls,find 等命令都无法列出该快照下的内容信息。在 .snapshot 目录下各个快照保存在不同的目录下,目录名同快照名。

# ls -al
total 16
drwxr-xr-x 3 root system 256 Jan 4 20:27 .
drwxrwxrwt 10 bin bin 4096 Jan 4 20:25 ..
-rw-r--r-- 1 root system 20 Jan 4 20:27 data
drwxr-xr-x 2 root system 256 Jan 4 20:22 lost+found
# rm data/* 删除数据文件 */ 
# cd /tmp/test/.snapshot/* 进入快照目录 */
# ls/* 列出快照 */
snapshot00
# cat snapshot00/data/* 显示’已删除的数据内容’ */
this's snapshot one
#

删除内置快照

# snapshot -d -n snapshot00 /tmp/test
# snapshot -q /tmp/test
/tmp/test has no snapshots.





回页首


下面我们将介绍两个快照在实际应用中的例子。Snapshot 功能最普遍的应用还是在于数据的备份,另外也可以根据其快照(point in time) 的特性用来监控文件内容的变化,我们在第二个例子中就采用快照来追踪系统中重要的配置文件的变更。

使用快照备份系统最常见的步骤就是,先创建一个快照,然后使用备份工具或备份命令来备份数据。AIX 提供了一个快捷的备份命令 Backsnap 将这两个步骤合二为一。Backsnap 可以看成是 snapshot 和 backup 两个命令的结合。

内置快照的备份

先创建一个快照名 snapshotback,备份完,仍保留该快照。下面我们通过一个例子来介绍 backsnap 的使用,我们将备份挂载在 /tmp/lv 的一个文件分区。我们通过 -n 参数指定将要创建的快照的名称,通过 -f 参数指定备份的位置,通过 -f 可以指定一个文件名,也就是备份到文件,还可以指定一个设备名,将系统备份到设备(如磁带机–f /dev/rmt0)

# backsnap -n snapshotback -f/tmp/test.bak /tmp/test
Snapshot for file system /tmp/test created on snapshotback
backup: Date of this level 9 backup: Fri Jan 4 21:19:43 2008
backup: Date of last level 0 backup: the epoch
backup: Backing up /tmp/test/.snapshot/snapshotback (/tmp/test) to /tmp/test.bak
backup: File system still mounted, inconsistent data possible
backup: Mapping (Pass I) [regular files]
backup: Mapping (Pass II) [directories]
backup: estimated 49 1k blocks.
backup: Backing up (Pass III) [directories]
backup: Backing up (Pass IV) [regular files]
backup: 52 1k blocks on 1 volume(s)
backup: Backup is complete
#

外置快照的备份

我们先创建一个快照,将根分区备份到 /tmp/root.bak, 加上 -R 参数备份后删除快照。使用外置快照备份,我们需要指定外置快照 LV 的大小和挂载位置,分别用 -m 和 -s 来制定。-f 参数定义同内置快照。

# backsnap -R -m /mnt -s size=32M -f /tmp/root.bak / 
Snapshot for file system / created on /dev/fslv05
backup: Date of this level 9 backup: Fri Jan 4 21:23:01 2008
backup: Date of last level 0 backup: the epoch
backup: Backing up /dev/rfslv05 to /tmp/root.bak
backup: Mapping (Pass I) [regular files]
backup: Mapping (Pass II) [directories]
backup: estimated 128315 1k blocks.
backup: Backing up (Pass III) [directories]
backup: Backing up (Pass IV) [regular files]
backup: 127982 1k blocks on 1 volume(s)
backup: Backup is complete
rmlv: Logical volume fslv04 is removed.
rmlv: Logical volume fslv05 is removed.
#

快照功能就是将某一文件分区的某一时刻的文件信息状态保存下来。我们可以利用这一功能来监控系统配置文件的状态与内容。系统中的配置文件一般都是放在 /etc 目录下,我们在安装配置好服务器后,可以通过创建一个 /etc 目录的快照来保存的系统配置信息。在系统发生异常或系统配置文件被误改时,可以用来快速的修复系统,以及监控系统状态的改变。

创建文件系统快照

因为 /etc 目录并没有保存在独立的 lv 下,而是放在根目录的空间里,所以我们要首先创建根目录的快照镜像,并将快照挂载到 /mnt 目录下面。

# snapshot -o snapfrom=/ -o size=128m
Snapshot for file system / created on /dev/fslv04
# mount -o snapshot /dev/fslv04 /mnt

接下来我们可以手动的比较 /etc 和 /mnt/etc 目录下的相对应的文件有何异同,也可以使用 diff 命令来对比整个目录文件。比如 diff –r /etc /mnt/etc 2>/dev/null。使用 diff 命令简单快捷,但是因为 /etc 目录下还保存有一些二进制文件并经常改变,使用 diff 命令将会在屏幕输出很多乱码,不方便识别。我在下面写了一个简单 perl 脚本用来识别文本配置文件,然后再进行比对。脚本如下:

# cat diff.sh
#!/usr/bin/perl
# 执行方法 ./ diff.sh DIR1 DIR2 该脚本将比较 DIR1 与 DIR2 目录中的同名文件异同。
# 检查输入的目录名 DIR1 与 DIR2 是否存在,如不存在立即退出。
-e $ARGV[0] || die "Warning,Directory $ARGV[0] doesn't exist\n";
-e $ARGV[1] || die "Warning,Directory $ARGV[1] doesn't exist\n";
# 将 DIR1 目录中的所有文件通过 find 命令列出到文件,并作为文件方式打开。
open CONFIG,"find $ARGV[0] |";
# 依次从 CONFIG 文件读取出各文件名(包括路径)
foreach () {
 chomp;
# 通过 file 命令检查该文件的属性,是否是文本文件。
 $type=`file $_`;
 if ((!( $type =~ /data/i) && $type =~ /text/i)|| $type =~ /shell/i )
{
 $base=length($ARGV[0]);
 $extend=substr($_,$base);
 $extend=$ARGV[1] . $extend;
# 通过 diff 命令分析文件内容差异并输出到屏幕。
 $diffs=`diff -c $_ $extend`;
 		 if ( $? != 0 && $diffs ne '' )
 {
 print "$diffs \n";
 }
 }
}

我们使用该脚本来做一些测试,因为我们刚创建的快照,所有快照内容与原目录内容是一致的,diff.sh 将不会有任何输出。

# ./diff.sh /etc /mnt/etc
#

下面我们改变 /etc/hosts 文件中的信息,再重新对比一次。文件的对比实际上还是调用 diff 命令,所以输出格式也是依照 diff 命令的输出风格。

# echo "192.168.21.100 vios" >> /etc/hosts /* 在 /etc/hosts 文件中插入一条信息 */ 
# ./diff.sh /mnt/etc /etc
*** /mnt/etc/hosts Sat Dec 29 17:53:58 2007
--- /etc/hosts Fri Jan 4 22:29:55 2008
***************
*** 54,56 ****
--- 54,57 ----
 192.168.21.130 AIX01
 192.168.21.136 aixjs21
 192.168.21.134 aix6lpar aix6
+ 192.168.21.100 vios/* 对比发现在当前 hosts 文件中增加了一条记录 */
#

在 AIX 系统中有些服务进程的 PID 文件也是放在 /etc 目录下,而且也是保存成文本文件,所以如果某一服务进程中断或者被重启,我们也将能够监控得到。我们下面再做一些测试。

# cp /mnt/etc/hosts /etc/hosts /* 恢复 hosts 文件 */

# vi /etc/hosts /* 编辑 hosts 文件,删掉最后一条记录 */

# rm /etc/motd /* 删除一个配置文件 */

# stopsrc -s syslogd /* 关闭然后重启 syslogd 服务 */

0513-044 The syslogd Subsystem was requested to stop.

# startsrc -s syslogd

0513-059 The syslogd Subsystem has been started. Subsystem PID is 200810.

# ./diff.sh /mnt/etc /etc/* 执行 diff.sh */

*** /mnt/etc/hosts Fri Jan 4 22:29:55 2008

--- /etc/hosts Fri Jan 4 23:13:18 2008

***************

*** 53,56 ****

192.168.7.63 js20a1

192.168.21.130 AIX01

192.168.21.136 aixjs21

- 192.168.21.134 aix6lpar aix6 /* 发现 hosts 被修改 */

--- 53,55 ----

diff: /etc/motd: No such file or directory /* 发现有被删除文件 */

*** /mnt/etc/syslog.pid Sat Dec 29 17:42:42 2007 /* 发现服务进程 ID 号改变 */

--- /etc/syslog.pid Fri Jan 4 23:17:22 2008

***************

*** 1 ****

! 200808

--- 1 ----

! 200810

我们可以看到,通过快照功能加上一些文件内容比较工具—(文中提供的脚本提供的功能并不十分完善 , 可按需自行修改),我们能够很好的监控到系统配置文件是否变更和删除,一方面能快速定位问题,另一方面也能够为快速修复系统提供帮助。





回页首


  • 支持了内置快照的文件系统分区仍然可以使用外置快照,但是这两种功能是互斥的,同时只能使用某一种快照方式。
  • 在创建文件系统分区时可以设定是否支持内置快照,一经设定无法更改。
  • 如果 fsck 命令检测到错误,必须修改文件系统,那么快照将被 fsck 删除。
  • 创建了快照的文件系统不能动态缩小。
  • 在支持内置快照的文件系统分区无法执行 Defragfs,也不建议在创建了外置快照的分区执行 defragfs。
  • 一般快照会占用原文件分区 2-6% 的空间大小,一些较活跃的分区可能会达到 15%。
  • 快照映像只允许读,不可以写。
  • 在创建了快照的文件系统分区中,写操作将受到一定性能影响,但是对读操作没有影响。
  • 快照空间不够时,所有快照将会被自动删除。




回页首


总的来说,在 AIX 中提供的文件系统快照功能非常简单易用。无需加装额外的软件,所有功能都能通过一个命令完成。提供了两种不同的快照方式,适用不同的客户环境与需求。同时,AIX 快照功能也能降低用户的成本。此功能已足够满足客户的一般备份需求,无需为了使用快照功能而使用存储设备,或可以减免存储快照功能的许可费用。另外,在快照的使用上,AIX 文件系统级的快照也要比存储的快照方便的多。

阅读(749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~