Rsync 用法指南 | 文件传输与同步技巧

Rsync 是一个用于同步文件的工具。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它支持断点续传、增量同步,广泛用于使用网络迁移大量文件;另外,在内置硬盘和外置硬盘之间数据迁移的场景下,它可以替代 cpmv 命令。

它会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。

官网: rsync
GitHub: RsyncProject/rsync: An open source utility that provides fast incremental file transfer. It also has useful features for backup and restore operations among many other use cases.

安装

发送和接收的两台服务器都需要安装 rsync

sudo apt install -y rsync

使用

本地同步

rsync [-a] source destination   # 目标目录destination如果不存在,rsync 会自动创建
rsync [-a] source1 source2 destination   # 多个文件或目录需要同步

如上同步后的目录结构是 destination/source,如果只想同步源目录source里面的内容到目标目录destination,则需要在源目录后面加上斜杠。

rsync -a source/ destination

常用参数说明:

  • r:对子目录以递归模式处理,本地单次复制可以用这个。

  • a:可以替代-r同步场景用。除了可以递归同步以外,还可以同步元信息,等价于 -rlptgoD 。

  • -n--dry-run,模拟执行,加上 -v 查看结果。

  • v:打印详情

  • –delete,默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。

  • u:只进行更新,防止本地新文件被重写,注意两者机器的时钟要同时

  • P:等同于 –partial –progress
    –partial:断点续传。保留那些因故没有完全传输的文件,以是加快随后的再次传输
    –progress:在传输过程中显示进度

  • z:在传输过程中进行压缩

  • h:以人类可读显示文件大小和速率

排除文件

  • –exclude,可多次使用,排除多个目标,或者用 --exclude={'file1.txt','dir1/*'}
    • 排除了所有 TXT 文件 --exclude='*.txt'
    • 排除某个目录里面的所有文件,但不希望排除目录本身 --exclude 'dir1/*'
    • 如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件
  • –include参数用来指定必须同步的文件模式,往往与–exclude结合使用。排除所有文件,但是会包括 TXT 文件 --include="*.txt" --exclude='*'

使用 SSH 进行远程登录和数据传输

将本地内容,同步到远程服务器:

rsync -av source/ vfly2@1.2.3.4:destination

将远程内容同步到本地:

rsync -av vfly2@1.2.3.4:source/ destination

如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。

rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination

例子

rsync 断点续传方式拷贝本地文件或远程文件,目录下会生成一个隐藏的临时文件,ls -a 可以看到,因此每次中断后,下次能续传拷贝。

SSH 传输

本地文件以断点续传的方式拷贝到远程服务器

rsync -avzhP a.tar.gz root@192.168.1.100:/opt/a.tar.gz

远程文件以断点续传的方式拷贝到本地,修改 ssh 端口

rsync -avzhP -e "ssh -p 40527" root@192.168.1.100:/opt/a.tar.gz ./a.tar.gz

本地拷贝

不显示进度,应该会更快一些,适合用在自动脚本中

rsync -a backup.tar.gz /tmp/backups/

本地 usb 文件以断点续传的方式拷贝到本地目录

rsync -avhP /home/vfly2/udisk/keepbit /home/vfly2/qbittorrent/keepbit

增量备份

增量备份,就是默认只复制有变动的文件。rsync 支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录,存量文件使用硬链接放到目标目录。

具体流程是:

  1. 第一次同步是全量备份,所有文件在基准目录里面同步一份。
  2. 以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录,包含所有文件
  3. 实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。

--link-dest参数用来指定同步时的基准目录。

rsync -a --delete --link-dest /compare/path /source/path /target/path
  • --link-dest参数指定基准目录/compare/path
  • 源目录/source/path跟基准目录进行比较,找出变动的文件
  • 将它们拷贝到目标目录/target/path。那些没变动的文件则会生成硬链接。

下面是一个脚本示例,备份用户的主目录。

#!/bin/bash

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"

mkdir -p "${BACKUP_DIR}"

rsync -av --delete --link-dest "${LATEST_LINK}" "${SOURCE_DIR}/"   "${BACKUP_PATH}" --exclude=".cache"

rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"

每一次同步都会生成一个新目录${BACKUP_DIR}/${DATETIME},并将软链接${BACKUP_DIR}/latest指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest指向新的备份目录。


使用“ --remove-source-files ”在传输完成后自动删除源文件

SSH 证书

通过 ssh 远程同步时需要输入密码,可以了解 ssh 证书登录无需输入密码

代理

SOCKS 代理

rsync -avzP -e 'ssh -p 22 -o "ProxyCommand=nc -x 127.0.0.1:10808 %h %p"'  vfly2@1.2.3.4:/mnt/share/ /home/vfly2/public/

http 代理

服务端和客户端都要安装,通过 rsync 协议传输。

通过设置环境变量 RSYNC_PROXY 来指定代理服务器的地址和端口。

export RSYNC_PROXY=127.0.0.1:10808
rsync -avzP source_directory/ destination_directory/

rsync 协议

需要另一台服务器安装并运行了 rsync 守护程序,这样可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::

rsync -avzP source/ 1.2.3.4::module/destination
# rsync -avzP source/ rsync://1.2.3.4/module/destination   # 也可用 rsync://

注意,上面地址中的module并不是实际路径名,而是守护程序指定的一个资源名。执行下面命令查询分配的所有 module 列表。

rsync rsync://1.2.3.4

配置文件一共涉及到以下 3 个

  • /etc/rsyncd.conf 配置主要文件
  • /etc/rsyncd.secrets 用户密码
  • /etc/rsyncd.motd 普通文本,登录时候客户端能看到一些欢迎信息。

配置项

帮助用

  • -n--dry-run模拟将要执行的操作,而并不真的执行。配合-v参数使用,可以看到哪些内容会被同步过去。

  • -h 与其他参数共同使用时,表示以人类可读的格式输出。

  • -h--help返回帮助信息。

  • -v表示输出细节。-vv表示输出更详细的信息,-vvv表示输出最详细的信息。

  • --version返回版本。

  • -i表示输出源目录与目标目录之间文件差异的详细情况。

  • 传输效果

  • -a--archive表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。

  • -r表示递归,即包含子目录。-

  • -P--progress--partial这两个参数的结合。

    • --progress表示显示进展。
    • --partial允许恢复中断的传输。不使用该参数时,会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。但是需要与--append--append-verify配合使用。
    • --partial-dir指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial
  • --append指定文件接着上次中断的地方,继续传输。

  • --append-verify--append类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。

  • --bwlimit指定带宽限制,默认单位是 KB/s,比如--bwlimit=100

  • --max-size设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k')。

  • --min-size设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k)。

  • -z指定同步时压缩数据。

  • 限制传输的文件和目录

  • --exclude指定排除不进行同步的文件,比如--exclude="*.iso"

  • --exclude-from指定一个本地文件,里面是需要排除的文件模式,每个模式一行。

  • --include指定同步时要包括的文件,一般与--exclude结合使用。

  • --existing--ignore-non-existing表示不同步目标目录中不存在的文件和目录。

  • --ignore-existing表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。

  • -u--update表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。

  • -m指定不同步空目录。

  • --size-only表示只同步大小有变化的文件,不考虑文件修改时间的差异。

  • -c--checksum改变校验方式。默认情况下,只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。

  • --link-dest指定增量备份的基准目录。

  • 涉及自动删除

  • --delete删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。

  • --remove-source-files表示传输成功后,删除发送方的文件。

  • -b--backup指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix指定的文件后缀名,默认是~

  • --backup-dir指定文件备份时存放的目录,比如--backup-dir=/path/to/backups

  • --suffix指定文件名备份时,对文件名添加的后缀,默认是~

  • 其他

  • -e指定使用 SSH 协议传输数据。


参考文章: rsync 用法教程 – 阮一峰的网络日志

原文链接: https://yanh.tech/2024/11/rsync-usage-guide/

版权声明:转载请注明来源 技焉洲 (yanh.tech)

保持更新 ٩(•̤̀ᵕ•̤́๑)ᵒᵏᵎᵎᵎᵎ 清晰恒益的实用技能,欢迎使用 RSS 订阅,如果能留言互动就更好了。

可在 Telegram 群组 https://t.me/vfly2 交流依文章步骤遇到的问题。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇