跳到正文

Rsync 入门:高效同步与镜像备份

9 分钟阅读 2283 字 分类:技术, Linux 0 查看原文 →

Rsync 是 Linux 运维里非常实用的文件同步工具。它既可以在本机目录之间同步,也可以通过 SSH 在不同服务器之间同步。和简单的 cpscp 相比,rsync 最大的优势是:只传输变化的部分,重复执行时速度更快,也更适合做备份和镜像。

这篇文章记录一套入门用法,重点放在实际工作中最容易用到、也最容易踩坑的部分。

Rsync 适合做什么

常见场景包括:

一句话概括:如果你需要反复同步一批文件,rsync 通常比手写 cpscp 更合适。

安装

大多数 Linux 发行版默认已经安装 rsync。可以先检查版本:

rsync --version

如果没有安装,可以按发行版安装:

# Debian / Ubuntu
sudo apt update
sudo apt install rsync

# CentOS / RHEL
sudo yum install rsync

# Fedora
sudo dnf install rsync

Windows 下如果使用 WSL,也可以直接在 WSL 里安装和使用 rsync。

基本语法

rsync 的基本格式如下:

rsync [选项] 源路径 目标路径

最常见的本地同步命令:

rsync -av source/ backup/

这里:

执行后,source/ 里的内容会同步到 backup/

尾部斜杠很重要

rsync 里最容易踩坑的是源路径末尾的 /

带尾部斜杠

rsync -av source/ backup/

表示同步 source 目录里面的内容到 backup/

同步结果类似:

backup/file.txt
backup/images/logo.png

不带尾部斜杠

rsync -av source backup/

表示把 source 目录本身同步到 backup/

同步结果类似:

backup/source/file.txt
backup/source/images/logo.png

简单记法:

如果要做镜像备份,大多数情况下用的是 source/

常用参数

日常使用可以先记住这一组:

rsync -avh --progress source/ backup/

参数说明:

远程同步时,经常会加上压缩:

rsync -avz source/ user@server:/data/backup/

参数说明:

如果是局域网内的大文件传输,-z 不一定更快,因为压缩也会消耗 CPU。是否使用可以按网络和机器性能决定。

先 dry-run 再执行

涉及删除、覆盖、线上目录时,建议先用 --dry-run 看看会发生什么:

rsync -avh --dry-run source/ backup/

--dry-run 只模拟执行,不会真的复制、删除文件。确认输出符合预期后,再去掉这个参数执行真实同步。

也可以写短参数:

rsync -avhn source/ backup/

其中 -n 就是 dry-run。

本地目录同步

比如把 /data/app/uploads/ 备份到 /backup/uploads/

rsync -avh /data/app/uploads/ /backup/uploads/

如果再次执行,rsync 会比较文件差异,只同步变化过的文件。

如果希望目标目录和源目录保持完全一致,可以加上 --delete

rsync -avh --delete /data/app/uploads/ /backup/uploads/

注意:--delete 会删除目标目录里源目录不存在的文件。这个参数很适合镜像,但也最危险,正式执行前建议先 dry-run:

rsync -avh --delete --dry-run /data/app/uploads/ /backup/uploads/

通过 SSH 同步远程服务器

rsync 默认可以通过 SSH 连接远程服务器。

把本地目录推送到服务器:

rsync -avz ./dist/ root@example.com:/var/www/html/

把服务器目录拉到本地:

rsync -avz root@example.com:/var/www/html/ ./html-backup/

指定 SSH 端口:

rsync -avz -e "ssh -p 2222" ./dist/ root@example.com:/var/www/html/

指定私钥:

rsync -avz -e "ssh -i ~/.ssh/deploy_key" ./dist/ root@example.com:/var/www/html/

如果远程服务器已经配置了 SSH 免密登录,rsync 就可以很方便地放进脚本或定时任务。

排除不需要同步的文件

同步项目目录时,经常需要排除依赖、缓存、日志和临时文件:

rsync -avh \
  --exclude "node_modules/" \
  --exclude ".git/" \
  --exclude "dist/" \
  --exclude "*.log" \
  ./project/ /backup/project/

排除规则也可以写到文件里:

node_modules/
.git/
dist/
*.log
.env

假设文件名为 rsync-exclude.txt,同步时这样使用:

rsync -avh --exclude-from=rsync-exclude.txt ./project/ /backup/project/

需要注意的是,排除路径一般是相对于源目录的路径。

镜像备份脚本

下面是一个简单的镜像备份脚本,把 /data/app/uploads/ 同步到备份服务器:

#!/usr/bin/env bash
set -euo pipefail

SOURCE="/data/app/uploads/"
TARGET="backup@example.com:/backup/app/uploads/"
LOG_DIR="/var/log/rsync-backup"
LOG_FILE="${LOG_DIR}/uploads-$(date +%F).log"

mkdir -p "${LOG_DIR}"

rsync -avhz --delete \
  --exclude "*.tmp" \
  --exclude "*.log" \
  "${SOURCE}" \
  "${TARGET}" \
  > "${LOG_FILE}" 2>&1

保存为 backup-uploads.sh 后加执行权限:

chmod +x backup-uploads.sh

手动执行:

./backup-uploads.sh

如果要定时执行,可以配合 crontab:

crontab -e

每天凌晨 2 点执行:

0 2 * * * /opt/scripts/backup-uploads.sh

这种方式得到的是镜像备份:目标目录会尽量保持和源目录一致。优点是恢复简单,缺点是如果源目录误删了文件,下一次同步也会把目标目录里的对应文件删掉。

所以重要数据不要只做单份镜像,最好再加快照或版本保留策略。

如果希望保留每天的备份版本,可以使用 --link-dest。它会把没有变化的文件用硬链接指向上一份快照,只有变化的文件才真正占用新空间。

示例目录:

/backup/app/
  2026-04-22/
  2026-04-23/
  2026-04-24/
  latest -> 2026-04-24

脚本示例:

#!/usr/bin/env bash
set -euo pipefail

SOURCE="/data/app/uploads/"
BACKUP_ROOT="/backup/app"
TODAY="$(date +%F)"
TARGET="${BACKUP_ROOT}/${TODAY}"
LATEST="${BACKUP_ROOT}/latest"

mkdir -p "${TARGET}"

if [ -L "${LATEST}" ] || [ -d "${LATEST}" ]; then
  rsync -avh --delete --link-dest="${LATEST}" "${SOURCE}" "${TARGET}/"
else
  rsync -avh --delete "${SOURCE}" "${TARGET}/"
fi

ln -sfn "${TARGET}" "${LATEST}"

这样每天都会生成一个看起来完整的备份目录,但重复文件不会重复占用空间。

使用 --link-dest 时要注意:

从备份恢复

恢复其实也是一次反向 rsync。

从本地备份恢复:

rsync -avh /backup/uploads/ /data/app/uploads/

从远程备份服务器恢复:

rsync -avz backup@example.com:/backup/app/uploads/ /data/app/uploads/

如果恢复目标是线上目录,仍然建议先 dry-run:

rsync -avhn backup@example.com:/backup/app/uploads/ /data/app/uploads/

确认无误后再真实执行。

常见问题

权限不一致

如果需要保留属主和属组,需要用归档模式,并且可能需要 root 权限:

sudo rsync -av /data/app/ /backup/app/

远程服务器如果需要 sudo,可以先同步到用户目录,再在远程服务器上移动,或者配置受控的 sudo 权限。

软链接怎么处理

-a 会保留软链接本身。如果你希望同步软链接指向的真实文件,可以使用 -L

rsync -avL source/ backup/

-L 可能导致同步范围变大,使用前要确认软链接指向哪里。

文件很多时很慢

rsync 在文件数量特别多时,扫描和比较也会耗时。可以考虑:

目标目录空间不足

可以先用 --dry-run --stats 看同步规模:

rsync -avhn --stats source/ backup/

也可以在同步前检查磁盘空间:

df -h

使用前检查清单

正式执行 rsync 前,尤其是带 --delete 时,可以按这个顺序检查:

  1. 源路径是否正确
  2. 目标路径是否正确
  3. 源路径尾部斜杠是否符合预期
  4. 是否需要排除 .git、日志、缓存、临时文件
  5. 是否先执行过 --dry-run
  6. 是否确认 --delete 不会误删目标目录里的重要文件
  7. 是否有恢复演练或至少确认备份可读

总结

入门 rsync 可以先掌握这几个命令:

# 本地同步
rsync -avh source/ backup/

# 镜像同步,目标会删除源不存在的文件
rsync -avh --delete source/ backup/

# 先模拟执行
rsync -avhn --delete source/ backup/

# 推送到远程服务器
rsync -avz source/ user@server:/backup/source/

# 从远程服务器拉取
rsync -avz user@server:/backup/source/ ./source-backup/

真正要记住的是两点:

把这两点做到,rsync 就是一个非常稳定、高效、值得长期使用的同步和备份工具。

相关文章

wsl docker 安装位置迁移 - windows

WSL、Docker 迁移 Windows WSL Docker 默认安装路径在C盘的,导致岌岌可危的C盘空间😱更加吃紧,一不小心就要出现👇这种情况了 接下来我们一起迁移它们吧 迁移 WSL WSL2 默认安装在 C 盘,我们可以通过以下步骤迁移安装位置 通过以下命令列出已安装的 Linux 发行版: wsl -l -v 可以看到已安装了 Ubuntu,其运行状态为:Stopped 导出分发版...

Linux ufw防火墙管理

安装 ufw Debian 默认情况下没有安装 ufw(Uncomplicated Firewall)。如果您想使用 ufw 来管理防火墙规则,需要先安装它。安装 ufw 命令如下: sudo apt-get update sudo apt-get install ufw 安装完成后,您可以使用以下命令来查看开放的端口状态: sudo ufw status verbose 该命令将列出所有防火墙规...

你好,Cargo

你好,Cargo Cargo 是 Rust 的构建系统和包管理器。大多数 Rustaceans 使用这个工具来管理他们的 Rust 项目,因为 Cargo 会为您处理很多任务,例如构建代码、下载代码所依赖的库以及构建这些库。(我们将您的代码需要的库称为 “依赖项”。) 最简单的 Rust 程序,就像我们迄今为止编写的程序一样,没有任何依赖项。如果我们建造了“你好,世界!” 使用 Cargo 进行项...

bigroc 头像
bigroc

热爱技术的开发者,持续分享 Java、JavaScript、Go、Docker、AI 等领域的编程经验和技术思考。

评论

滚动到评论区域时再加载第三方评论脚本。