Rsync 是一个用于同步文件的工具。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件。它支持断点续传、增量同步,广泛用于使用网络迁移大量文件;另外,在内置硬盘和外置硬盘之间数据迁移的场景下,它可以替代 cp
和 mv
命令。
它会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
官网: 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
参数指定这个文件
- 排除了所有 TXT 文件
- –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 支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录,存量文件使用硬链接放到目标目录。
具体流程是:
- 第一次同步是全量备份,所有文件在基准目录里面同步一份。
- 以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录,包含所有文件
- 实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
--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 交流依文章步骤遇到的问题。