以 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 后面的讯息去判断,或是去搜寻就可以找到错误的原因。
No comments yet.