Rsync
一 基础知识
1、Rsync简介
可实现全量及增量、本地或远程的数据同步备份的工具
官网:https://www.samba.org/ftp/rsync/rsync.html
相当于cp(本地复制)、scp(远程复制)、rm(删除)命令的合体但比这三个命令更优秀
既能够备份数据内容,也能够备份属性信息
同步目录时,若以"/"结尾,则表示同步目录下所有文件,不会连同目录一起同步;若不以"/"结尾,则表示同步目录下所有文件,并连同目录一起同步
2、Rsync优缺点:
优点 | 缺点 |
支持拷贝特殊文件如链接文件,设备等 |
大量小文件同步的时候,时间较长,有时候rsync进程可能会停止 |
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能 |
同步10G这样的大文时时,可能会中断,未完整同步前,是隐藏文件 |
可以做到保持元文件或目录的权限、时间、软硬链接、属主、组等所有属性均不变 |
rsync本身不对数据加密,需配合ssh等实现加密 |
可实现增量同步,默认只同步发生变化的数据(大小或者最后修改时间发生变化的文件或目录),因此同步数据的效率很高 |
|
可以使用rcp,rsh,ssh等方式来配合传输文件达到加密传输 |
|
可以通过socket(守护进程方式)传输文件和数据(服务端和客户端) |
|
支持匿名的、认证的(无需系统用户)进程模式传输,可方便安全的进行数据备份及镜像 |
3、Rsync的工作方式
单个主机本地之间的数据传输(类似于cp)
借助rcp,ssh等通道来传输数据(类似于scp)
以守护进程(socket)的方式来传输数据(服务端和客户端)
二 普通用法
1、基本参数
注:rsync备份时,如果备份/tmp,表示备份目录名和目录下的内容,如果备份/tmp/,表示只备份目录下的内容
参数 | 说明 |
-v | 详细模式输出,传输时的进度等信息 |
-z | 传输时进行压缩以提高传输效率。--compress-level=NUM可按级别压缩 |
-a | 归档模式,表示以递归方式传输文件,并保持文件所有属性,等于rtopgDI |
--append | 指定文件接着上次中断的地方,继续传输 |
--append-verify | 跟--append 参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件 |
-r | 对子目录以递归传递,即目录下的所有目录都同样传输,注意是小写r |
-t | 保持文件时间信息 |
-o | 保持文件属主信息 |
-p | 保持文件权限 |
-g | 保持文件属组信息 |
-D | 保持设备文件信息 |
-l | 保留软链接 |
-H | 保留硬链接 |
-u | 仅进行更新,跳过已经存在目标目录的文件,只复制目标目录没有的且文件时间要晚于备份时间的新文件 |
-P | --progress 和--partial 这两个参数的结合 |
--partial | 允许恢复中断的传输。不使用该参数时,rsync 会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append 或--append-verify 配合使用 |
--progress | 显示同步的过程及传输的进度等信息 |
--partial-dir | 参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial 。一般需要与--append 或--append-verify 配合使用。 |
-e | 使用指定的shell程序替代传输用的rsh管道,如ssh(-e 'ssh -p 22') |
--exclude=PATTERN | 指定排除不需要传输的文件(和tar参数一样) |
--exclude-from=file | 指定排除某个目录中的某个文件(和tar参数一样) |
--include | 指定必须同步的文件,往往与--exclude结合使用 |
--bwlimit=RATE | 每秒最大传输速率,用来限制传输时的带宽(避免占用全部网络带宽),默认单位是 KB/s。如--bwlimit=100,则每秒最大传输100kb的数据 |
--delete | 默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用--delete参数,这将删除只存在于目标目录、不存在于源目录的文件。 |
-m | 不同步空目录 |
--max-size | 设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k' ) |
--min-size | 设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k ) |
-n | 如果不确定 rsync 执行后会产生什么结果,可以先用-n 或--dry-run 参数模拟执行的结果 |
--size-only | 只同步大小有变化的文件,不考虑文件修改时间的差异 |
2、普通模式
# 本地模式
rsync [OPTION...] 源路径 目的路径
# 远程模式
# 注:前面的是原路径,后面的是目标路径,推和拉的区别仅仅是远端地址所在的位置,远端用户名可省略,省略代表用本机当前用户去连接
推:rsync [OPTION...] [远端用户@]主机名或IP:源路径 目标路径
拉:rsync [OPTION...] 源路径 [远端用户@]主机名或IP:目标路径
注意: rsync不管是推还是拉,推送目录的时候带/和不带/
1.带/ :/etc/ 将etc目录里的所有内容(不包括目录),推过去或者拉过来
2.不带/:/etc 将etc目录整体(包括目录及目录里的所有内容)推过去或者拉过来
3、示例
# 备份本机hosts文件到tmp目录 rsync -avz /etc/hosts /tmp # 推送本机hosts文件到另外一台主机tmp目录 rsync -avz /etc/hosts root@172.16.1.31:/tmp/ # 拉取远端主机hosts文件本机tmp目录 rsync -avz root@172.16.1.31:/etc/hosts /tmp/ # 配合ssh加密传输数据[-e] rsync -avz -e 'ssh -p 22' /etc/hosts root@172.16.1.31:/tmp/ # 同步时排除某些文件[--exclude]
# --exclude参数使用相对路径,可以排除单个和多个文件
# 也可以用--exclude-from=paichu.txt,排除这个文件中指定的文件 rsync -avz --exclude=a.txt /backup/ root@172.16.1.41:/tmp/ rsync -avz --exclude-from=paichu.txt /backup/ root@172.16.1.41:/tmp/ # 无差异同步[--delete]
# --delete会把服务器上有而本地没有的数据全部删除,非常危险,慎用 rsync -avz --delete /backup/ root@172.16.1.41:/tmp/ # 限速[--bwlimit] sync -avz --bwlimit=100 /backup/ root@172.16.1.41:/tmp/
三 守护进程模式(C/S)
1、基础说明
搭建服务端启动守护进程(873端口),然后在客户端推或拉数据进行备份
比普通远程模式好的地方在于,免交互的备份数据,常配合定时任务进行定时备份
在守护进程中,不考虑加/或者不加/
语法:
拉: rsync [OPTION...] [USER@]HOST::SRC DEST
推: rsync [OPTION...] SRC [USER@]HOST::DEST
2、服务器端配置过程:
1)添加rsync服务的用户(linux系统自带rsync,若没有可yum下载)
useradd -s /sbin/nologin -M rsync
2)生成 /etc/rsyncd.conf 配置文件并写入内容(注释用的#号必须写在行首)
uid = 0 gid = 0 port = 873 use chroot = yes max connections = 200 timeout = 300 log file = /var/log/rsyncd.log ignore errors list = false hosts allow = 10.0.0.0/8 auth users = rsync_backup secrets file = /etc/rsyncd.password [backup] comment = "backup dir by noah" path = /backup read only = false
配置文件详解
# 注释用的#号必须写在行首 uid = root # 客户端向服务端传输文件实际使用的用户 gid = root # 用户组id port = 873 # 服务默认监听端口 #fake super = yes # 无须使用root用户启动,允许接收文件的完整属性 use chroot = yes # 为yes:保留软链,硬链 max connections = 200 # 最大连接数 timeout = 300 # 超时时间 pid file = /var/run/rsyncd.pid # 进程对应的进程号文件 lock file = /var/run/rsync.lock # 锁文件,防止文件不一致 log file = /var/log/rsyncd.log # 日志文件 ignore errors # 忽略错误 list = false # 不允许查看模块信息 hosts allow = 172.16.1.0/24 # 白名单,允许的网段 #hosts deny = 0.0.0.0/32 # 黑名单,拒绝的网段 auth users = rsync_backup # 链接的虚拟用户,非系统用户 secrets file = /etc/rsyncd.password # 虚拟用户的账号密码文件 [backup] # 模块名称,可以有多个,称为多模块 comment = "backup dir by noah" # 模块描述信息 path = /backup # 服务器提供的共享目录 read only = false # 可写 [test] path = /test
3)创建共享目录并授权rsync服务管理
mkdir /backup -p
chown -R rsync.rsync /backup/
4)创建认证文件并修改权限
# 此处的用户和密码,非系统中的用户和密码
echo "rsync_backup:123456" > /etc/rsyncd.password chmod 600 /etc/rsyncd.password
5)启动服务并设置开机自启
rsync --daemon echo "/usr/bin/rsync --daemon" >> /etc/rc.local
3、客户端配置
1)生成连接服务器需要的密码文件
echo "123456" > /etc/rsyncd.password chmod 600 /etc/rsyncd.password
2)将客户端下的文件推送至服务端
# ip后面跟的backup是服务器配置文件中的模块名,不是备份路径 rsync -avzHP --delete /etc/hosts rsync_backup@172.16.1.41::backup --password-file=/etc/rsyncd.password --bwlimit=1024
3)拉取服务端下的文件
rsync -avzHP rsync_backup@172.16.1.41::backup /backup/ --password-file=/etc/rsyncd.password --bwlimit=1024
四、补充
4.1 同步后的文件属性问题
在使用c/s模式进行同步时,要用root账号(即uid = root),不过同步后,同步根目录的属主属组也会变成root
用其他普通用户同步,文件跟目录的属主属组会变成相应uid 指定的用户;网上查说是要加 fake super = yes 这个参数,但我加上后再测试,文件属性还是无法保留
原文件:
使用uid = rsync 同步后的文件:
使用uid = root 同步后的目录及文件:
解决方法:修改/etc/rsyncd.conf 配置文件中的uid跟gid
uid = 0 # 以 root 用户运行(允许保留属主) gid = 0 # 以 root 组运行(允许保留属组)
4.2 同步后软链接异常
同步后发现软链接异常,如下图。软链目录前面都加上了/rsyncd-munged/路径,导致软链路径不对
正常应该是
百度到应该修改chroot配完为 use chroot = yes
当为false/no 时,rsync为了防止软链被恶意使用,在同步后加上/rsyncd-munged/路径;当为yes时,会被限制在同步路径文件夹中,无法使用软链获取到同步文件夹之外的文件
4.3 使用rsync删除大文件
假如要在linux下删除大量文件,比如100万、1000万,像/usr/local/nginx/的nginx缓存等,那么rm -rf * 可能就不好用了,因为要等待很长一段时间;这时可以使用rsync来处理(替换原理)
# 先建立一个空的文件夹: mkdir /tmp/null # 用rsync删除目标目录, (只用-a和--delete也可完成) rsync --delete -a -H -v --progress --stats /tmp/null/ /usr/local/nginx/
4.4 过滤规则
本章节摘抄自:https://zhuanlan.zhihu.com/p/441161884
4.4.1 选项
- --include=PATTERN :设定一条包含规则,如:
--include="*.php"
- --exclude=PATTERN :设定一条排除规则,如:
--exclude="*"
- --include-from=FILE :指定一个文件,文件中一行一条包含规则,以
;
或#
开头的行为注释,空行被忽略 - --exclude-from=FILE :指定一个文件,文件中一行一条排除规则,以
;
或#
开头的行为注释,空行被忽略 - --filter=RULE, -f :设定一条过滤规则,可能是排除或包含规则(如:
-f "- *.php"
),也可能其它类型的规则(如包含一个规则文件-f ". ./rsync.rules"
)
这些选项配置的规则,其本质是一样,只是描述方式有些差异。其中 --filter=RULE, -f
选项支持完整的规则表达语法,其它的选项都可以转化为此选项的表达。举例如下:
# 以下的都是命令是完全等价的,-f 方式更简单,后文将会更多的选用 -f 的方式表达 # --include="xxx" 等价于 -f "+ xxx" # --exclude="xxx" 等价于 -f "- xxx" rsync -av --include="*.php" --exclude="*" src_dir/ dst_dir/ rsync -av -filter "+ *.php" -filter "- *" src_dir/ dst_dir/ rsync -av -f "+ *.php" -f "- *" src_dir/ dst_dir/
由 --include-from 或 --exclude-from 选项引入的规则文件,相当于每个规则前面自动加了 +
或-
。其规则文件类内举例如下:
# --include-from 或 --exclude-from 引用的规则文件,开头没有 + 或 - *.php *
4.4.2 排除某些目录或文件不同步
# 排除app和vendor目录不同步 # 注意此命令会排除名称是app或vendor的目录或文件,因为模式规则1 rsync -av -f '- app' -f '- vendor' src_dir/ # 此命令则只排除 src_dir 一级子目录中的 app 和 vendor rsync -av -f '- /app/' -f '- /vendor' src_dir/ # 排除更深层次的子目录 rsync -av -f '- /app/Admin' -f '- /vendor' src_dir/ # 排除隐藏文件/目录 和 php文件 # 因为模式规则9,10,4,模式`.*`相当于是要求路径最后的名称(文件或目录)必须是`.`开头 rsync -av -f '- .*' -f '- *.php' src_dir/
排除多个目录
rsync -av --exclude-from 'exclude.txt' src_dir/ dst_dir/
exclude.txt内容:
# test 跟 test/ 都是排除相对路径下的test目录,都能实现,具体区别尚不清楚 test test/ *.php
4.4.3 只同步指定的子目录
以下所有命令均等价,只是实现思路不同。效果都是:只同步config目录(包括所有子目录和文件)
# 命令4.2-1:使用了模式规则1、4 # 因模式规则1,-f '- /*'规则排除了str_dir目录下出config外所有的文件和子目录 # 递归扫描config目录时,因不命中任何规则,所有子目录和文件都被默认包含 rsync -av -f '+ config' -f '- /*' src_dir/ # 命令4.2-2:使用了模式规则4、5、9 # -f '+ config'匹配config目录并包含 # -f '+ config/**' 匹配config目录下所有的子目录和文件的路径,包含。模式规则5 # 其余所有的路径被 -f '- *'匹配,排除。模式规则4、9 rsync -av -f '+ config/**' -f '+ config' -f '- *' src_dir/ # 命令4.2-3: # -f '+ config/***' 匹配config目录以及其所有子目录和文件。规则6 rsync -av -f '+ config/***' -f '- *' src_dir/ # 命令4.2-4: # 使用修饰符!取反,排除了config目录以及其所有子目录和文件路径以外的路径 # 相当于只同步config目录 rsync -av -f '-! config/***' src_dir/
只同步多个一级子目录(只同步config、app目录(包括所有子目录和文件))
# 注意两条命令的排除规则是不同的,可以参考体会一下模式规则1 rsync -av -f '+ config' -f '+ app' -f '- /*' src_dir/ rsync -av -f '+ config/***' -f '+ app/***' -f '- *' src_dir/
只同步更深层级的子目录
模仿只同步一级子目录的写法,可能会直接把命令写成rsync -av -f '+ app/Admin' -f '- /*' src_dir/
。但此命令并不能按预期工作。原因是rsync扫描到app路径时,并不能命中-f '+ app/Admin'
规则,然后就后面的规则排除掉了。然后就没然后了,此命令不会同步任何文件。
明白这个问题后,修正它,然后就可写出只同步app/Admin子目录(包含所有子目录和文件)的命令了,以下都是:
# 命令4.2-5: # 扫描到一级子目录app时,其路径并不会和规则 -f '+ app/Admin/' 匹配,因为模式规则9 # app 路径是有规则 -f '+ app' 命中包含的。此规则若去掉,则此命令不会同步任何文件和目录 # -f '- /*' -f '- /*/*' 两条规则是排除所有未被前面规则包含的一级子目录/文件和二级子目录/文件 # app/Admin/ 下的子目录/文件将不会在命中规则,默认包含 rsync -av -f '+ app/Admin/' -f '+ app' -f '- /*' -f '- /*/*' src_dir/ # 命令4.2-6:效果同命令3-5 # 思路同命令4.2-4 rsync -av -f '+ app' -f '-! app/Admin/***' -f '- /*' src_dir/ # 命令4.2-6:效果同命令3-6,思路则不同 # -av -f '+ app'规则包含app # -av -f '+ app'规则包含app/Admin/目录及所有子目录和文件 # 其余路径由 -f "- *" 排除 rsync -av -f '+ app' -f '+ app/Admin/***' -f "- *" src_dir/ # 命令4.2-7 # -f '-! app/***'规则使用取反,只保留app子目录 # -f '+ app/Admin/' 包含app/Admin/目录,其余二级子目录由规则-f "- /*/*"排除 # app/Admin/目录下所有子目录和文件,无规则命中,保留 rsync -av -f '-! app/***' -f '+ app/Admin/' -f "- /*/*" src_dir/
只同步多个深层级的子目录
与只同步一个深层级子目录类似,也可以写出很多不同的命令。但问了减少出错,建议使用命令4.2-6的思路,比较简洁。给深层的子目录的所有父级目录都添加好包含规则,然后深层子目录添加***
的包含规则,最后是一条排除规则。
rsync -av -f '+ /app' -f '+ /app/Admin/***' -f '+ /vendor' -f '+ /vendor/psy' -f "- *" src_dir/
4.4.4 快速复制目录结构
有时需要需要创建一个目录,其子目录层次结构与另一个目录结构一样,但不需要其中的文件,这可以用rsync命令快速完成
# 使用了修饰符!取反,排除了目录以外的路径。模式规则1 rsync -av -f '-! */' src_dir/ dst_dir/
4.5 无密码两机器同步(慎用)
服务端配置如下,启动rsync服务
uid = root gid = root use chroot = yes strict modes = false pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock transfer logging = true log format= "%o [%a] %m (%u) %f %l %b %c" reverse lookup = no ignore errors = true read only = false hosts allow = 10.35.0.0/16,10.0.0.0/8 strict modes = yes list = false max connections = 100 timeout = 1800 [data] path = /data ignore errors
客户端拉取:
rsync -avzHP 10.10.10.10::data /data
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端