一、 Rsync 简介
Rsync (Remote Sync) 是一个用于文件同步和传输的强大工具,具有以下特点:
- 增量传输,只传输变化的部分
- 支持压缩传输
- 保留文件属性(权限、时间戳等)
- 支持多种传输方式
增量拷贝与全量拷贝:
- 全量拷贝:把 所有文件 都重新复制一遍,不管它们有没有变化。
- 每次都复制全部数据
- 占用时间长、空间大
- 操作简单、不容易出错
- 常用于初次备份或系统完整备份
- 增量拷贝:只复制 发生变化的文件(新增、修改),不变化的文件不复制,不占用额外空间。
- 速度快,效率高
- 节省磁盘空间
- 常用于日常备份或同步
- 依赖于上一次的备份状态
| 特性 | 全量拷贝 | 增量拷贝 |
|---|---|---|
| 是否拷贝全部文件 | ✔ 是 | ✘ 否,只拷贝修改过的 |
| 耗时 | 长 | 短 |
| 空间占用 | 大 | 小 |
| 恢复难度 | 简单 | 略复杂(要依赖历史增量) |
| 使用场景 | 初次备份、月度大备份 | 日常同步、频繁备份 |
二、 本地模式拷贝
基本语法
rsync [选项] 源路径 目标路径
常用示例
# 基本同步(不会删除目标文件)
rsync -avz /source/directory/ /destination/directory/
# 同步并删除目标端多余文件
rsync -avz --delete /source/ /destination/
# 显示详细进度
rsync -avz --progress /source/ /destination/
# 排除特定文件或目录
rsync -avz --exclude='*.tmp' --exclude='cache/' /source/ /destination/
重要选项说明
-a, --archive: 归档模式,等同于-rlptgoD-v, --verbose: 详细输出-z, --compress: 压缩传输-h, --human-readable: 人类可读的格式
三、远程模式拷贝
基本语法
# PUSH:推送到远程服务器
rsync [选项] 源路径 用户名@远程主机:目标路径
# PULL:从远程服务器拉取
rsync [选项] 用户名@远程主机:源路径 目标路径
常用示例
# 推送到远程服务器
rsync -avz /local/path/ user@remotehost:/remote/path/
# 从远程服务器拉取
rsync -avz user@remotehost:/remote/path/ /local/path/
# 使用特定SSH端口
rsync -avz -e "ssh -p 2222" /local/path/ user@remotehost:/remote/path/
# 指定SSH密钥
rsync -avz -e "ssh -i /path/to/private_key" /local/path/ user@remotehost:/remote/path/
四、守护进程模式
配置服务端
- 安装rsync守护进程
# Ubuntu/Debian
sudo apt-get install rsync
# CentOS/RHEL
sudo yum install rsync
- 创建配置文件
/etc/rsyncd.conf
# 全局配置
uid = rsync #这个用户如果不是nobody的话得自己创建出来,因为是系统用户,用来运行进程的。
gid = rsync
fake super = yes
use chroot = no
max connections = 200
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
# 模块定义
[backup]
comment = Backup Area
path = /data/backup #得把这个文件夹的属主属组设置成nobody,才能让nobody进行读写
hosts allow = 172.16.1.0/24
read only = false
auth users = backupuser #虚拟用户,用来验证的
secrets file = /etc/rsyncd.secrets
[webdata]
path = /var/www/html
comment = Web Data
read only = true
2.1 若uid和gid不是nobody,则需要自己创建一个系统用户。比如,如果是想要用名为rsync的用户,则执行一下命令:
useradd -M -s /sbin/nologin rsync
2.2 模块当中的path路径,得把path路径的文件夹的属主属组设置成uid用户,才能让uid用户进行读写。执行以下命令:
chown -R rsync.rsync /data/backup
- 创建密码文件
/etc/rsyncd.secrets
backupuser:password123
设置权限:
#这个重要
chmod 600 /etc/rsyncd.secrets
- 启动守护进程(注意看下面的注释内容)
# 手动启动(临时启动)
rsync --daemon
#上下二选一,上面临时,下面永久,别同时键入命令。
# 系统服务方式(永久启动)
systemctl start rsyncd
systemctl enable rsyncd
客户端连接
# 推送到rsync守护进程
rsync -avz /local/path/ backupuser@remotehost::backup/
# 从rsync守护进程拉取
rsync -avz backupuser@remotehost::backup/ /local/path/
# 指定模块和密码文件
rsync -avz --password-file=/path/to/passwordfile /local/path/ backupuser@remotehost::backup/
远程模式和守护进程模式详细对比
| 特性/方面 | 远程 Shell 模式 | 守护进程模式 |
|---|---|---|
| 连接与协议 | 通过 SSH 通道 进行数据传输。 | 使用 rsync 自己的协议,直接在 TCP 873 端口 通信。 |
| 认证方式 | 使用 SSH 用户认证(如密码、密钥对)。 你需要一个能登录到远程机器的系统用户。 | 使用 rsync 独立的认证。 可以配置独立的用户/密码文件,不需要系统账号。 |
| 语法格式 | rsync [OPTION]... SRC [USER@]HOST:DESTrsync [OPTION]... [USER@]HOST:SRC DEST | rsync [OPTION]... SRC [USER@]HOST::MODULE/DESTrsync [OPTION]... [USER@]HOST::MODULE/SRC DEST(注意是双冒号 ::) |
| 服务端配置 | 无需额外配置,只要目标服务器开启了 SSH 服务即可。 | 需要在服务端配置 /etc/rsyncd.conf 文件,定义模块、路径、权限等,并启动 rsyncd 守护进程。 |
| 权限管理 | 权限与你使用的 SSH 用户本身的系统权限一致。 | 非常灵活。可以精确控制每个模块的: • 只读/读写权限 • 允许/拒绝的 IP 地址 • 虚拟用户映射到哪个系统用户 |
| 安全性 | 高。得益于 SSH 协议本身的安全性(加密、隧道)。 | 需要自行配置。传输默认不加密,但可以通过 ssh 隧道选项(-e ssh)来增强安全。原生认证相对简单。 |
| 性能 | 在高速局域网内,可能略低于守护进程模式,因为 SSH 有加密开销。 | 在高速局域网内,性能稍好,因为没有加密开销。 |
| 使用场景 | • 临时、一次性的文件同步。 • 备份少量重要数据到远程服务器。 • 在两个你都有 SSH 访问权限的机器间同步数据。 | • 构建专业的备份服务器。 • 提供公共的软件镜像下载(如 mirrors.xxx.com)。 • 需要精细控制权限的场合(如不同客户端同步到不同目录)。 • 需要无系统登录权限的备份。 |
五、密码免交互
方法1:使用SSH密钥认证
# 生成SSH密钥对
ssh-keygen -t rsa
# 复制公钥到远程服务器
ssh-copy-id user@remotehost
# 现在可以无密码使用rsync
rsync -avz /local/path/ user@remotehost:/remote/path/
方法2:使用密码文件(守护进程模式)
# 创建密码文件
echo "password123" > /home/user/rsync_password
# 修改文件权限为600
chmod 600 /home/user/rsync_password
# 使用密码文件
rsync -avz --password-file=/home/user/rsync_password /local/path/ backupuser@remotehost::backup/
方法3:使用环境变量
# 设置环境变量
export RSYNC_PASSWORD="password123"
# 执行rsync
rsync -avz /local/path/ backupuser@remotehost::backup/
六、无差异同步
完全镜像同步
# 完全同步,使目标与源完全一致
rsync -av --delete /source/ /destination/
# 远程完全同步
rsync -av --delete /local/path/ user@remotehost:/remote/path/
# 额外安全选项(先模拟运行)
rsync -av --delete --dry-run /source/ /destination/
强制同步(忽略时间戳)
# 基于文件大小同步,忽略时间戳
rsync -av --size-only /source/ /destination/
# 基于校验和同步(更准确但更慢)
rsync -av --checksum /source/ /destination/
安全删除选项
# 将删除的文件移动到回收站而不是直接删除
rsync -av --delete --backup --backup-dir=/path/to/backup /source/ /destination/
七、限速传输
限制带宽使用
# 限制为 1000 KB/s
rsync -avz --bwlimit=1000 /source/ user@remotehost:/destination/
# 限制为 500 KB/s
rsync -avz --bwlimit=500 /source/ user@remotehost:/destination/
# 工作时间限速,其他时间全速
rsync -avz --bwlimit=1000 --progress /source/ user@remotehost:/destination/
分时段限速脚本示例
#!/bin/bash
# 智能限速备份脚本
HOUR=$(date +%H)
SOURCE="/data/important/"
DEST="user@backupserver:/backups/"
if [ $HOUR -ge 8 ] && [ $HOUR -lt 18 ]; then
# 工作时间:限速500KB/s
BW_LIMIT=500
else
# 非工作时间:限速2000KB/s
BW_LIMIT=2000
fi
echo "当前时间: $(date), 限速: ${BW_LIMIT}KB/s"
rsync -avz --bwlimit=$BW_LIMIT --delete --progress $SOURCE $DEST
八、实用脚本示例
自动化备份脚本
#!/bin/bash
# 自动化rsync备份脚本
# 配置变量
SOURCE_DIR="/home/user/data/"
BACKUP_DIR="/backup/daily/"
REMOTE_HOST="user@backupserver"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 开始备份
echo "[$DATE] 开始备份..." >> $LOG_FILE
# 执行rsync备份
rsync -avz \
--delete \
--bwlimit=1000 \
--exclude='*.tmp' \
--exclude='cache/' \
--log-file=$LOG_FILE \
$SOURCE_DIR $REMOTE_HOST:$BACKUP_DIR
# 检查执行结果
if [ $? -eq 0 ]; then
echo "[$DATE] 备份成功完成" >> $LOG_FILE
else
echo "[$DATE] 备份失败" >> $LOG_FILE
exit 1
fi
增量备份脚本
#!/bin/bash
# 增量备份脚本
BASE_DIR="/data/files"
BACKUP_BASE="/backup/incremental"
REMOTE_HOST="backupuser@backupserver"
# 创建基于日期的备份目录
BACKUP_DIR="$BACKUP_BASE/backup_$(date +%Y%m%d)"
# 执行增量备份
rsync -av \
--delete \
--link-dest="../backup_$(date -d '1 day ago' +%Y%m%d)" \
$BASE_DIR/ $REMOTE_HOST:$BACKUP_DIR/
九、故障排除和监控
常用调试选项
# 详细输出
rsync -avv /source/ /destination/
# 模拟运行(不实际执行)
rsync -av --dry-run /source/ /destination/
# 输出统计信息
rsync -av --stats /source/ /destination/
检查rsync进程
# 查看rsync进程
ps aux | grep rsync
# 查看网络连接
netstat -tulpn | grep rsync
十、安全注意事项
- 最小权限原则:使用专用用户运行rsync
- 网络加密:优先使用SSH隧道
- 访问控制:合理配置防火墙和hosts allow
- 密码安全:妥善保管密码文件,设置适当权限
- 日志监控:定期检查备份日志
Comments NOTHING