rsync命令

rsync 命令 #

rsync是一个快速、多功能的文件复制和同步工具。它可以在本地系统内复制文件,也可以通过网络在不同系统之间同步文件。rsync的特点是增量传输,只传输发生变化的部分,从而大大提高了文件同步的效率。

语法 #

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

常用选项 #

选项 描述
-a, --archive 归档模式,等同于-rlptgoD,保留几乎所有文件属性
-v, --verbose 详细模式,显示传输过程
-z, --compress 在传输过程中压缩数据
-h, --human-readable 以人类可读的格式输出数字
-r, --recursive 递归复制目录
-l, --links 复制符号链接为符号链接
-p, --perms 保留文件权限
-t, --times 保留文件修改时间
-g, --group 保留文件所属组
-o, --owner 保留文件所有者(通常需要root权限)
-D 保留设备文件和特殊文件
--delete 删除目标目录中源目录不存在的文件
--exclude=PATTERN 排除匹配模式的文件
--include=PATTERN 包含匹配模式的文件
-n, --dry-run 模拟运行,不实际传输文件
-P 等同于--partial --progress,显示进度并支持断点续传
--partial 保留部分传输的文件,支持断点续传
--progress 显示传输进度
-e, --rsh=COMMAND 指定远程shell命令,如ssh
--bwlimit=RATE 限制传输带宽,单位为KB/s
--backup 为目标位置的已存在文件创建备份
--backup-dir=DIR 指定备份文件的目录
--suffix=SUFFIX 指定备份文件的后缀
--checksum 使用校验和而不是修改时间和大小来决定文件是否需要更新
--ignore-existing 忽略目标位置已存在的文件
--update 跳过目标位置中修改时间更新的文件

常见用法 #

1. 本地文件复制 #

rsync -av source_directory/ destination_directory/

注意:源路径末尾的斜杠/表示复制目录的内容,而不是目录本身。

2. 远程文件复制(通过SSH) #

从本地复制到远程:

rsync -avz source_directory/ username@remote_host:/path/to/destination/

从远程复制到本地:

rsync -avz username@remote_host:/path/to/source/ destination_directory/

3. 使用不同的SSH端口 #

rsync -avz -e "ssh -p 2222" source_directory/ username@remote_host:/path/to/destination/

4. 同步目录(删除目标中源不存在的文件) #

rsync -avz --delete source_directory/ destination_directory/

5. 排除特定文件或目录 #

rsync -avz --exclude="*.tmp" --exclude=".git/" source_directory/ destination_directory/

6. 包含特定文件或目录 #

rsync -avz --include="*.txt" --exclude="*" source_directory/ destination_directory/

7. 显示传输进度 #

rsync -avz --progress source_directory/ destination_directory/

8. 限制带宽使用 #

rsync -avz --bwlimit=1000 source_directory/ destination_directory/

这将限制带宽使用为1000 KB/s。

9. 模拟运行(不实际传输) #

rsync -avzn source_directory/ destination_directory/

10. 创建备份 #

rsync -avz --backup --backup-dir=/path/to/backups/$(date +%Y%m%d) source_directory/ destination_directory/

实用示例 #

1. 创建系统备份 #

sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /path/to/backup/

2. 增量备份 #

rsync -avb --backup-dir=/path/to/backups/$(date +%Y%m%d) source_directory/ destination_directory/

3. 镜像网站 #

rsync -avz --delete --exclude="*.tmp" username@remote_host:/var/www/html/ /local/backup/website/

4. 同步大文件,支持断点续传 #

rsync -avP large_file username@remote_host:/path/to/destination/

5. 使用校验和验证文件 #

rsync -avzc source_directory/ destination_directory/

6. 只传输新文件或更新的文件 #

rsync -avzu source_directory/ destination_directory/

7. 保持硬链接 #

rsync -avH source_directory/ destination_directory/

8. 列出源目录中的文件而不传输 #

rsync -avzn --list-only source_directory/ destination_directory/

9. 通过中间主机传输文件 #

rsync -avz -e "ssh -A user1@jumphost ssh" source_directory/ user2@destination:/path/to/destination/

10. 创建远程备份脚本 #

#!/bin/bash
DATE=$(date +%Y%m%d)
rsync -avz --delete --backup --backup-dir=/backup/incremental/$DATE /path/to/source/ username@remote_host:/path/to/destination/

高级用法 #

1. 使用过滤规则 #

创建一个过滤规则文件filter-rules.txt

+ /important_directory/
+ /important_directory/important_file.txt
- /important_directory/*.tmp
- *.bak
- .git/
- .svn/

然后使用该规则文件:

rsync -avz --filter="merge filter-rules.txt" source_directory/ destination_directory/

2. 使用rsync守护进程 #

在服务器上配置/etc/rsyncd.conf

[backup]
path = /path/to/backup
comment = Backup Directory
read only = false
auth users = backupuser
secrets file = /etc/rsyncd.secrets

创建密码文件/etc/rsyncd.secrets

backupuser:password

设置权限:

chmod 600 /etc/rsyncd.secrets

启动rsync守护进程:

rsync --daemon

从客户端连接:

rsync -avz source_directory/ rsync://backupuser@server_ip/backup/

或使用密码文件:

echo "password" > ~/.rsync-password
chmod 600 ~/.rsync-password
rsync -avz --password-file=~/.rsync-password source_directory/ rsync://backupuser@server_ip/backup/

性能优化 #

  1. 使用-z压缩:在低带宽网络上传输文本文件时很有用,但对于已压缩的文件(如jpg、mp3、zip)可能会增加CPU负载而不减少传输量。

  2. 使用--inplace:直接修改目标文件而不是创建临时文件,适用于大文件的小改动,但可能导致部分更新的文件。

  3. 调整块大小:使用--block-size=SIZE可以调整rsync的块大小,默认为512字节。对于大文件,增加块大小可能提高性能。

  4. 使用-W, --whole-file:在高带宽网络上,禁用增量传输算法可能更快。

  5. 限制并发:使用--max-size=SIZE--min-size=SIZE可以限制处理的文件大小范围。

常见问题排查 #

1. 权限被拒绝 #

rsync: send_files failed to open "file.txt": Permission denied (13)

可能的原因:

  • 源文件没有读取权限
  • 目标目录没有写入权限

解决方法:

  • 检查文件和目录权限
  • 使用sudo运行rsync(如果需要)

2. SSH认证失败 #

Permission denied, please try again.

可能的原因:

  • SSH密码错误
  • SSH密钥未设置或未被接受

解决方法:

  • 检查SSH认证设置
  • 使用-v选项获取详细错误信息

3. 同步不完整 #

可能的原因:

  • 排除规则错误
  • 源路径末尾的斜杠问题

解决方法:

  • 检查排除规则
  • 注意源路径末尾的斜杠(有斜杠表示复制目录内容,无斜杠表示复制目录本身)

与其他工具的比较 #

工具 优点 缺点 适用场景
rsync 增量传输、高效、功能丰富 配置较复杂 大文件同步、备份、镜像
scp 简单、安全 不支持增量传输 简单的文件传输
cp 最简单、本地使用 不支持网络、不支持增量 本地文件复制
tar+ssh 保留所有属性、单个文件传输 不支持增量、效率较低 完整系统备份

提示 #

  • 总是使用-n(干运行)选项先测试复杂的rsync命令
  • 源路径末尾的斜杠/很重要,它决定是复制目录本身还是目录的内容
  • 使用--backup--backup-dir可以保留被覆盖或删除的文件
  • 对于大量小文件,禁用--checksum并依赖文件大小和修改时间来判断变化
  • 在脚本中使用rsync时,考虑添加错误处理和日志记录
  • 使用--exclude-from=FILE可以从文件中读取排除模式,便于管理复杂的排除规则
  • 定期检查备份的完整性和可恢复性
  • 对于关键备份,考虑使用--checksum选项确保文件内容一致性