作者:134333.xyz
环境:debian11 + win10 ltsc 2019
安装
linux
- linux, debian11
# linux, debian11下载
apt-get install rsync
# 将 rsync 设置成开启自启,并启动
systemctl enable rsync
systemctl start rsync
- 然后配置
nano /etc/rsyncd.conf
# /etc/rsyncd.conf
# 进行通信的端口,如果 firewall 打开的话,需要将对应的端口添加进去
port=8730
# 日志文件
log file=/var/log/rsync.log
# rsync 的进程 id
pid file=/var/run/rsync.pid
# 要同步的模块,这里一般以项目名命名
[backup]
# 同步的目标文件夹
path=/tmp/rsync
# rsync daemon 在传输前是否切换到指定的 path 目录下,并将其监禁在内,用于增加传输的安全性
use chroot=no
# 指定最大的连接数
max connections=6
# yes 表示只读本地文件无法同步到服务器
read only=no
# 客户端请求显示模块列表时,该模块是否显示出来
list=true
# 服务运行时的用户
uid=root
# 服务运行时的用户组
gid=root
# 进行验证时的用户名,必须是系统存在的用户
auth users = root
# 连接用户时的密码
secrets file=/etc/rsyncd.passwd
# 允许的 ip
hosts allow=*
- 创建密码
# 创建文件夹
nano /etc/rsyncd.passwd
# 写入密码
echo "root:123456" > /etc/rsyncd.passwd
#更改文件权限
chmod 600 /etc/rsyncd.passwd
# 启动 rsync
systemctl restart rsync
win
win10
- https://www.itefix.net/cwrsync
- 点击“Free Rsync Client(active tab)”
- 再点“download”
可以添加环境变量,方便使用
- win 无需配置,直接用参数就可以了
https://itefix.net/dl/free-software/cwrsync_6.2.8_x64_free.zip
参数
-n
: 模拟同步,并不会直接同步,而是模拟传输,就可以知道有哪些内容会被同步-P
参数是--progress
和--partial
这两个参数的结合。--partial
: 允许恢复中断的传输。不使用该参数时,rsync
会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append
或--append-verify
配合使用。--partial-dir
: 指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial
。一般需要与--append
或--append-verify
配合使用。--progress
: 显示进展。
--exclude
: 排除-z
: 同步时压缩数据-v
: 输出详情传输规则
-t
- 同步 修改时间, 会比对 时间戳和文件大小.(但是不会对比内容!)
-i
- 对所有文件进行比对, 缺点是速度慢
-r
- 同步文件夹
-p
: 保持权限组相同-a
: 递归同步,还可以同步元信息(比如修改时间、权限等), 是上面的一个归纳
删除文件
- 需要注意, 正常来说 rsync 是不会删除目的端的文件
--delete
: 镜像传输–-delete-excluded
:删除目标路径中所有上传目录不存在的文件/目录。会使得--exclude
失效--delete-after
: 先进行数据同步,再删除那些需要清理的文件
排除文件
--exclud
:排除指定文件或目录--include
:同步指定文件或目录排除所有
*.log
和temp
文件或目录,但是会同步important_file.txt
文件
rclone -av --exclude *.log --exclude /tmp/ --include important_file.txt
# 排除该目录下的所有文件
rsync -av --exclude 'dir1/*' source/ destination
rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
# 从文件中读取要排除的文件和目录的列表
rsync -av --exclude-from='exclude-file.txt' source/ destination
增量备份
有三个目录分别是:源目录和目标目录和基准目录
硬链接的特性:指向相同文件,被删除其中一份并不会导致文件删除,想要删除文件必须删除所有硬链接。多份相同的硬链接只会占用一份硬盘空间。
流程
- 第一次先全量备份从源目录到基准目录的文件
- 之后是增量备份,将源目录和基准目录中有变动的部分保存在目标目录(这部分变更的文件是直接复制过去,占用硬盘空间)
- 而基准目录中与目标目录中的相同文件是硬链接,只会占用一份硬盘空间,意思是一个基准目录的文件可以对应多个不同的目标目录下的相同文件。硬链接
--link-dest
:指定基准目录
# 请先将源目录复制到基准目录
rsync -a --delete 源目录 基准目录
rsync -a --delete --link-dest 基准目录 源目录 目标目录
rsync -a --delete --link-dest /compare/path /source/path /target/path
- 具体例子
- 第一步先创建目录,然后在数据目录中创建一个 10M 大小的文件
mkdir /home
# 数据目录
mkdir /home/data
# 基准目录
mkdir /home/compare
# 目标目录
mkdir /home/target
# 先在数据目录创建
dd if=/dev/zero of=/home/data/10M.bin bs=10M count=1
注意,我这里给
/home/data/
后面加多个斜杠,是因为我想要将data
目录下的文件同步出去,而不是同步上data
目录
- 第二步设置基准目录
- 注意,这一步不可缺少,因为后续的增量备份是基于基准目录而进行的
- 源目录和基准目录匹对,将缺少的内容移动到目标目录
rsync -av --delete /home/data/ /home/compare
- 第三步给目标目录再添加一个 20M 文件
- 现在目标目录比基准目录多了个文件
dd if=/dev/zero of=/home/data/20M.bin bs=20M count=1
- 最后就可以设置同步了
rsync -av --delete --link-dest /home/compare /home/data/ /home/target
#sending incremental file list
#./
#20M.bin
#
#sent 20,976,779 bytes received 38 bytes 41,953,634.00 bytes/sec
#total size is 31,457,280 speedup is 1.50
- 接下来我们验证下
- 第二列代表有多少个硬链接,为 1 代表是文件,如果大于 1 则存在多个硬链接。(注意,文件夹不存在硬链接)
- 我们看到
10M文件
是硬链接,而20M文件
是本体,同步成功
$ /home/target# ls -l /home/target
total 30720
-rw-r--r-- 2 root root 10485760 Apr 25 20:29 10M.bin
-rw-r--r-- 1 root root 20971520 Apr 25 20:31 20M.bin
推荐用法
转自:https://www.ruanyifeng.com/blog/2020/08/rsync.html
这种方式适合用于 linux 服务器备份
每一次同步都会生成一个新目录${BACKUP_DIR}/${DATETIME}
,并将软链接${BACKUP_DIR}/latest
指向这个目录。下一次备份时,就将${BACKUP_DIR}/latest
作为基准目录,生成新的备份目录。最后,再将软链接${BACKUP_DIR}/latest
指向新的备份目录。
#!/bin/bash
# A script to perform incremental backups using rsync
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 \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
"${BACKUP_PATH}"
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"
同步
- 绝对路径则需要加上
/cygdrive/
,后面的D
是指 D 盘 /cygdrive/D/test
:D 盘的 test 文件夹rsyncd.passwd.txt
:里面直接写12346
即服务器中 rsync 设置的密码即可
# 格式
rsync.exe 参数 原目录 目的目录
# SRC>源目录
# DEST>目的目录
# 本地模式
rsync [OPTION...] SRC DEST
# 远程 Push
rsync [OPTION...] SRC [USER@]HOST:DEST
# 远程 Pull
rsync [OPTION...] [USER@]HOST:SRC DEST
# 通过 Rsync daemon Pull
rsync [OPTION...] [USER@]HOST::SRC DEST
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
# 通过 Rsync daemon Push
rsync [OPTION...] SRC [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
# 将服务器的文件同步到本地目录
rsync.exe -avPz --port 8730 --password-file=/cygdrive/D/rsyncd.passwd.txt root@170.178.221.79::backup/ /cygdrive/D/test
- 拷贝本地目录
rsync -avzh /home/src /backups/files/