用 rsnapshot 备份

这份指引会协助你在你的网络上创建一台 rsnapshot 备份服务器。它会简短地解释如何设置 rsync 以 SSH 金钥来进行不须密码的 SSH 登录。我利用 Synbak 这个工具程序自动将家用笔记本备份至我的桌上计算机已经有一段时间。在这之先,一个简单的 rsync 脚本担当了这个重任。虽然 Synbak 是个简化在家中备份的得力助手,它却不及 rsnapshot 般有灵活性。(Synbak 的强项在于它的简易安装及操作。)这份指南假设你会按照本作者的文档、把 RPM 组件安装在 CentOS/Fedora 上。

1. 系统:

CentOS 4.x/5.x 及 Fedora 7(应该适用于任何 RHEL/Fedora 操作系统)

2. 参考:

rsnapshot 网站
rsnapshot 文档
CentOS 上安装

3. 系统设置

在 Fedora 与在 CentOS 上运用 yum 及 RPM 来安装 rsnapshot 的步骤并不相同,但差异很微。

3.1. 1)CentOS 4.x/5.x

在 CentOS 4.x/5.x 上安装时,你必须安装及启用 RPMForge 的第三方软件库。我亦推荐设置 yum-priorities。幸好 CentOS 的 wiki 内已经收录了这篇简单易用的 RPMForge 指南。当你将一切设置妥当后,请由命令行安装 rsnapshot。

# yum install rsnapshot

这样做会引入一些你仍未安装的 Perl 依赖组件。有些组件将会来自 base,额外的会来自 rpmforge 的软件库。

3.2. 2)Fedora

我在 Fedora 7 桌面计算机上安装时并不需要任何特别的软件库设置。它只须通过命令行进行安装。

# yum install rsnapshot

4. 预备设置环境

安装后,一个样例配置文件将会被放在 /etc/rsnapshot.conf,但你多数不止把一台主机备份,因此我们不会采用它。取而代之,请创建一个目录来放置你的主机配置文件。请按你的首选来更改路径名称。

# mkdir /etc/rsnapshot

你也需要一个地方来安置备份,所以请创建一个地方来存储那些文件。

# mkdir /srv/backups/snapshots

最后,你将会需要一个地方来放置 rsnapshot 所创建、稍后要设置的日志。请创建一个目录。

# mkdir /var/log/rsnapshot

5. 设置不须密码的 SSH 登录

5.1. 1)rsnapshot 服务器端

在 rsnapshot 服务器上,你须要创建一对 SSH 金钥。你可以利用 ssh-keygen 来达至这个目的。

# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
snip

5.2. 2)在主机上安装金钥

如果你已经有 SSH 访问权,当你在 rsnapshot 服务器上创建了金钥后,你可以轻易地将公钥加进远程的适当文件内。切勿加入那条非公开的金钥。请从 rsnapshot 服务器执行以下的指令到你要备份的远程系统。

# cat ~/.ssh/id_dsa.pub | ssh root@remote_host "cat >> ~/.ssh/authorized_keys2"

也许此刻你会想在远程系统停用 SSH 的密码登录,但这是你的决定。假若你想这样做,编辑 /etc/ssh/sshd_config。请确定 PasswordAuthenticationPermitEmptyPasswords 都是 no。另外,纵使我不是位安全性专家,但你应该把你的 .ssh 目录及文件的访问权好下面般更改。假若我所列出的访问权有错误,请矫正我。

# chmod 700 .ssh; chmod 400 .ssh/authorized_keys2

6. 设置 rsnapshot 主机

既然你已经初步有一个地方放置配置文件、一个地方放置备份、及能够不须密码访问远程系统,现在你可以创建主机设安档。我会利用家中的笔记本备份作为样例。

6.1. 1)主机的 .conf 档

请为你要备份的主机创建一个文件来收藏 rsnapshot 专用的设置。请按你的情况取代主机名称及文件名称。

# vim /etc/rsnapshot/laptop.rsnapshot.conf

需要解释的选项为数不少,但下面是我的配置文件。请输入以下选项,接下来便是它们的解释。

config_version  1.2
snapshot_root   /srv/backups/snapshots/laptop/
cmd_cp  /bin/cp
cmd_rm  /bin/rm
cmd_rsync       /usr/bin/rsync
cmd_ssh /usr/bin/ssh
cmd_logger      /usr/bin/logger
cmd_du  /usr/bin/du
interval        daily   7
interval        weekly  4
interval        monthly 3
verbose 2
loglevel        4
logfile /var/log/rsnapshot/laptop.log
exclude_file    /etc/rsnapshot/laptop.exclude
rsync_long_args --delete        --numeric-ids   --delete-excluded
lockfile        /var/run/rsnapshot.pid
backup  root@laptop:/   laptop/
backup_script   /etc/rsnapshot/laptop.dump_databases.sh laptop_databases/

注:请留意选项数值之间的空位。它们不是空格,而是 tab。此外,目录必须有后置的斜线。这一切都在 /etc/rsnapshot.conf 样例档的顶部有所解释。

你可以在样例配置文件内查阅所有选项。下面是各个参数值的解释:

现在你已经有一个可用的主机设置样例,让我们继续看排除档。

6.2. 2)主机的 .exclude 档

我会选择先排除一切,然后特别指定我需要备份的东西。这样做的原因是要确保我们只批准所须的东西,及自动拒绝以外的事物。我知道这样似乎很落后,但它确实可行。

请创建这个文件:

# vim /etc/rsnapshot/laptop.exclude

由于回递的原故,采用排除档可以是件难对付的事。我不会假装对 rsync 的回递完全理解,因此我的样例也许会不合你心意。它容许你刻意指定所须的东西,然后排除其它一切。基于 rsync 采用回递的方式,与及你摆设结构的式样(即是 * 与 ** 所配对的有差别),你也许要先枚举目录。

当你列出了所须的东西后,请加入 - * 来排除其它一切。这样只有你枚举的东西才会获备份。我的排除档是这样的:

+ /boot
+ /etc
+ /home
+ /opt
+ /root
+ /usr
+ /usr/java
+ /usr/local
- /usr/*
- /var/cache
+ /var
+ /srv
- /*

对我来说,有一个好的参考就是阅读这篇在 kurup.org 内的博客文章。另外,请阅读 rsync 的使用手册来增进对于式样配对及回递的理解。假如你是位回递的专家,请加插一个解释的备注或修正我的错处。

6.3. 3)主机备份脚本

最后要解释的设置选项是我用来转储数据库的执行脚本。这个选项让你在 rsync 结束后执行脚本来加入文件在备份中。譬如你可以连接到远程系统并转储 MySQL 及/或 PostgreSQL 的数据库。请创建所需的数据库转储脚本。

# vim /etc/rsnapshot/laptop.dump_databases.sh

请加入适当的数据。以下的脚本会转储我的笔记本上的两个 MySQL 数据库及一个 PostgreSQL 数据库。

#MySQL 数据库

for db in wordpress testpress
do
        ssh root@laptop "mysqldump --opt $db" > $db.mysqldump
done

#PostgreSQL 数据库

for db in docmgr
do
        ssh root@laptop "pg_dump $db" > $db.pgsqldump
done

请确定这个脚本是个执行档。如果你不想将执行档放在 /etc 内,你也可选择把这个脚本放到其它位置,例如 /usr/local/bin 或 /usr/local/sbin。

# chmod +x /etc/rsnapshot/laptop.dump_databases.sh

在上述的 laptop.rsnapshot.conf 文件里,我以这个方法指定了一个备份脚本,请留意采用 tab:

backup_script   /etc/rsnapshot/laptop.dump_databases.sh laptop_databases/

如此数据库便会里转储到 laptop_databases 目录中的每日、每周、及每月备份里。这样便完成了一个基本的主机设置。接下来你可以设置自动化操作。

7. 创建一个 crontab

自动化操作可以通过简单的 crontab 项目来达成。请打开 crontab 并加入以下内容:

# crontab -e

#MAILTO="" ##Supresses output
MAILTO=me
###################################################################
#minute (0-59),                                                   #
#|    hour (0-23),                                                #
#|    |        day of the month (1-31),                           #
#|    |        |       month of the year (1-12),                  #
#|    |        |       |       day of the week (0-6 with 0=Sunday)#
#|    |        |       |       |       commands                   #
###################################################################
15    02       *       *       *        /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf daily
15    03       *       *       Sun      /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf weekly
30    03       1       *       *        /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf monthly

假若你不想收到任何电邮,请将 MAILTO 改为 MAILTO="",又或者乖乖地阅读 crontab 的使用手册。以上的设置会在上午 2:15 进行每日备份、在上午 3:15 进行每周备份、及在每月头一日上午 3:30 进行每月备份。

当一切完成后,你的目录结构将会如下。由于 rsnapshot 及 rsync 采用硬连结,你将会在每个备份中看见一个完整的文件系统,但事实并非如此。它会很聪明地应用磁盘的空间。这样听起来好像数据并不齐全,然而它们都齐备。

# ll /srv/backups/snapshots/laptop
drwxr-xr-x  4 root root 4096 Jan  3 01:47 daily.0
drwxr-xr-x  4 root root 4096 Dec  7 01:46 daily.1
drwxr-xr-x  4 root root 4096 Dec  6 01:48 daily.2
drwxr-xr-x  4 root root 4096 Dec  5 01:46 daily.3
drwxr-xr-x  4 root root 4096 Dec  4 01:46 daily.4
drwxr-xr-x  4 root root 4096 Dec  3 01:46 daily.5
drwxr-xr-x  4 root root 4096 Dec  2 01:46 daily.6
drwxr-xr-x  4 root root 4096 Oct 28 01:46 monthly.0
drwxr-xr-x  4 root root 4096 Sep 30 01:46 monthly.1
drwxr-xr-x  4 root root 4096 Sep  1 01:46 monthly.2
drwxr-xr-x  4 root root 4096 Nov 25 01:46 weekly.0
drwxr-xr-x  4 root root 4096 Nov 18 01:46 weekly.1
drwxr-xr-x  4 root root 4096 Nov 11 01:46 weekly.2
drwxr-xr-x  4 root root 4096 Nov  4 01:46 weekly.3

如果你转储了数据库,你将会在上述每个目录内找到一个 laptop_databases 目录。例如:

# cd /srv/backups/snapshots/laptop/daily.0/laptop_databases
# ll
-rw-r--r-- 1 root root 692310 2008-01-04 02:15 wordpress.mysqldump
-rw-r--r-- 4 root root 291379 2008-01-02 22:49 testpress.mysqldump
-rw-r--r-- 2 root root 842345 2008-01-03 21:12 docmgr.pgsqldump

此外,假若你极度关注数据的安全性,你也可以通过 hourly 这个选项为目录及数据库每小时备份。这对我没有用途,但阅读过这份指南后,相信你有需要的话,必定能够找出如何加入 hourly 这个参数。

要加入更多主机,请遵照这份指南重复同样的步骤,并在新增文件内改用新的主机名称。

8. 人手执行 rsnapshot

要以人手方式创建备份,你可以在命令行配合适当的参数直接执行 rsnapshot。

# /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf {hourly,daily,weekly,monthly}

9. rsnapshot 的报告

若果你有与趣收到更多消息,rsnapshot 有一个轻巧实用、容易设置的报告脚本。它会通过一封简单的电邮向你汇报备份过程。这个报告很精简。首先,请复制该脚本到 /usr/local/bin 或某个地方,然后将它设为执行档。

# cp /usr/share/doc/rsnapshot-1.3.0/utils/rsnapreport.pl /usr/local/bin
# chmod +x /usr/local/bin/rsnapreport.pl

接着,在你的主机的 rsnapshot 档的「rsync 冗长参数」栏加入 --stats。请留意用 tab 而不是空白格来隔格。

# vim /etc/rsnapshot/laptop.rsnapshot.conf
rsync_long_args --stats --delete        --numeric-ids   --delete-excluded

最后,编辑先前在 crontab 内新增的项目,并将 rsnapshot 所返回的结果递给 rsnapreport.pl 这个脚本来处理。

# crontab -e

#MAILTO=""
##########################################################
#minute (0-59),                                          #
#|  hour (0-23),                                         #
#|  |  day of the month (1-31),                          #
#|  |  |  month of the year (1-12),                      #
#|  |  |  |  day of the week (0-6 with 0=Sunday)         #
#|  |  |  |  |       commands                            #
##########################################################
15 02  *  *  *     /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf daily 2>&1 | \
/usr/local/bin/rsnapreport.pl | mail -s "laptop daily" me@myemail.com
15 03  *  *  Sun   /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf weekly 2>&1 | \
/usr/local/bin/rsnapreport.pl | mail -s "laptop weekly" me@myemail.com
15 04  1  *  *     /usr/bin/rsnapshot -c /etc/rsnapshot/laptop.rsnapshot.conf monthly 2>&1 | \
/usr/local/bin/rsnapreport.pl | mail -s "laptop monthly" me@myemail.com

切勿忘记 2>&1(标准错误档)这个重新定向,否则它们便会流失在 stderr。这个重新定向的意思是把标准错误转送到标准输出档。这样报告便大功告成了。当 rsnapshot 下次执行时,你便应该在你的电邮地址收到一个报告。它会看似以下的输出:

SOURCE           TOTAL FILES   FILES TRANS      TOTAL MB     MB TRANS   LIST GEN TIME  FILE XFER TIME
-----------------------------------------------------------------------------------------------------
laptop:/              59076          1353      17279.45      7169.38   20.361 second   0.000 seconds

10. 后语

在家里,我的桌面计算机采用 2 个以 RAID1 镜像运作的 200G 硬盘。我利用它来备份我的笔记本及一台 asterisk 系统。假如你聪明的话,你便会同样地利用一个 RAID1 镜像或某类型的冗余磁盘结构作为你的 rsnapshot 服务器。祝你好运。

Translation of revision 8

zh/HowTos/RsnapshotBackups (last edited 2019-12-09 09:11:17 by anonymous)