rsync备份(实操篇)

文章目录

rsync备份(实操篇)

相关参考内容

安装

rsync 并不是所有 Linux 发行版默认自带的程序,但大多数主流发行版会预装它,或者可以通过官方软件仓库轻松安装

  • 检查是否已安装
    运行以下命令:
rsync --version
  • 或检查安装路径:
which rsync

如果提示 command not found,则说明未安装。

  • Debian/Ubuntu安装:
sudo apt update && sudo apt install rsync -y
  • RHEL/CentOS安装:
sudo yum install rsync -y     # CentOS 7 或更早
sudo dnf install rsync -y     # CentOS 8+/RHEL 8+

本地工作模式

rsync本地模式 vs cp 区别对比

特性rsynccp
增量同步✅ 仅传输变化的部分,节省时间和带宽❌ 总是完整复制文件
校验机制✅ 通过校验和确保数据一致性❌ 仅依赖时间戳或大小
保留属性✅ 保留权限、时间戳、所有者等❌ 需加 -p 等选项
删除目标多余文件✅ 可用 --delete 清理目标❌ 无法自动清理
试运行(dry-run)✅ 支持模拟操作,避免误操作❌ 不支持
中断恢复✅ 支持断点续传❌ 需重新开始

本地模式实操示例

场景1:基本同步(类似 cp
# 同步本地目录(递归复制)
rsync -av /source/path/ /destination/path/

-a:归档模式(保留权限、时间戳等,相当于 -rlptgoD)。

-v:显示详细过程。

注意:源路径末尾的 / 表示同步目录内容(不含目录本身),不加 / 会同步整个目录。

在这里插入图片描述

场景2:增量同步(仅传输变化部分)
rsync -av --progress /source/path/ /destination/path/

--progress:显示传输进度。

在这里插入图片描述

场景3:删除目标多余文件(保持严格一致)
rsync -av --delete /source/path/ /destination/path/

--delete:删除目标中存在但源中不存在的文件(谨慎使用!)。

在这里插入图片描述

场景4:试运行(dry-run)
rsync -avn --delete /source/path/ /destination/path/

-n:模拟操作,不实际执行,用于检查哪些文件会被同步或删除。

在这里插入图片描述

场景5:校验文件一致性(确保数据正确)
rsync -avc /source/path/ /destination/path/

-c:基于校验和(而非时间戳/大小)检查文件差异,更可靠但更慢。

在这里插入图片描述

场景6:排除文件(避免同步大量不必要的临时文件或临时日志信息)
  • 排除单个目录
rsync -av --exclude='目录名' /源路径/ /目标路径/
  • 示例:排除 tmp目录
rsync -av --exclude='tmp' /project/ /backup/

在这里插入图片描述

  • 排除多个目录
    用多个 --exclude 或逗号分隔(需结合 --exclude-from):
rsync -av --exclude='dir1' --exclude='dir2' /源路径/ /目标路径/
  • 或使用通配符排除某一类目录(如所有以 .cache 结尾的目录):
rsync -av --exclude='*.cache' /源路径/ /目标路径/

在这里插入图片描述

  • 使用 --exclude-from 从文件读取排除规则
  • 如果排除规则较多,可以将其写入文件(每行一个规则):
rsync -av --exclude-from='排除规则文件' /源路径/ /目标路径/
  • 示例文件内容(exclude-list.txt):
tmp
d1
*.tmp
  • 执行命令:
rsync -av --exclude-from='exclude-list.txt' /源路径/ /目标路径/

在这里插入图片描述

对比rsync -avcrsync -av --delete

rsync -avcrsync -av --delete 是两种常用的 rsync 操作模式,它们在功能和用途上有显著区别。

rsync -avc:校验模式(Checksum)
  • 功能
    -c(–checksum):基于文件内容的校验和(而非文件大小或修改时间)判断是否需要同步。

    即使文件大小和时间戳相同,只要内容变化就会触发同步。

    确保数据一致性,但会消耗更多 CPU 和 I/O 资源(需计算校验和)。

  • 典型用途

    • 关键数据备份:确保目标文件与源文件内容完全一致(例如数据库备份)。

    • 防篡改检查:检测文件内容是否被意外修改(如恶意软件感染)。

    • 跨系统同步:不同文件系统可能导致时间戳不可靠时(如 NTFS → ext4)。

    • 示例

    rsync -avc /source/ /backup/
    

    同步 /source/ 到 /backup/,强制校验文件内容差异。

rsync -av --delete:删除模式
  • 功能

    • --delete:删除目标目录中存在但源目录中不存在的文件。

    • 严格保持目标与源目录的完全一致(包括删除多余文件)。

    • 高风险操作:误用可能导致数据丢失!

  • 典型用途

    • 镜像同步:让目标目录成为源的精确副本(例如网站部署、CDN 缓存更新)。

    • 清理旧文件:定期同步时自动删除目标端已废弃的文件。

    • 磁盘空间管理:避免冗余文件占用空间。

  • 示例

    rsync -av --delete /source/ /backup/
    

    同步 /source/ 到 /backup/,并删除 /backup/ 中所有不在 /source/ 的文件。

核心区别总结
对比项rsync -avcrsync -av --delete
核心功能通过校验和确保内容一致强制目标与源结构完全一致(删除多余文件)
资源消耗高(需计算校验和)低(仅对比文件名和属性)
风险等级低(只读操作)高(可能误删数据)
组合使用场景

两者可结合使用,实现 高可靠性同步 + 严格一致性:

rsync -avc --delete /source/ /backup/
  • 效果:

    • 基于校验和同步内容变化的文件。

    • 删除目标端的多余文件。

  • 适用场景:

    • 金融数据备份(内容必须一致且无冗余)。

    • 生产环境代码部署(需完全匹配仓库状态)。

关键注意事项

  • 路径斜杠 / 的含义:

rsync /source/path/ /dest/ → 同步源目录下的所有文件到 /dest/。

rsync /source/path /dest/ → 同步整个源目录到 /dest/path/。

  • 保留符号链接:

默认情况下,rsync -a 会保留符号链接。若需跟随链接(复制实际文件),改用-L选项:

rsync -avL /source/ /destination/

为什么选择 rsync 而非 cp

  • 大数据/频繁更新:rsync 的增量同步显著减少传输量。

  • 关键备份:校验和(-c)和试运行(-n)降低风险。

  • 网络同步扩展性:同一命令格式可直接用于远程同步(如 rsync -av user@remote:/path/ /local/)。

远程 Shell 模式(Remote Shell Mode)

rsyncShell模式 vs scp 区别对比

特性RsyncSCP
传输方式增量传输,只传输变化的部分全量传输,每次传输整个文件
速度通常更快(尤其对于大文件或多次传输)较慢
功能支持排除、包含、压缩、权限保持等功能较为简单
带宽使用更高效,可限速无带宽控制选项
恢复传输支持断点续传不支持
目录处理自动递归目录需要-r选项才能递归目录
链接处理可配置如何处理符号链接默认跟随符号链接
校验传输后进行校验无校验机制
使用场景适合备份、同步、大文件传输适合简单的一次性文件传输

何时使用哪个工具

  • 使用SCP:当需要简单快速地传输少量文件,且不需要增量同步时

  • 使用Rsync:当需要同步大量文件、需要增量备份、需要保留权限或需要排除某些文件时

Shell模式实操示例

使用shell模式,一般会配置秘钥免密码登录方式,可以参考Linux SCP传输文件免密配置

# 本地 → 远程(推文件)
rsync -avz -e ssh /local/path/ user@remote:/remote/path/

# 远程 → 本地(拉文件)
rsync -avz -e ssh user@remote:/remote/path/ /local/path/

# 指定SSH端口(如2222)
rsync -avz -e "ssh -p 2222" /local/ user@remote:/remote/
场景 1: 基本增量同步(保留权限、时间戳)
rsync -avz /source/ user@remote:/destination/

在这里插入图片描述

场景 2:限速增量备份(排除临时文件)
rsync -avz --bwlimit=500 --exclude='*.log' /data/ backup@server:/backups/

在这里插入图片描述

场景 3:本地打包后同步(避免小文件延迟)
tar czf - /data/ | rsync -avz --bwlimit=1000 - user@remote:/backups/data.tar.gz
注意事项
  • 确保远程服务器安装了 rsync
    如前所述,远程服务器需要安装 rsync,否则无法处理同步请求。可以通过 SSH 连接到远程服务器并执行以下命令来检查:
rsync --version

如果没有安装,可以通过相应的包管理器安装它。

  • 确保权限正确
    确保你有足够的权限来访问和写入远程服务器上的目标目录。如果目标目录没有写权限,rsync 将无法完成同步操作。

你可以使用 sudo 来以管理员身份执行命令,或者确保目标文件夹的权限设置正确。

  • 防火墙和端口
    确保远程服务器的防火墙允许通过 SSH 协议(默认端口 22)进行连接。如果防火墙阻止了端口 22 的访问,你需要在防火墙中允许该端口。

守护进程模式(Daemon Mode)

配置参数说明

Linux下可以用man rsyncd.conf进行查看

常用全局参数(影响整个rsync守护进程)
参数说明示例值
pid file指定存储进程ID的文件路径pid file = /var/run/rsyncd.pid
port指定守护进程监听端口(默认873port = 873
address绑定到特定IP地址address = 192.168.1.100
uid/gid设置运行rsync的用户/组(默认nobodyuid = root
gid = root
use chroot是否将客户端锁定到模块路径(安全建议启用)use chroot = yes
max connections最大并发连接数max connections = 10
timeout空闲超时时间(秒)timeout = 300
lock file锁文件路径(用于控制并发)lock file = /var/run/rsync.lock
log file日志文件路径log file = /var/log/rsyncd.log
syslog facility设置syslog日志级别(如daemon, local0等)syslog facility = local3
dont compress禁止压缩的文件类型(默认已压缩文件不重复压缩)dont compress = *.gz *.zip
hosts allow白名单允许访问的客户端IP/网段(逗号分隔)hosts allow = 192.168.1.0/24
hosts deny黑名单拒绝访问的客户端IP(优先级高于hosts allow)hosts deny = *(拒绝所有未明确允许的)
常用模块参数(定义每个备份目录的配置)

部分模块参数也可以写在全局参数中,如果在全局则对全局生效

参数说明示例值
[module_name]模块声明(必须用方括号括起[web_backup]
path模块对应的实际路径(必须参数path = /backups/web
comment模块描述信息comment = “Web Server Backup”
auth users允许访问的用户(逗号分隔,需配合secrets file)auth users = backup_user
secrets file用户名密码文件路径(格式:user:passsecrets file = /etc/rsyncd.secrets
read only是否只读(yes=客户端不能上传)read only = no
write only是否只写(yes=客户端不能下载)write only = no
list是否允许列出模块列表(yes=客户端可查看)list = yes
exclude排除的文件/目录(支持通配符)多个文件时,与空格作为分隔符exclude = *.tmp cache/
include包含的文件(优先级高于exclude)include = *.php *.html
transfer logging是否记录文件传输日志transfer logging = yes
log format自定义日志格式(%o=操作类型,%f=文件名)log format = “%o %f %l”
timeout模块级别的超时设置(覆盖全局timeout = 600
dont compress模块级别的压缩排除(覆盖全局dont compress = *.jpg
pre-xfer exec传输前执行的命令pre-xfer exec = /scripts/check_space.sh
post-xfer exec传输后执行的命令post-xfer exec = /scripts/send_email.sh
配置示例

配置目录文件/etc/rsyncd.conf,如果不存在,需要手动创建

touch /etc/rsyncd.conf
# 全局配置
pid file = /var/run/rsyncd.pid
port = 873
use chroot = yes
hosts allow = 192.168.1.0/24

# 模块1:数据库备份
[db_backup]
path = /backups/db
auth users = db_user
secrets file = /etc/rsyncd_db.secrets
read only = no
comment = "MySQL Database Backup"

# 模块2:Web文件备份
[web_backup]
path = /backups/web
exclude = *.tmp *.log
hosts allow = 192.168.1.20
transfer logging = yes
关键注意事项
  • 权限控制:
    确保secrets file权限为600
chmod 600 /etc/rsyncd.secrets
  • 路径安全:
    启用use chroot时,模块路径必须是绝对路径且无符号链接。
  • 调试命令:
rsync --daemon --config=/etc/rsyncd.conf --no-detach -v
  • 日志查看:
tail -f /var/log/rsyncd.log

实操示例

测试环境说明
服务器类型IP地址角色模块路径
Backup Server10.0.0.203rsync守护进程(服务端)/rsync/backup/db /rsync/backup/web
数据库服务器10.0.0.201客户端/data/mysql
Web服务器10.0.0.200客户端/var/www/html
服务器配置
创建rsync用户和用户组(避免直接使用root账号)
groupadd -r rsync
useradd -r -s /sbin/nologin -g rsync rsync

在这里插入图片描述

创建相关目录
mkdir -pv /rsync/backup/web
mkdir -pv /rsync/backup/db
# 修改所属组和属主
chown -R rsync:rsync /rsync/backup/web 
chown -R rsync:rsync /rsync/backup/db

注意:创建的文件夹,需要修改文件夹为rsync配置的属组和属主

在这里插入图片描述

配置rsyncd.conf文件
# 全局配置
uid = rsync
gid = rsync
pid file = /var/run/rsyncd.pid
lock file = /var/lock/rsyncd.lock
log file = /var/log/rsyncd.log
hosts allow = 10.0.0.0/24
port = 873
use chroot = yes
max connections = 100

# 模块1:数据库备份
[db_backup]
path = /rsync/backup/db
auth users = db_user
secrets file = /etc/rsyncd.passwd
read only = no
comment = "MySQL Database Backup"

# 模块2:Web文件备份
[web_backup]
path = /rsync/backup/web
auth users = web_user
exclude = *.tmp *.log
transfer logging = yes
secrets file = /etc/rsyncd.passwd
comment = "Web Server Backup"

创建虚拟用户

根据配置文件中的配置,在/rsync目录下,创建一个rsyncd.passwd文件(名字可以自定义),用来存储虚拟账号的账号:密码

touch /rsync/rsyncd.passwd
chmod 600 /rsync/rsyncd.passwd
#vim /rsync/rsyncd.passwd
db_user:123456
web_user:123456

注意:该文件的权限必须是600

启动rsync
rsync --daemon

默认是使用/etc/rsyncd.conf文件,如果需要自定文件,可以在启动时,使用--config=/path/to/confFile
例如:

rsync --daemon --config=/home/myrsyncd.conf
检查启动情况
ss -ntl | grep 873
# 或
netstat -an | grep 873

在这里插入图片描述

重启rsync

修改rsyncd.conf配置文件时,需要重启rsync。先杀进程,在启动

# kill进程
killall rsync 
# 确认是否已关闭
ss -tnl | grep 873
# 重新启动
rsync --daemon

在这里插入图片描述

配置客户端
推送格式(push)
rsync [options] /path/sourcefile [user@]host::moduleName

连接收,需要输密码

拉取格式(pull)
rsync [options]  [user@]host::moduleName /path/sourcefile

[user@]表示虚拟用户,moduleName表示模块名称

auth users 创建虚拟账号的密码文件,解决输入认证密码步骤
echo "123456" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

注意:密码文件需要600权限

rsync [options] /path/sourcefile [user@]host::moduleName --password-file=/etc/rsync.passwd
# 或
rsync [options]  [user@]host::moduleName /path/sourcefile --password-file=/etc/rsync.passwd

在这里插入图片描述

实操遇到的问题
授权文件没有设置600导致认证失败

执行chmod 600 /etc/rsyncd.passwd解决

在这里插入图片描述#####目录模块为只读模式,无法传输文件
配置文件增加read only = no解决
在这里插入图片描述

文件传输成功,但是提醒一下警告信息

在这里插入图片描述

  • 解决方案

    • 方案1:忽略组权限同步(推荐)
      在 rsync 命令中添加 --no-group 选项:
    rsync -avz --no-group /source/path user@remote:/target/path
    
    • 方案2:忽略所有者和组信息
      如果也不需保留所有者信息,可以加上 --no-owner
    rsync -avz --no-owner --no-group /source/path user@remote:/target/path
    
    • 方案3:使用超级用户权限(需谨慎
      如果确实需要保留组信息且你有 sudo 权限:
    sudo rsync -avz /source/path user@remote:/target/path
    
    • 方案4:修改目标目录权限
      在目标服务器上:
    sudo chown -R youruser:yourgroup /target/path
    
  • 预防措施

    • 预先创建组:确保目标服务器上存在源服务器上的所有用户组

    • 统一环境:保持开发、测试、生产环境的用户/组ID一致

    • 使用标准化部署:考虑使用容器化部署避免此类问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值