linux中级_Rsync 数据备份

TJCcc 发布于 2025-11-23 29 次阅读


一、 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/

四、守护进程模式

配置服务端

  1. 安装rsync守护进程
# Ubuntu/Debian
sudo apt-get install rsync

# CentOS/RHEL
sudo yum install rsync
  1. 创建配置文件 /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
  1. 创建密码文件 /etc/rsyncd.secrets
backupuser:password123

设置权限:

#这个重要
chmod 600 /etc/rsyncd.secrets
  1. 启动守护进程(注意看下面的注释内容)

# 手动启动(临时启动)
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:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... SRC [USER@]HOST::MODULE/DEST
rsync [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

十、安全注意事项

  1. 最小权限原则:使用专用用户运行rsync
  2. 网络加密:优先使用SSH隧道
  3. 访问控制:合理配置防火墙和hosts allow
  4. 密码安全:妥善保管密码文件,设置适当权限
  5. 日志监控:定期检查备份日志