以 rsync 进行远端同步备份

rsync 是 Linux 当用的远端档案的备份、同步程式,目前由 samba 的团队在发展,它有它自己的算法,可以很有效率的传输档案,支援 rsh 及 ssh 加密传输,应该是目前最常被做为资料同步或异地备援的工具。

大部份的 Linux 应该都有安装 rsync 了,如果没有,直接用 yum 安装即可:

yum install rsync xinetd

本文章只有说到 Linux 上最基本的备份、同步方式,如果你要知道与 Windows 或 ssh 有关的实作方式,目前没有。

名词解释

不知是否有人会误解下列的名词,不过,一开始使用 rsync 我就有点误解了,所以先说明如下:

  • 备份服务器: 有执行 rsync 服务的服务器,等待其它客户端将档案传输过来做备份。
  • 用户端: 在本地端执行 /usr/bin/rsync,将档案传到远端的“备份服务器”做备份。

启动备份服务器

在备份服务器编辑 /etc/xinetd.d/rsync,找到

disable = yes

改为

disable = no

储存后,执行

service xinetd restart

如果执行时出现“xinetd: 服务未能辨识”,请安装 xinetd:

yum install xinetd

另外,rsync 的 port 是 873,在防火墙中必须允许通过。否则用户端在同步时会出现类似下面的错误讯息:

rsync: failed to connect to 192.168.1.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

备份服务器的设定档

rsync 服务的设定档主要有两个,一个是 /etc/rsyncd.conf,一个是自订的密码档。

rsyncd.conf 的设定格式如下:

#中括号内的文字是自订的备份代号,设定档内可以有多个备份代号,每个代号之下可以有自已的设定
#以下这一行是 log 档的位置(非必要)
log file = /var/log/rsync.log
[Username]
  #备份之档案的存放路径 (请先建立好路径,并且要让下面的 uid 及 gid 可以写入档案)
  path = /var/backup/Username
  #验证的用户名称 (此名称只需存在于密码档里面即可)
  auth users = Username
  #密码档的位置
  secrets file = /etc/rsync/server.password
  #允许用户的来源
  hosts allow = 192.168.1.0/24 192.168.2.0/24
  #执行程式时所使用的用户及群组名称,同时也会成为备份之后档案的拥有者及拥有群组
  uid = root
  gid = root
  read only = no

(这里有个技巧,我通常会将“备份代号”、“存放路径”及“用户名称”设为相同的名称,这样就很容易做为识别了)

我在 rsync.conf 内所设定的密码档位置为 /etc/rsync/server.password,这个密码档只是一个纯文字档,每一列一个用户,密码也仅是明码而已。每一列的格式如下:

Username:UserPassword

新增密码档之后,要将权限设为 600 (如不设定权限为 600,则启动 rsync 服务时会有错误):

chmod 600 /etc/rsync/server.password

完成设定档之后不须要再重新启动 xinetd。

用户端

用户端所需要做的仅是执行 /usr/bin/rsync。rsync 做为同步处理时,常用的参数如下:

  • -a, --archive: 这最常被使用的参数,相当于同时使用 -rlptgoD,即: *
    • -r: 子目录递回
    • -l: 复制符号连结
    • -p: 复制档案权限
    • -t: 复制时间属性
    • -g: 复制群组属性
    • -o: 复制拥有者属性
    • -D: 复制装置属性
  • -v, --verbose: 显示详细资讯 *
  • -z, --compress: 压缩传输的资料,以减少传输量 *
  • -R, --relative: 备份后,使用用户端完整的路径 (不加此参数,则为相对路径)
  • -H, --hard-links: 保留档案的连结 *
  • -S, --sparse: 使有比较有效率的方式处理零散的档案 *
  • -P: 等同加了 --partial --progress,即: *
    • --partial: 保留传输中断的档案以进行续传
    • --progress: 即时显示档案传输的进度
  • -q: 如果没有错误,则不输出任何讯息
  • --delete: 用户端如果删掉档案,则备份服务器也同时删除该档案,以保持两边档案的一致 *
  • --password-file: 密码档的位置 (如不输入此参数,则程式执行时会询问你) *

上面有加“*”者是我每次都会使用的参数

用户端的密码档也是纯文字档,同样是使用明码,就是备份服务器所设定的那个密码。例如我的密码档放在 /etc/rsync/client.password,那档案的内容就是:

UserPassword

新增密码档之后,同样要将权限设为 600:

chmod 600 /etc/rsync/client.password

再来就是进行档案的传输了,rsync 指令的语法如下:

/usr/bin/rsync [-参数] [--参数] [备份来源路径] [备份目的路径]

远端同步的语法:

/usr/bin/rsync [-参数] [--参数] [--password-file=密码档位置] [本地端备份来源路径] [用户名称@远端备份服务器位址::备份代号]

假设我要将本地端的 /var/www/html 下的档案传输到备份服务器 (备份服务器的 IP 是“192.168.1.2”),那我就执行:

/usr/bin/rsync -avzHSP --delete --password-file=/etc/rsync/client.password /var/www/html Username@192.168.1.2::Username

第一次执行时,传输档案的所花费的时间会比较长,第二次执行就只会传输有新增或更新过的档案,时间就会缩短很多。

请注意备份来源 /var/www/html 的后面有没有多一个 / 的结果会差很多,有 / 的话那同步过去的会是 /var/www/html 里面的内容,即: /var/www/html/*,并不包含 html 的目录本身。没有 / 的话会在目标路径建立一个 html 目录,目录下才是 /var/www/html 里面的内容。至于“备份目的”有没有加 / 的结果都一样。

档案传输完成之后,到备份服务器的 /var/backup/Username 下查看,就会多出一个 html 目录,这就是刚刚 rsync 传输过去的档案。

将以上的指令加到系统的 crontab 就可以定时同步档案了。

错误处理

1. No route to host

rsync: failed to connect to 192.168.1.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

原因: 远端的 rsync server 未于防火墙允许 Port 873 通过。可尝试用 telnet 来测试 port 是否可用:

$ telnet 192.168.1.2 873
Trying 192.168.1.2...
telnet: connect to address 192.168.1.2: No route to host

2. Connection refused

rsync: failed to connect to 192.168.1.2: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]

原因: 远端的 rsync server 未正确启动。

3. connection unexpectedly closed

rsync: connection unexpectedly closed (0 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c

原因不明,请更新 rsync 后重新开机、重新启动 rsync server。

4. 其它

通常 rsync 在同步时,如有错误会在第一行以 @ERROR 开头显示,Ex:

@ERROR: auth failed on module
rsync: connection unexpectedly closed (92 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c

以 @ERRROR 后面的讯息去判断,或是去搜寻就可以找到错误的原因。

  1. No comments yet.

  1. 03/02. 2010
  2. 09/15. 2010
    Trackback from : [note]rsync | Fancy World

return top

%d 位部落客按了赞: