rsync + SSH增量备份文件

  http://troy.jdmz.net/rsync/index.html

  研究了这篇文章,里面写得满详细的;我的这篇文章只是把我实际操作的过程记录下来而已。内容有误或是您有更好的方案,欢迎您在下方的 comments 中给我建议 :)

  有两台机器,姑且一台叫服务器,一台叫备份机。要怎么样才能每天或是定期地,把服务器的数据整个复制到备份机呢?这里就要用到 rsync (详: 维基百科) 的强大功能了。

  rsync 在每次传输的时候会先检查远程的档案清单,只传输远程有更新的档案,所以只有第一次跑的时候会用掉比较多的时间,往后再执行就很快了。它也支援 ssh 传输,所以安全基本上是可靠的。

  要怎么实作呢?

  首先我们先定义,服务器的 DN 叫作 server.51netshop.com.cn,(当然我家没有这台机器= =);备份机的 DN 叫作 backup.51netshop.com.cn。我在两边的账户名称都是 xiaochen。

  一、初试。

  首先两边都要装 rsync 。 通常 FreeBSD 是在 /usr/ports/net/rsync,如果不是在这里的话,自己 whereis rsync 找找看吧。找到之后直接 cd 进去, make install clean  就行了。

  安装完成当然是要先执行 rehash 才能立即更新指令列表。接着,以 xiaochen 登入到 backup.51netshop.com.cn,写一支小小的 Bourne Shell 来试试看 rsync 能不能运作,就放在 /home/xiaochen/rsync.sh 好了(记得要 chmod +x 喔):

  [档案开始,不包含此一行]

  #!/bin/sh

  #!/bin/sh

  RSYNC=/usr/local/bin/rsync

  SSH=/usr/bin/ssh

  RUSER=xiaochen

  RHOST=server.51netshop.com.cn

  RPATH=/home/xiaochen/test

  LPATH=/mnt/database/fileserver/mirror.51netshop.com.cn

  $RSYNC -e "$SSH" -avzP –delete $RUSER@$RHOST:$RPATH $LPATH

  [档案结束,不包含此一行]

  其变量解说如下:

  * RSYNC 是 rsync 执行文件所在的路径;每台机器不见得一样,你得用 whereis rsync 找到它。

  * SSH 是 ssh 执行文件所在的路径,当然你也要用 whereis ssh 来找

  * RUSER 是我在 server.yorkxin.org 的账户名称

  * RHOST 是伺服机的 Domain Name 或是 IP

  * RPATH 是伺服机中『欲备份到备料机的路径』。在 rsync 的过程中会把整个子目录都丢过来,所以你只要指定最顶的路径就行了。

  * LPATH 指的是我在 backup.yorkxin.org,『欲摆放备料档案的路径』。

  a:保持文件的所有属性

  v:执行时显示信息

  z:同步时压缩文件

  p:显示执行过程

  最后一行写得很恶心,其实就是 rsync 的指令加参数,用法是

  rsync [参数] 远程使用者@远程机器:远程路径 本机路径

  参数说明如下:

  * -e 后面跟一坨字符串,表示我们要用不一样的方法来登入伺服机,例如 ssh 或是 rsh。

  * -a 是『封存』(archive);老实说我不知道这是什么意思 Orz

  * -z 是要 rsync 在传输的过程中压缩,节省时间

  * –delete (两个 dash 喔) 是要 rsync 『遇到远程(伺服机)已删掉的档案,就把本机(备料机)的相同档案也删掉』。这对于 snapshot 倒是颇方便的。

  存盘之后,chmod +x ,先跑一次试试看(当然我要先在家目录 mkdir );这第一次执行会把服务器(远程) 指定路径的所有档案都复制到备份机(本机),我们在这里先跑一次,接下来要试也比较省时间。

  二、免打密码的 SSH 联机

  既然是开工作排程给它定时备份,总不能说每次都要人工输入密码吧。还好 ssh 提供了密钥认证的方式,接下来我要做一对认证密钥,分别放在备料机和伺服机,以便于双方在透过 ssh 做 rsync 备份的时候,可以不必人工输入密码。

  1. 生 SSH Key Pair

  在备料机 backup.51netshop.com.cn (本机)输入以下指令:[两行请接在一起]

  ssh-keygen -t dsa -b 1024 -f /home/xiaochen/.ssh/

  当然最后一个参数 (-f ,指定生成档案),你可以自己指定。

  会出现以下的讯息,这里没什么要输入的文字,只是你要按两次 Enter:

  Generating public/private dsa key pair.

  Enter passphrase (empty for no passphrase): [直接按enter]

  Enter same passphrase again: [直接按enter]

  Your identification has been saved in /home/xiaochen/.ssh/id_dsa.

  Your public key has been saved in /home/xiaochen/.ssh/id_dsa.key.pub.

  The key fingerprint is:

  96:0a:51:79:c2:a5:f3:6d:36:81:fb:31:08:16:f7:b7 xiaochen@backup.51netshop.com.cn

  完成后你会看到两个档案:

  * /home/xiaochen/.ssh/id_dsa 这是私钥 (私钥,要小心不能流出)

  * /home/xiaochen/.ssh/id_dsa.pub 这是公钥 (公钥)

  2. 让伺服机收下公钥

  再来要把公钥 (.id_dsa.pub) 放到目标服务。你可以用 FTP 传,不过既然你已经在工作站了,那就用 SSH 的 SCP 吧,指令如下:[两行请接在一起]

  scp /home/xiaochen/.ssh/id_dsa.pub xiaochen@server.51netshop.com.cn:~/

  按下 Enter 后会要求输入密码,以便 scp 以 ssh 登入伺服机 (server.51netshop.com.cn)。

  完成之后,就可以到伺服机 (server.51netshop.com.cn) 操作了。我以 xiaochen 身份登入到 server.51netshop.com.cn。(所以以下的动作都是在 server.51netshop.com.cn 这台伺服机里,以 xiaochen 身份操作)

  1) 如果没有 ~/.ssh/ 这个目录的话,自己用 mkdir 生一个 .ssh/ 文件夹,在家目录里面,并且 chmod 成 700。(注意文件夹名称前面要有一个 `.‘)

  2) 把刚刚用 scp 丢过来的 .id_dsa.pub 移动到 ~/.ssh/ 里面:

  mv .id_dsa.pub ~/.ssh/authorized_keys

  做到这里,其实备料机 (backup.51netshop.com.cn) 就可以透过免打密码的 SSH 认证,直接 ssh 联机到伺服机 (server.51netshop.com.cn) 了。但是这种联机会『允许所有来源、允许所有指令』,所以现在要改一下。

  三、限制密钥认证 SSH 联机的来源和权力

  以下的动作也都是在 server.51netshop.com.cn 进行

  1. 编辑 ~/.ssh/authorized_keys 这个档案,在第一个字 (ssh-dss) 前面加入

  from="backup.51netshop.com.cn",command="/home/xiaochen/validate-rsync"

  记得这一坨字和 “ssh-dss” 这个单字之间要空一格。from 就是 backup.51netshop.com.cn 的 DN 或 IP, command 则是我放验证 SSH Command 的脚本文件的位置。

  2. 接着要做验证脚本文件,这个例子中就是 /home/xiaochen/validate-rsync 这个档案,记得存盘后要 chmod +x:

  [档案开始,不包含此一行]

  #!/bin/sh

  case "$SSH_ORIGINAL_COMMAND" in

  *&*)

  echo "Rejected"

  ;;

  *(*)

  echo "Rejected"

  ;;

  *{*)

  echo "Rejected"

  ;;

  *;*)

  echo "Rejected"

  ;;

  *<*)

  echo "Rejected"

  ;;

  *`*)

  echo "Rejected"

  ;;

  *|*)

  echo "Rejected"

  ;;

  rsync –server*)

  $SSH_ORIGINAL_COMMAND

  ;;

  *)

  echo "Rejected"

  ;;

  esac

  [档案开始,不包含此一行]

  要注意,虽然现在 ssh 联机认证已经限制了可用的指令,但只要拿到私钥,一样可以从 backup 这台机器登入到 server ,可以复制所有可存取的档案,所以私钥要小心不能流出去。

  四、加入密钥信息

  现在回到 backup.51netshop.com.cn 。编辑刚刚在步骤 一、 里面做的 /home/xiaochen/rsync.sh,因为现在要加入密钥信息。大概改成这样:

  [档案开始,不包含此一行]

  #!/bin/sh

  RSYNC=/usr/local/bin/rsync

  SSH=/usr/bin/ssh

  KEY=/home/xiaochen/id_dsa.key   # 私钥路径

  #[加入上面这一行,当然你要改成你的私钥路径]

  RUSER=xiaochen

  RHOST=192.168.10.235

  RPATH=/home/xiaochen/test

  LPATH=/mnt/database/fileserver/mirror.51netshop.com.cn

  $RSYNC -e "$SSH -i $KEY" -avzP –delete $RUSER@$RHOST:$RPATH $LPATH

  #  最后一行的『指令』要加入 -i $KEY 这个参数,在  $SSH 的后面,中间空一格。

  [档案结束,不包含此一行]

  然后执行一次,看看有没有正常。

  如果一切正常的话,其实你可以把 rsync.sh 最后一行指令里面的 -avz 参数改成 -az ,毕竟 -v 是我们要『边抓边看进度』的时候在用的。

  五、加入工作排程

  在 backup.51netshop.com.cn 以 xiaochen 身份执行 crontab -e,加入

  0 5 * * * /home/xiaochen/rsync.sh

  这是在每日 05:00 执行一次,当然你可以改成别的时间。

    文章来源:http://chenshengang.blog.51cto.com/4399161/1609060

发表评论

邮箱地址不会被公开。 必填项已用*标注