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/
性能优化 #
-
使用
-z
压缩:在低带宽网络上传输文本文件时很有用,但对于已压缩的文件(如jpg、mp3、zip)可能会增加CPU负载而不减少传输量。 -
使用
--inplace
:直接修改目标文件而不是创建临时文件,适用于大文件的小改动,但可能导致部分更新的文件。 -
调整块大小:使用
--block-size=SIZE
可以调整rsync的块大小,默认为512字节。对于大文件,增加块大小可能提高性能。 -
使用
-W, --whole-file
:在高带宽网络上,禁用增量传输算法可能更快。 -
限制并发:使用
--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
选项确保文件内容一致性