例如执行一条简单的 tar 命令,可以使用下面的一个简单的脚本。
清单 2. tar 自动化示例脚本
#!/bin/sh tar -czvf backup.tar.gz /CriticalData/ |
如果我们想用其它的命令来实现数据备份,可以将以上的示例脚本中的命令部分替换掉,例如执行一条简单的 cpio 命令,可替换为下面一个简单的脚本。
清单 3. mksysb 自动化示例脚本
#!/bin/sh find /CriticalData/ -depth | cpio -ov > backup.cpio |
事实上我们可以通过 shell 中一些变量设置,条件测试以及流程控制语句来实现不同的需求。例如,管理员希望能够在周一到周日,通过 backup 命令做多级备份。
我们可以设置 Level 变量,当变量满足不同条件时,就可以实现多级备份。
清单 4. backup 自动化示例脚本
#!/bin/sh // 判读当前系统的日期是星期几 DATE=`date | awk '{ printf $1 }'` case $DATE in Mon) LEVEL=1;; Tue) LEVEL=2;; Wed) LEVEL=3;; Thu) LEVEL=4;; Fri) LEVEL=5;; Sat) LEVEL=6;; Sun) LEVEL=7;; esac // 备份命令 backup -$LEVEL -uf /dev/rmt0 /home |
虽然各种实用程序和命令以及参数各不相同,但 shell 自动化脚本的基本思路是类似的。如果系统管理员需要连续地定期地执行脚本,可以借助 Unix/Linux 系统的 crontab 功能。
rsync 的自动化实现
由于 rsync 在数据备份与同步上的优秀表现,本文将主要介绍用 rsync 来实现数据的备份与同步。
要使用 rsync,只需要将主服务器安装并配置成为 rsync 服务器,将另外一台装有 rsync 的机器作为备份客户端。在对 rsync 服务器配置结束以后,就可以在客户端发出 rsync 命令来实现将服务器端的文件备份到客户端来。在客户端创建自动化脚本,并启用 cron 服务,就可以定期对主服务器的数据进行自动备份与同步。
- 在服务器端手动创建 rsync 配置文件
创建 rsync.conf 作为服务器配置文件
假设我们在服务器端,设置需要备份的目录 /CriticalData, 但不需要备份 /CriticalData 目录下的 Common 目录。
先创建一个目录,用于存放 rsync 相关配置文件
# mkdir /etc/rsyncd
创建 rsync.conf
#touch /etc/rsyncd/rsyncd.conf
编辑 rsyncd.conf
清单 5.rsyncd.conf 配置文件
清单 5.rsyncd.conf 配置文件
gid = users read only = true use chroot = true transfer logging = true log format = %h %o %f %l %b log file = /var/log/rsyncd.log pid file = /var/run/rsyncd.pid secrets file = /etc/rsyncd.secrets hosts allow = 192.168.0.0/255.255.255.0 max connections = 5 timeout = 300 motd file = /etc/rsyncd/rsyncd.motd [CriticalData] path = /CriticalData list = true ignore errors comment =This is Critical Data auth users = rsync secrets file = /etc/rsyncd/rsyncd.secrets exclude = Common/
rsync.conf 中主要分为全局变量和模块两部分。模块用 [ ] 表示,模块之前的为全局变量。
重要参数说明:
path
指定该模块所定义的备份目录的路径,该参数是必须指定的。exclude
用来指定多个由空格隔开的多个文件或目录 ( 相对路径 ),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 --exclude 参数。一个模块只能指定一个 exclude 选项。但是需要注意的一点是该选项有一定的安全性问题,客户端很有可能绕过 exclude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。auth users
该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户不一定是客户端存在的用户。如果"auth users"被设置,那么客户端发出对该模块的连接请求时,需要对用户身份进行验证。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块 ( 也就是匿名方式 )。创建 rsync.secrets 作为用户密码文件
#touch /etc/rsyncd/rsyncd.secrets #chmod 600 /etc/rsyncd/rsyncd.secrets
编辑 rsyncd.secrets, 格式为“用户 : 密码”
rsync:passwd
注意:rsync是服务器上存在的用户,同时将/CriticalData的使用者改为rsync
#chown -R rsync /CriticalData/
创建 rsync.motd 作为登录消息文件
此文件是选择性配置文件,也可以不创建。
#touch /etc/rsyncd/rsyncd.motd
编辑 rsyncd.conf
============================ This is Critical Data Server =============================
- 启动 rsync
将 rsync 启动
#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
可以将这个命令写入 /etc/rc.d/rc.local 中,当系统启动时,自动运行 rsync。
- 创建脚本
在客户端创建一个 /root/rsync/ 目录用来存放自动化脚本和其它文件。
创建 /root/rsync/rsync.sh 自动化脚本,保证权限为 755。
清单 6. rsync 自动化示例脚本
#!/bin/sh export RSYNC_PASSWORD=passwd export PATH=$PATH:/bin:/usr/bin:/usr/local/bin // 设置远程服务器与需要备份的目录 SERVER=rsync@Server DIR=CriticalData // 设置客户端上的用于备份的目录 BDIR=/Backup BASE=Current INCREMENTDIR=`date +%Y-%m-%d` // 在客户端灵活使用 exclude 功能;设置日志 EXCLUDES=/root/rsync/excludes LOG=/tmp/rsync.log // 参数设置,调用 backup-dir 将服务器端的增量文件存储到 INCREMENTDIR 目录下 OPTS="-avz--force --delete --delete-excluded --exclude-from=$EXCLUDES -b --backup-dir=$BDIR/$INCREMENTDIR --ignore-errors" // 确保客户端上的用于备份的目录存在 install -d $BDIR/$BASE // 实现数据备份与同步,将日志邮寄给 root 用户 run_rsync() { echo "==========Begin rsync: `date`===========" >>$LOG 2>&1 du -s $BDIR/* >>$LOG 2>&1 rsync $OPTS $SERVER::$DIR $BDIR/$BASE >>$LOG 2>&1 echo "==========End rsync: `date`===========" >>$LOG 2>&1 mail root -s "Backup Report" < $LOG rm $LOG } // 条件测试,运行程序 if [ -f $EXCLUDES ]; then if [ -d $BDIR ]; then run_rsync else echo "cant find $BDIR"; exit fi else echo "cant find $EXCLUDES"; exit fi
执行完 rsync.sh 后,可以查看 /Backup 目录来检查数据的正确性。将有两种目录,一个是 Current 目录,用于存放当前服务器端备份和同步后的数据。在脚本运行过程中,进行增量传输。另外还有一个类似于 2009-06-16 的目录,用于存放已在服务器端删除的增量数据。目录的名称将根据脚本执行的日期定义。
时间:2009-08-20 16:46 来源:developerWorks 中国 作者:程 燕 原文链接