Rsync 同步文件

Rsync是linux/Unix文件同步和传送工具。用于替代rcp的一个工具,rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会开一个873端口,等待客户端去连接。连接时rsync server会检查口令是否相符,若通过口令查核,则可以通过进行文件传输,第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份。

yum 安装

epel源安装

1
2
3
4
5
6
7
8
9
10
11
    cat > /etc/yum.repos.d/epel.repo << EOF

[epel]
name=Extra Packages for Enterprise Linux 7 - \$basearch
baseurl=http://dl.fedoraproject.org/pub/epel/7Server/x86_64/
failovermethod=priority
enabled=1
gpgcheck=1
gpgkey=http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7Server

EOF

安装

## centos 7.5 已经安装了3.1.2 版本
yum install rsync

## 查看当前rsync版本
rsync --version

编译安装:

下载rsync源码
# wget https://download.samba.org/pub/rsync/rsync-3.1.3.tar.gz

解压
# tar -zxvf rsync-3.1.3.tar.gz

进入目录
# cd rsync-3.1.3

查看编译配置参数
# ./configure --help

编译安装, 安装时同步保存日志,这种编译
# ./configure --prefix=/usr

编译好二进制rsync程序会放在/usr/bin目录下,即/usr/bin/rsync

编译可以带如下参数
--with-rsyncd-conf=/etc/rsyncd.conf   # 默认/etc/rsyncd.conf
--without-included-zlib               # 此开关使用系统安装的zlib库进行编译。
# make
# make install | tee make_install.log


出于安全原因,鼓励将rsync服务器作为非特权用户和组运行。 
如果您打算将rsync作为后台进程运行,请使用root用户颁发的以下命令创建rsyncd用户和组:

# groupadd -g 80 rsyncd
# useradd -c "rsyncd Daemon" -d /home/rsync -g rsyncd -s /sbin/nologin -u 80 rsyncd

最后需要手动添加配置文件:

rsyncd服务器配置

rsyncd systemd配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

cat >> /usr/lib/systemd/system/rsyncd.service << EOF

[Unit]
Description=fast remote file copy program daemon
ConditionPathExists=/etc/rsyncd.conf

[Service]
EnvironmentFile=/etc/sysconfig/rsyncd
ExecStart=/usr/bin/rsync --port=555873 --daemon --no-detach "\$OPTIONS"

[Install]
WantedBy=multi-user.target

EOF

cat /etc/sysconfig/rsyncd
OPTIONS=""

rsyncd 启动配置文件

rsyncd 启动配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

cat >> /etc/rsyncd.conf << EOF

## 如果要修改文件的权限就用root用户,否则最好创建一个普通用户来运行rsync
port = 55873 # 默认端口号为873,防火墙需要同时开启tcp/udp对应的端口号
uid = root # rsyncd 启动运行的用户,必须有对同步目录有读写权限
gid = root # rsyncd 启动运行的用户组
use chroot = no # 是否启用chroot监狱
max connections = 200 # 最大连接数
timeout 600 # 连接超时

pid file=/var/run/rsyncd.pid # 指定PID文件
lock file=/var/run/rsyncd.lock # 指定支持max connection的锁文件,默认为/var/run/rsyncd.lock
log file=/var/log/rsyncd.log # rsyncd 服务器的日志
transfer logging = yes # 记录所有文件传输日志
log format = %t %a %m %f %b
motd file = /etc/rsyncd.d/rsync.motd # 定义服务器信息的,自己写 rsyncd.motd 文件内容

strict modes=yes # 指定是否检查口令文件的权限
auth users = rsync_backup # 连接用户名,和linux系统用户名无关系
secrets file = /etc/rsyncd.d/rsync.auth # 验证密码文件,文本格式 用户名:密码,一行一个账户

# 多个用逗号隔开
#允许网段或ip地址
hosts allow=200.200.200.0/24
#拒绝其他网段
hosts deny=*

# 设置no 或 false,客户端可以上传文件,yes 或 true是只读
# 允许上传
read only = false
# 设置no 或 false,客户端可以下载文件,yes 或 true是不能下载
#不允许下载
#write only = true
#不显示rsync服务端资源列表
list = false

# ignore nonreadable = yes
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.iso *.bz2 *.tbz
#可以忽略一些IO错误
ignore errors = true


# MODULE OPTIONS
[wwwroot]
path = /data/wwwroot/

[sweet]
path = /data/wwwroot/sweet.com.cn

[module_test]
path = /data/rsync_bak2
comment = rsync test logs
## 该用户系统中存在且对后面指定的备份目录拥有权限
auth users = sean
uid = sean
gid = sean
secrets file = /etc/rsyncd.d/rsyncd.secrets
read only = false
list = false
hosts allow=172.29.88.204
hosts deny=0.0.0.0/32


EOF
[conf]                                   #自定义模块
path = /usr/local/nginx/conf             #用来指定要备份的目录
comment = Nginx conf
ignore errors                            #可以忽略一些IO错误
read only = no                           #设置no,客户端可以上传文件,yes是只读
write only = no                          #no为客户端可以下载,yes不能下载
hosts allow = 192.168.2.0/24             #可以连接的IP
hosts deny = *                           #禁止连接的IP
list = false                             #客户请求时,使用模块列表
uid = root
gid = root
auth users = backup                      #连接用户名,和linux系统用户名无关系
secrets file = /etc/rsyncd.pass          #验证密码文件

rsyncd 密匙文件和提示文件

rsyncd 密匙文件和启动用户
1
2
3
4
5
6
7
8

## 创建认证用户密码文件并进行授权600

mkdir /etc/rsyncd.d
echo "rsync_backup:rsync_9391" >>/etc/rsyncd.d/rsync.auth
chmod 600 /etc/rsyncd.d/rsync.auth

echo "Waring, this is private server." > /etc/rsyncd.d/rsync.motd

rsyncd 启动用户

1
2
3
4
5
6
7

## 创建rsync管理用户,如果不用root启动rsyncd

groupadd -g 80 rsyncd
useradd -c "rsyncd Daemon" -M -g rsyncd -s /sbin/nologin -u 80 rsyncd

## useradd -s /sbin/nologin -M rsyncd

rsyncd 文件目录

rsyncd 存放同步文件目录
1
2
3
4
5

## 创建数据备份储存目录,目录修改属主

mkdir /data/wwwroot/
chown -R rsyncd:rsyncd /data/wwwroot/

客户端部署

## 确认rsync 安装
rpm -qa |grep rsync

yum install rsync

添加密码文件,不需要用户名

mkdir /etc/rsyncd.d
echo "rsync_9391" >>/etc/rsyncd.d/rsync.password
chmod 600 /etc/rsyncd.d/rsync.password

测试数据传输

rsync -azHAX --port=55873 /data/test  rsync_backup@200.200.200.222::wwwroot  --password-file=/etc/rsyncd.d/rsync.password

rsync -azHAX --delete --port=55873  --bwlimit=10240 /data/test  rsync_backup@200.200.200.222::wwwroot  --password-file=/etc/rsyncd.d/rsync.password


## 注意同步目录(/data/test/),

    后面加/表示同步目录下的文件及子文件夹, 与目标服务器的目录下的所有文件和文件夹一致,多余的会被删除。

    不加/表示同步/data/test目录,目标服务器的目录下会创建对应的test目录。而且只有test目录下的文件和文件夹一致,不会理会test目录外的文件或文件夹

客户端直接通过ssh同步两个目录,不经服务端

## 注意源目录后面加了/, 下面/data/test和/data/wwwroot 目录下的内容将会保持一致,/data/wwwroot下面多余内容将删除
sudo rsync -azHAX --delete -e "ssh "  /data/test/ root@200.200.200.222:/data/wwwroot

rsync 选项

-V : --verbose 传输时显示详细信息和进度.
-z : --compress 传输进行压缩以提高传输效率, --compress-leve=NUM 可按级别压缩
-n : 执行空运行,模拟执行,显示更改。执行rsync操作前先执行空运行,以确保重要的文件不会被覆盖或删除.
-a : --archive 代表存档模式,相当于使用了-rlptgoD这一坨选项,默认已同步符号连接,但硬连接除外。同时不会同步高级文件全限(ACL 和 SELinux上下文),同步ACL需要启用-A 选项,同步SElinux上下文启用-X(大写)选项. 

-r : --recursive 递归同步整个目录树
-l : --links 同步符号连接
-p : --perms 保留权限
-t :  --time,保留时间信息
-g : --group 保留组所有权
-o : --owner 保留文件所有者
-D : --devices 同步设备文件, 保留设备文件信息

-P : --progress 大写的P,显示同步的过程以及传输时的进度等信息

-H : 保留硬连接。
-A, --acls    preserve ACLs (implies --perms)
-X, --xattrs  preserve extended attributes,保留selinux特性

-S : 对稀疏文件进行特殊处理以节省DST的空间

-e : --rsh=COMMAND 使用ssh信道协议

--bwlimit=KBPS : 限制传输速度,用于传输大文件时,单位kb/s

rsync六种不同的工作模式:

1.拷贝本地文件,将/home/coremail目录下的文件拷贝到/cmbak目录下。

    rsync -avSH /home/coremail/ /cmbak/

2.拷贝本地机器的内容到远程机器。

    rsync -av /home/coremail/ 192.168.11.12:/home/coremail/

3.拷贝远程机器的内容到本地机器。

    rsync -av 192.168.11.11:/home/coremail/ /home/coremail/

4.拷贝远程rsync服务器(daemon形式运行rsync)的文件到本地机。

    rsync -av root@172.16.78.192::www /databack

5.拷贝本地机器文件到远程rsync服务器(daemon形式运行rsync)中。当DST路径信息包含”::”分隔符时启动该模式。

    rsync -av /databack root@172.16.78.192::www

6.显示远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

    rsync -v rsync://192.168.11.11/data