大多数 UNIX 管理员都有相应的方法来备份 UNIX 计算机中的数据和信息,但对于配置文件和提供计算机运行所需配置数据的其他内容,又应该如何处理呢?本文提供了相关技术的详细信息,这些技术用于针对关键的文件,实现有效和高效的备份系统。
关于本系列
通常,UNIX 管理员都拥有一套常用的辅助进程管理的关键实用工具、诀窍和系统。本文提供了各种用于简化各个过程的关键实用工具、命令行链和脚本。这些工具中的一部分来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员的工作压力的要求。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具,包括简化异类环境中的管理任务的方法。
确定关键的文件
在对 UNIX 系统建立备份时,最重要的是其中包含的数据。无论是数据库、开发源代码文件或其他类型的所谓用户生成的 信息,备份这些数据都是很重要的,它们可以确保在出现故障或其他问题的情况下,您可以恢复这些数据,并重新回到工作中。
然而,系统中存在大量这样的文件和信息,从技术上看它们并不是用户数据,但这些文件可能需要耗费相当长的时间进行重建或者重新配置。例如,重新配置服务器或为您的域重建域名系统 (DNS) 文件需要多长时间?
完全备份,即复制系统中所有的文件,很明显这样做可以保存所有的信息,但这可能是一种代价很大的信息备份方式。您应该能够通过挑选那些配置、生成或支持相关信息和应用程序的特定文件,从而创建有效的备份。
在 UNIX 或 Linux 系统中,大部分系统配置文件位于 /etc 目录,但是您应该考虑对所有可能的文件(以及可能的位置)进行备份,具体包括:
* 主配置目录 (/etc)
* DNS 域信息 (/var/bind)
* NIS/NIS+ 文件和配置 (/var/yp)
* Apache 或其他 Web 服务器配置(/var/apache、/etc/apache 或 /usr/local/apache)
* 邮件文件或文件夹(/var/mail 和 /usr/mail)
* Lightweight Directory Access Protocol (LDAP) 服务器数据(/var/ldap 或 /usr/local/ldap)
* 安全证书
* 自定义内核驱动程序
* 内核配置或构建配置和参数
* 许可密钥和序列号
* 自定义脚本和应用程序
* 用户/root 登录脚本
* 邮件配置;特别是,如果您使用了像 Cyrus Internet Message Access Protocol (IMAP) 这样的解决方案,其中对用户邮件文件夹进行了特殊的记录和索引
其他的文件和信息来源则取决于具体的系统和环境,但是提出这样一份关键配置文件的列表不应该耗费太长的时间,而如果丢失这些信息,将会对您的公司或系统造成极大的影响。
为进行存储而整理数据
尽管直接从数据的源位置对其进行备份非常方便,但是在对其进行备份之前,先将备份数据复制到一个单独的目录将使得您能够更好地选择要复制的文件,并且让您能够更灵活地选择合适的备份方法。如果文件位于同一个位置,那么您可以将其备份到磁带、磁盘,或将这些内容复制到另一台计算机,而无需对源文件进行重新组织。
要对备份到任何目标的文件进行重新配置,只需更改相应的脚本,而该脚本对这些文件进行整理并将其复制到备份准备目录。因为您拥有这些信息的本地的和直接的副本,所以在发生故障时可以快速和轻松地恢复这些数据,并且您依然保留了将这些信息备份到磁带、磁盘或另一个系统的能力。
信息的整理方式非常重要,因为不同的解决方案对应着不同的存储需求、技术和恢复机制。
记录信息的方法
您可以选择各种各样的方法来进行实际的备份和信息存储。显而易见的选择是将文件备份到传统媒介,如磁带。可以将相关信息复制到网络上的另一台计算机,这是一种比较简单的解决方案,但是存在许多优缺点。任何成功的备份解决方案都有一个关键要素,即在另一个位置保存重要信息的副本。无论是另一个物理设备、可移动存储设备或另一台计算机,都是可行的。
从灾难恢复的角度来看,可移动存储设备(磁带、磁盘、甚至 USB)是最可靠的备份,因为可以将所存储的信息保存在现场以外的其他位置。这样做可以在放置计算机的场所遭遇大灾难(如火灾或被盗)时,得以幸免。
使用另一台计算机进行存储则意味着备份数据基本上是联机的和可用的。在这种情况下,恢复备份数据可能非常简单,在发生故障时只需将这些文件复制回您的服务器,或者在发生系统故障时将它们复制到替换系统。
当使用另一台计算机来存储您的备份数据时,最好在本地保存这些文件的多个副本,但是应该在可能的情况下,为这些文件使用直接可用的非现场位置。这台计算机可能是 Internet 上的另一台计算机、您的 WAN 或其他站点上的另一台计算机。这样可以提供必要的冗余和安全性。
使用专业的或商业的备份解决方案,您需要在恢复备份数据之前,重新安装该软件,而在安装该软件之前,可能需要使用某些配置信息和关键文件。
使用 tar 存储备份数据
使用 tar、cpio 或其他的存档文件类型,可能是最直接的信息存储方式。当使用这种方法时,最好注明这些文件的日期,并创建一个简单的备份脚本,专门用来生成指定的文件。另一方面,您还需要一种方法,以便删除不再需要的备份数据(例如,那些超过了特定时间段的备份数据)。
清单 1 显示了一个简单的脚本,该脚本为不同的目录创建了经过 tar 处理和压缩(使用 bzip2)的备份。这些备份文件创建于与远程系统共享的网络文件系统 (NFS),而该远程系统保留了相应的备份副本。
清单 1. 为不同的目录创建经过 tar 处理和压缩的备份
-
#!/bin/bash
-
-
DATE=`date +%Y%m%d.%H%M`
-
HOST=`hostname`
-
-
TEMP=/mnt/backupprepare
-
-
echo "Preparing backup..."
-
-
cd $TEMP
-
-
files=`/usr/local/mcslp/filesbydate.pl notlast5days $HOST*`
-
if [ -n "$files" ]
-
then
-
echo "Deleting old files: $files"
-
rm $files
-
fi
-
-
cd /etc
-
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-etc.$DATE.tar.bz2
-
-
cd /var/bind
-
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-bind.$DATE.tar.bz2
-
-
cd /export/home/webs
-
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-webs.$DATE.tar.bz2
-
-
cd /etc/apache2
-
tar cf - ./* |bzip2 -9 - >$TEMP/$HOST-webconfig.$DATE.tar.bz2
复制代码
使用 date 命令生成 DATE 变量,并创建一个“20060627.2200”或“10PM on 27th of June 2006”形式的文件名。要使得备份脚本具有可移植性,要求创建的所有文件的前缀中包含创建该文件的主机的名称,这样一来就可以很容易地将多台主机的内容备份到相同的位置,并且 TEMP 目录作为每个备份的目标。
使用单独的 Perl 脚本来确定可以对备份准备目录中哪些文件进行删除。稍后将研究这个脚本。在这个脚本中,您可以指定需要保留最近 5 天的文件,换句话说,该脚本将根据备份文件的文件名中的日期说明,选择那些不是最近 5 天内创建的文件。
实际的备份过程是一个简单的 tar 命令,同时还使用了 bzip2 对文件进行压缩。因为生成的文件可能很大,所以您可能需要对这个方法进行改进,以便仅选择那些可能在某个时间段内进行过更改的文件。通过使用 find 命令选择所需的文件(请参见清单 2),您可以达到这个目的。
清单 2. 使用 bzip2 对文件进行压缩的 tar 命令
-
tar cf - `find . -type f -mtime -1` | bzip2 -9 -
-
>$TEMP/$HOST-webconfig.$DATE.tar.bz2
复制代码
您可以在 find 语句中仅指定需要选择的文件,这样可以防止对目录的更改导致将那些没有更改的文件包含到 tar 文件中。这将包含当前目录中的文件,如清单 3 所示。
清单 3. 引用当前目录
-
$ cd /etc
-
$ tar cf etc.tar ./*
复制代码
这样做可以避免显式地指定目录,如清单 4 所示。
清单 4. 避免显式地指定目录
这样可以确保将恢复的文件放到备用的目录,而不是运行中的某个位置。
这个用于删除旧文件的脚本将使用文件名,提取其中嵌入的日期和时间,并确定该文件是否属于指定的界限,例如,在不在特定的天数之内(请参见清单 5)。
清单 5. 用于删除旧文件的脚本
-
#!/usr/local/bin/perl
-
-
my $choice = shift;
-
my @files = @ARGV;
-
-
my @selection;
-
-
if ($choice =~ /thismonth/)
-
{
-
my ($day,$mon,$year) = dateaslist();
-
my $match = sprintf('%04d%02d',$year,$mon);
-
foreach my $file (@files)
-
{
-
if ($file =~ m/$match/ && $choice eq 'thismonth')
-
{
-
push @selection,$file;
-
}
-
elsif ($file !~ m/$match/ && $choice eq 'notthismonth')
-
{
-
push @selection,$file;
-
}
-
}
-
}
-
elsif ($choice =~ /today/)
-
{
-
my ($day,$mon,$year) = dateaslist();
-
my $match = sprintf('%04d%02d%02d',$year,$mon,$day);
-
foreach my $file (@files)
-
{
-
if ($file =~ m/$match/ && $choice eq 'today')
-
{
-
push @selection,$file;
-
}
-
elsif ($file !~ m/$match/ && $choice eq 'nottoday')
-
{
-
push @selection,$file;
-
}
-
}
-
}
-
elsif ($choice =~ /last(\d+)days/)
-
{
-
my $days = $1;
-
my ($day,$mon,$year) = dateaslist(time()-($1*24*3600));
-
my $match = sprintf('%04d%02d%02d',$year,$mon,$day);
-
my $spec = sprintf('last%ddays',$days);
-
my $notspec = sprintf('notlast%ddays',$days);
-
foreach my $file (@files)
-
{
-
my ($date) = ($file =~ m/(\d{8})/);
-
push @selection,$file if ($date >= $match && $choice eq
-
$spec);
-
push @selection,$file if ($date < $match && $choice eq
-
$notspec);
-
}
-
}
-
-
print join ' ',@selection;
-
-
sub dateaslist
-
{
-
my ($time) = @_;
-
$time = time() unless defined($time);
-
my ($day,$mon,$year) = (localtime($time))[3..5];
-
$mon++;
-
$year+= 1900;
-
return($day,$mon,$year);
-
}
复制代码
使用这个脚本,您可以通过各种方法挑选出备份文件(请参见清单 6)。
清单 6. 挑选备份文件
-
$ filesbydate.pl last5days # Files created in the last 5 days
-
$ filesbydate.pl notlast14days # Files 15 days or older
-
$ filesbydate.pl nothismonth # Files not created this month
复制代码
请记住,比较操作针对于文件名,而不是文件系统的创建或修改日期,所以该脚本可以对头天晚上创建的文件进行操作。
使用 rsync 存储备份数据
rsync 工具可以在不同的位置或计算机之间复制整个目录结构,它通过使用一种特殊的算法,可以实现仅传输更改过的文件。这使得它成为一种非常高效的复制文件的方法,特别是在不同的计算机之间,这也意味着,备份过程将很快完成。
有两种使用 rsync 的方法,要么作为一种简单的同步方法,使用这种方法,您可以将所有重要的文件复制到新的驱动器或系统,要么作为一种备份方法,按日期复制整个目录树,这与在前面的示例中创建 tar 备份文件的方法相同。
前面这种方法既快速又简单,但是您不能回到出现故障之前某个特定的日期。而后面这种方法提供了基于日期的选择,但是它需要更多的管理(尤其是因为您需要删除不再需要的旧版本的文件)以及相当数量的存储空间,因为没有对这些文件进行压缩。然而,您获得了更简单和更直接的访问方式。
如何对 rsync 进行设置,这超出了本文的范围,但在完成了相应的配置工作之后,进行信息的传输和同步就非常简单了。清单 7 显示了使用 rsync 进行文件同步的脚本。
清单 7. 使用 rsync 对文件进行同步的脚本
-
#!/bin/bash
-
-
DESTBASE=admin@atuin:/mnt/backupprepare
-
HOST=`hostname`
-
-
cd /export/data/svn
-
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og
-
--links . $DESTBASE/$HOST/svn
-
-
cd /export/home/webs
-
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og
-
--links . $DESTBASE/$HOST/webs
-
-
cd /var/bind
-
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og
-
--links . $DESTBASE/$HOST/bind
-
-
cd /etc
-
rsync --stats --rsh=/usr/bin/ssh --delete --recursive --times -og
-
--links . $DESTBASE/$HOST/etc
复制代码
指定的 rsync 命令选项如下所示:
* --stats 显示同步的统计信息。
* --rsh 告诉 rsync 使用安全 Shell (SSH) 复制文件(出于安全考虑)。
* --delete 删除目标中那些在本地目录中不存在的文件。
* --recursive 确保对整个目录进行检查。
* --times 保留文件的创建和修改时间。
* -og 保留所有权和组信息。
* --links 将链接复制为链接,而不是它们所链接的文件。
DESTBASE 变量指定了基本位置(在本示例中为远程主机上的文件系统),而 HOST 变量则保存了主机名信息,以便您能够对多台主机使用相同的脚本进行备份。
备份整理的数据
在前面的部分中,您已经使用了 tar 和 rsync 在单独的文件夹中创建相应的备份。您可以使用这种经过整理的信息作为主备份,尤其是当文件位于另一台计算机时。然而理想的情况下,您还应该将这些文件备份到另一个位置。
使用上面介绍的这些脚本,无论是 tar 或 rsync,都可以将多台主机的多个目录中的信息整理到单个位置。基于这一点,您可以使用自己喜欢的方法进一步地对这些信息进行备份,包括将其复制到另一台计算机或设备,或复制到磁带或磁盘。
保存长期的记录
大多数备份解决方案,尽管对其进行了良好的管理,但通常依赖于交替和循环使用用于存储数据的介质或目标。然而,您可能需要长期保存相关信息的某些类型的关键数据,甚至可能需要能够记录这些数据的变更和修改信息,并作为备份过程的一部分。
实际上,记录这些信息的时间间隔仅受到可用磁盘空间或存储空间的限制。使用基于日期的方法,特别是在使用 tar 或 cpio 时,您可以长期保存相关记录,而不会对存储空间造成很大的影响。通过使用常规的完整备份(换句话说,包括所有的文件)和增量 (diff) 备份(其中仅备份变更的内容),您可以进一步延长其保留时间。
总结
备份关键文件涉及到确定相关文件,并找到一种合适的方法存储和备份这些信息。文件可能存储在许多不同的位置,而您应该多加小心,以确保包含重要的、但经常被遗忘的内容,比如内核驱动程序、库和相关配置。
然后使用合适的方法,就可以对这些信息进行有效的备份。与用户数据不同,通常需要优先对关键文件进行恢复,以便在继续进行其他的还原操作之前,使计算机获得正确的配置。通过使用 tar 或 rsync,做好对该信息进行访问的准备,这样通常将更加有效。
阅读(1167) | 评论(0) | 转发(0) |