rsync服务的搭建

目录

一、rsync介绍

rsync的安装

二、rsync的语法

三、rsync命令使用

[1. 本机同步](#1. 本机同步)

[2. 远程同步](#2. 远程同步)

四、rsync作为服务使用

1、尝试启动rsync程序

2、rsync的配置文件介绍

注意事项:

[3. rsync+inotify实时同步](#3. rsync+inotify实时同步)

[3.依赖服务托管xinetd(CentOS 6中rsync)](#3.依赖服务托管xinetd(CentOS 6中rsync))


一、rsync介绍

  • rsync的好姐妹
    1. sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
    2. async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
    3. rsync 远程同步:remote synchronous。
  • rsync的特点
    1. 可以镜像保存整个目录树和文件系统

    2. 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等

    3. 传输效率高,使用同步算法,只比较变化的(增量备份)

      file1.txt file2.txt file3.txt(A服务器)

      file1.txt file2.txt(B服务器)

      rsync实现数据同步 => 只同步file3.txt => 增量备份

    4. 支持匿名传输,方便网站镜像;也可以做验证,加强安全

rsync与scp区别?

两者都可以实现远程同步,但是相对比而言,rsync能力更强。表现在:① 支持增量备份;② 数据同步时保持文件的原有属性。

rsync的安装

bash 复制代码
yum install rsync -y
#在这里我比较推荐yum安装,比较方便

rsync认证方式

rsync有两种常用的认证方式,一种是rsync-daemon方式(客户端连接873端口,实现数据传输, 传输过程不加密),另外一种是ssh方式(走ssh加密通道)。在 rsync 命令中,如果使用单个冒号(:),则默认使用 ssh 协议; 反之,如果使用两个冒号(::),则使用 rsync 协议。 在平时使用过程,我们使用最多的是rsync-daemon方式。 注意:(1) 在使用rsync时,服务器和客户端都必须安装rsync程序。 (2)、rsync-daemon认证方式,需要服务器和客户端都安装rsync服务并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。 客户端启动不启动rsync服务,都不影响同步的正常进行。**(3)**ssh认证方式,不需要服务器和客户端配置rsync配置文件 只需要双方都安装rsync服务,并且也不需要双方启动rsync。

两种认证方式的本质区别:(1)、ssh 协议认证连接的两端是通过管道完成通信和数据传输的,当连接到远程主机时,将在远程主 机 fork 出 rsync 进程使其成为 rsync server;(2)、而 rsync 协议认证是事先在远程主机上运行 rsync 守护进 程,监听套接字等待客户端的连接,建立连接后所有通信方式都是通过套接字完成的。

二、rsync的语法

  • man rsync
bash 复制代码
NAME
       rsync --- a fast, versatile, remote (and local) file-copying tool
       //一种快速、通用、远程(和本地)的文件复制工具

SYNOPSIS
       Local:  rsync [OPTION...] SRC... [DEST]

       Access via remote shell:
       //通过远程shell访问(命令)
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

       Access via rsync daemon:
       //通过后台程序访问(作为服务)
         Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
               rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
               rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
               
  • rsync命令参数
bash 复制代码
	-v    	详细模式输出
	-a    	归档模式,递归的方式传输文件,并保持文件的属性,equals -rlptgoD

	-r    	递归拷贝目录
	-l		保留软链接
	-p    	保留原有权限
	-t     	保留原有时间(修改)
	-g    	保留属组权限
	-o     	保留属主权限
	-D    	等于--devices  --specials    表示支持b,c,s,p类型的文件

	-R	    保留相对路径
	-H    	保留硬链接
    -A    	保留ACL策略
    -e     	指定要执行的远程shell命令
    -E     	保留可执行权限
    -X     	保留扩展属性信息  a属性

三、rsync命令使用

1. 本机同步

bash 复制代码
注意:
1. 本地数据同步的时候,源目录后面的"/"会影响同步的结果
	 # rsync -av /dir1/ /dir3		//只同步dir1目录下面的文件到指定的路径
	 # rsync -av /dir1 /dir2		//将当前目录dir1和目录下的所有文件一起同步

2. -R:不管加不加"/",都会将源数据的绝对路径一起同步
	# rsync -avR /dir1/ /dir2/
3. --delete:删除目标目录里多余的文件
	# rsync -avR --delete /dir1/ /dir2/

2. 远程同步

bash 复制代码
pull: rsync -av user@host:/path local/path
# rsync -av root@10.1.1.1:/etc/hosts /dir1/
# rsync -av root@10.1.1.1:/backup /dir1
push: rsync -av local/path user@host:/path
# rsync -av /dir1/aa1 code@10.1.1.1:/home/code

思考:

rsync远程同步数据时,默认情况下为什么需要密码?如果不想要密码同步怎么实现?

bash 复制代码
因为两台Linux服务器在连接时,默认使用的还是SSH协议。由于没有做免密登录,所以还是需要输入对方服务器的密码。
如果不想输入密码,可以使用免密登录来实现。
# ssh-keygen
# ssh-copy-id root@10.1.1.250

四、rsync作为服务使用

思路:

对外提供服务------>端口监听------>启动服务------>启动脚本(没有)------>配置文件(修改需求)

1、尝试启动rsync程序

bash 复制代码
[root@jumper ~]# rsync --daemon
Failed to parse config file: /etc/rsyncd.conf
说明:先尝试以后台程序的方式启动它
原因:没有配置文件(默认没有)
解决:创建配置文件
[root@jumper ~]# touch /etc/rsyncd.conf
[root@jumper ~]# rsync --daemon        
[root@jumper ~]# ps -ef|grep rsync
root       3814      1  0 11:43 ?        00:00:00 rsync --daemon
root       3817   2826  0 11:44 pts/0    00:00:00 grep rsync
[root@jumper ~]# netstat -nltup|grep rsync
tcp        0      0 0.0.0.0:873                 0.0.0.0:*                   LISTEN      3814/rsync          
tcp        0      0 :::873                      :::*                        LISTEN      3814/rsync    
结论:
1. rsync启动时必须要读取配置文件,如果没有报错
2. rsync默认情况下,端口是873,协议tcp


#或者启动rsyncd服务(CentOS6中没有,CentOS7中有这个服务)
# systemctl start rsyncd 

2、rsync的配置文件介绍

bash 复制代码
man 5 rsyncd.conf
全局的参数
	port = xxx
	pid file = xxx
	...
局部模块
[模块名1]
	path = /dir1
	uid = xxx
	gid = xxx
	log file = xxx
    max connections =4
    .....
[模块名2]
	path = /dir2
	uid =xxx
	gid = xxx
    .....

# 以 rsync 用户启动进程
# 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证rsync用户对文件有读取的权限;如果是
从客户端=>服务端,要保证rsync对文件有写权限。
uid = rsync
gid = rsync
# uid和gid表明同步上来的文件写入的时候是使用哪个用户身份进行写入的。所以,这个用户必须要对 
path 定义的目录有写入权限。否则会在客户端报:rsync: xxx failed: Permission denied (13)
fake super = yes    
# 如果设置为yes,那么文件的所有者和所属组信息变成rsync虚拟用户的UID,GID,想要所有者和所属组信
息不变可以设置fake super   
use chroot = yes
# 禁锢推送的数据至某个目录, 不允许跳出该目录
#允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时
必须使用root权限,且不能备份path路径外的链接文件

max connections = 200                   # 最大连接数
timeout = 300                           # 超时时间
pid file = /var/run/rsyncd.pid          # pid文件路径
lock file = /var/run/rsync.lock         # 锁文件路径
exclude = lost+found/                   # 剔除某些文件或目录,不同步
transfer logging = yes                  # 记录传输文件日志
log file = /var/log/rsyncd.log          # 指定日志文件
log format = %t %a %m %f %b             # 日志文件格式
ignore errors                           # 忽略错误信息
list = false                            # 不允许查看模块信息
hosts allow = 192.168.42.0/24           # 只允许192.168.42.0/24段ip连接
hosts deny = *                          # 不允许所有网段ip连接
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 设置不需要压缩的文件
path = /home/nebula/backup              # 上传的文件存储的目录,下载文件的读目录
comment = nebula userdata backup        #共享给客户端看到的名字,可以自己定义
read only = false                       # backup这个模块儿,是否可以被写入。
auth users = youyou                     # 虚拟用户名,即就是上传时rsync命令书写中写的。
secrets file = /etc/rsync.password      #密码文件,服务端书写格式为虚拟用户名:密码 客户端的书写格式为  虚拟用户所对应的密码
   
# 以下为安全配置,请按照具体的生产环境需求配置。如:上传到服务端上的文件,并不希望被客户端同步
删除
   refuse options = delete delete-delay delete-before delete-excluded deleteafter
 max-delete force partial P
# pre-xfer 用于可以在rsync传送之前,执行一些操作,如建立锁定文件,保证每次只有一个链接进行
数据传输,
# post-xfer 可以保证数据传输完毕之后可以自动执行后续动作。
pre-xfer exec = sh /root/.rsync_pre.sh
post-xfer exec = rm -f /var/rsync.lock

日志文件格式补充:

注意事项:

  1. 不论是在服务端还是客户端,密码文件的权限都必须是600,否则就会报错。服务端rsync服务是以什么用户运行,则必须保证secrets file文件拥有者必须是同一个。假设root运行rsync --daemon,则secrets file的owner也必须是root;secrets file权限必须是600。
  2. 在服务器端端尽量将所同步的文件的属主和属组改为rsyncd.conf文件中对应的uid和gid对应的用户和用户组。避面上传和下载的时候发生不必要的错误。
  3. 要想给服务端的模块下上传文件,就必须要在服务端的配置文件中对相应的模块中添加 read only=false,否则上传文件就会失败。
  4. auter users中的用户是不用在服务端创建的(只是虚拟存在而已),而uid和gid对应的用户和用户组必须是存在的(一般我们把uid指定为useradd -r系统用户或useradd -M不创建家目录,并且会指定shell为/sbin/nologin);虽然我们在远程上传和本地下载的时候用的是对应的虚拟用户,但是在rsync在验证的是时候是这里uid和gid。
  5. 没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步;坏处就是不安全,但你可以使用防火墙等来加强安全。
  6. 同步可能出现的问题:
    • 如果同步报permission denied这种,可能是服务端selinux没有关闭
    • 同步时间慢:解决方法------绑定对方主机名
  7. 如果你希望有密码,可以用rsyncd本身自带的secrets file来做用户验证

3. rsync+inotify实时同步

需求: app1-server服务器上的/app/java_project目录的文件和backup主机上的/backup目录实时同步
分析: rsync本身不可以做到数据的实时同步,需要借助第三方工具,intotify工具。实现线上环境目录发生改变立马同步到backup主机,是单向同步。

参考-------备份端的rsyncd.conf的配置如下:

bash 复制代码
[my_java]
path=/root/java
comment=my_java.bak
log file=/var/log/rsyncd.log
uid=java_user
gid=java_user
auth users=xiaowang
secrets file=/etc/rsyncd.secrets
read only=false
ignore errors
bash 复制代码
服务端得创建用户
useradd -s /sbin/nologin -M java_user
服务端的密码文件
echo "xiaowang:123456" >> /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets
客户端的密码文件
echo "123456" >> /etc/rsyncd.secrets
chmod 600 /etc/rsyncd.secrets

步骤:
1. 在服务器端上安装inotify工具

  • 原码安装或者结合epel源使用yum 进行安装
  • 安装完后,就会产生下面两个命令

/usr/local/bin/inotifywait 等待 、/usr/local/bin/inotifywatch 看守

2. 查看命令如何使用,然后编写脚本来实现目录的监控

  • 注意:该脚本应该在备份服务器运行,该服务器是往备份服务器上进行推送
bash 复制代码
# inotifywait --help
  • -m 保持监控状态
  • -r 递归监控
  • -q 只打印事件
  • -e 指定事件

事件:

  • move 移动、delete 删除、create 创建、modify 修改、attrib 属性信息
  • 编写脚本-----实时监控要镜像备份的目录(脚本我们后面会讲到)
bash 复制代码
vim /root/inotify.sh

#!/bin/bash
/usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /root/java.bak | while read events
do
        rsync -av --delete --password-file=/etc/rsyncd.secrets /root/java.bak/ xiaowang@192.168.17.3::my_java/   &> /dev/null
        echo "`date +%F\ %T`出现事件$events" >> /var/log/rsyncd.log 2>&1
done

# chmod +x inotify.sh        增加可执行权限
# ./inotify.sh  &            将脚本放到后台去运行

注意:

如果单纯使用命令去推的话,正常情况下需要密码,不利于脚本编写,在这里提供2中解决方案:1)设置免密码登录;2)在backup服务器上将rsync作为后台程序运行

3. 测试验证

bash 复制代码
[root@localhost java.bak]# touch file.c
[root@localhost java.bak]# rm -rf file.c
[root@localhost java.bak]# cat /var/log/rsyncd.log
2025-06-01 22:25:54出现事件/root/java.bak/ CREATE file.c
2025-06-01 22:25:55出现事件/root/java.bak/ ATTRIB file.c
2025-06-01 22:25:56出现事件/root/java.bak/ DELETE file.c

3.依赖服务托管xinetd(CentOS 6中rsync)

**独立服务:**独立启动脚本 ssh ftp nfs dns ...

依赖服务: 没有独立的启动脚本 依赖xinetd服务(独立服务)

  1. 平时不占用系统的运行资源
  2. xinetd服务管理依赖服务
  3. 一些轻量级服务会托管给xinetd服务

如何将rsync托管给xinetd服务去管理?

1. 安装相应的软件

bash 复制代码
 yum -y install xinetd

2. 查看软件类别

bash 复制代码
rpm -ql xinetd
/etc/rc.d/init.d/xinetd
/etc/xinetd.conf
/etc/xinetd.d   xinetd服务管理的所有轻量级服务的目录
/usr/sbin/xinetd
/usr/share/man/man5/xinetd.conf.5.gz

3. 查看rsync软件列表

bash 复制代码
rpm -ql rsync
/etc/xinetd.d/rsync
/usr/bin/rsync

4. 了解配置文件

  • 1)xinetd服务的配置文件
bash 复制代码
man 5 xinetd.conf
only_from        只允许访问
no_access        拒绝访问
access_times    控制访问服务的时间段
log_type            指定日志类型
interface        并发连接数
per_source        每个IP的最大连接数
  • 2)rsync配置文件 /etc/xinetd.d/rsync
bash 复制代码
service rsync
{
    disable    = no        //开关;no表示开启该服务;yes表示关闭服务
    flags        = IPv6
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}

5. 把rsync服务的开关打开
6. 启动xinetd服务

bash 复制代码
service xinetd restart
[root@jumper ~]# netstat -nltp|grep 873
tcp        0      0 :::873                      :::*                        LISTEN      6209/xinetd    

到此,rsync服务就托管给了xinetd服务管理;后续需要有些需求,修改配置文件:
/etc/rsyncd.conf、/etc/xinetd.d/rsync

本 篇 完 结 ... ...


持 续 更 新 中 ... ...

相关推荐
纳切威几秒前
CentOS 10 系统安装
linux
apolloyhl2 分钟前
Linux目录
linux
java_logo6 分钟前
Docker 部署 Debian 全流程教程
linux·运维·docker·容器·debian
哈喽哈喽哈喽~8 分钟前
推送文件到github ---服务器关键配置内容
运维·服务器·经验分享·github
❀͜͡傀儡师10 分钟前
基于 docker compose 进行部署PandaWiki
运维·docker·容器
天上飞的粉红小猪27 分钟前
linux的文件系统
linux·运维·服务器·1024程序员节
阿里云云原生35 分钟前
阿里巴巴 AI Coding 分享会 Qoder Together 杭州站来啦!
云原生
珊瑚礁的猪猪侠1 小时前
正则表达式入门到精通教程(Linux实操版)
linux·人工智能·正则表达式
阿里云云原生1 小时前
告别手动埋点!Android 无侵入式数据采集方案深度解析
android·云原生
czhc11400756631 小时前
JAVA1026 方法;类:抽象类、抽象类继承;接口、接口继承 Linux:Mysql
java·linux·mysql