rsync
是 Linux 系统中一个功能强大的文件和目录同步工具,广泛用于备份、镜像和数据传输。它支持本地同步以及通过网络(如SSH)进行远程同步,具有高效、灵活和可靠的特点。rsync
通过增量传输(仅传输变化的部分)来优化数据传输速度和减少带宽使用。
本文将详细介绍 rsync
命令的使用方法,包括常用参数、常见使用场景及示例,帮助您充分利用这一强大的工具。
目录
1. rsync 简介
rsync
(Remote Sync)是一个快速且多功能的文件复制工具,最初由 Andrew Tridgell 和 Paul Mackerras 开发。它能够高效地在本地和远程系统之间同步文件和目录,支持多种传输协议和加密方式。rsync
的主要优势包括:
- 增量传输:仅传输源文件与目标文件之间的差异,节省带宽和时间。
- 灵活的过滤规则:支持包含、排除特定文件或目录。
- 保留文件属性:可以保留权限、时间戳、所有权等文件属性。
- 支持多种协议:如SSH、RSH,也可以在本地使用。
2. 安装 rsync
大多数 Linux 发行版默认已安装 rsync
。如果未安装,可以通过包管理器进行安装。
Debian/Ubuntu:
sudo apt-get update sudo apt-get install rsync
CentOS/RHEL:
sudo yum install rsync
Fedora:
sudo dnf install rsync
Arch Linux:
sudo pacman -S rsync
3. 基本语法
rsync
的基本语法如下:
rsync [选项] 源 目标
- 源(Source):要同步的文件或目录路径。
- 目标(Destination):同步到的文件或目录路径。
示例:
rsync -avz /home/user/source/ /home/user/destination/
4. 常用参数详解
rsync
拥有众多选项,以下是常用参数的详细解释。
4.1 基本选项
-a
,--archive
:归档模式,等同于-rlptgoD
,递归复制并保持符号链接、权限、时间戳、所有权、组和设备文件。-v
,--verbose
:详细输出模式,显示传输过程中的详细信息。-z
,--compress
:在传输过程中压缩数据,节省带宽。-h
,--human-readable
:以人类可读的格式显示文件大小。-r
,--recursive
:递归复制整个目录树。
示例:
rsync -avz /src/ /dest/
4.2 递归和链接
-R
,--relative
:保持相对路径结构。-L
,--copy-links
:复制符号链接所指向的实际文件,而不是符号链接本身。-K
,--keep-dirlinks
:保留目标中的目录链接。
4.3 压缩和速度
--compress-level=NUM
:指定压缩级别(1-9)。--no-compress
:禁用压缩。--bwlimit=KBPS
:限制传输带宽,单位为KB/s。
示例:
rsync -avz --bwlimit=500 /src/ /dest/
4.4 权限和所有权
-p
,--perms
:保留文件权限。-o
,--owner
:保留文件所有者(需root权限)。-g
,--group
:保留文件所属组(需root权限)。--chmod=CHMOD
:应用特定权限设置,如--chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r
。
示例:
rsync -av --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rw,Fg=r,Fo=r /src/ /dest/
4.5 排除和包含
--exclude=PATTERN
:排除匹配 PATTERN 的文件或目录。--include=PATTERN
:包含匹配 PATTERN 的文件或目录。--exclude-from=FILE
:从指定文件中读取排除模式。--include-from=FILE
:从指定文件中读取包含模式。
示例:
排除所有 .tmp
文件和 cache/
目录:
rsync -av --exclude='*.tmp' --exclude='cache/' /src/ /dest/
4.6 日志和显示
--progress
:显示每个文件的传输进度。--stats
:在传输完成后显示详细统计信息。--log-file=FILE
:将日志输出到指定文件。
示例:
rsync -avz --progress --stats /src/ /dest/ --log-file=rsync.log
4.7 远程同步选项
-e
,--rsh=COMMAND
:指定远程 shell,如ssh
。--rsync-path=PROGRAM
:在远程主机上指定rsync
程序的路径。--delete
:删除目标中源不存在的文件。--delete-before
:在传输开始前删除目标中源不存在的文件。--delete-during
:在传输过程中删除目标中源不存在的文件。--delete-after
:在传输完成后删除目标中源不存在的文件。
示例:
使用SSH进行远程同步,并删除目标中源不存在的文件:
rsync -avz -e ssh /src/ user@remote:/dest/ --delete
5. 常见使用场景
以下是 rsync
的一些常见使用场景及对应的命令示例。
5.1 本地文件同步
在同一台机器的两个目录之间同步文件。
示例:
rsync -av --delete /home/user/source/ /home/user/destination/
说明:
--delete
:删除目标目录中源目录不存在的文件,确保两者一致。
5.2 远程备份
将本地目录备份到远程服务器。
示例:
rsync -avz -e ssh /home/user/data/ backup@remote-server:/backup/data/
说明:
- 使用
-e ssh
通过SSH进行加密传输。 -z
压缩数据,节省带宽。
5.3 镜像网站文件
定期同步本地网站文件到远程服务器,实现网站镜像。
示例:
rsync -avz --delete /var/www/html/ user@mirror-server:/var/www/html/
5.4 增量备份
仅备份自上次备份以来发生变化的文件,节省存储空间和时间。
示例:
rsync -av --link-dest=/backup/latest/ /home/user/data/ /backup/2024-04-27/
说明:
--link-dest
:创建硬链接指向上一次备份的相同文件,节省空间。
5.5 定期同步任务
结合 cron
实现自动化定期同步。
示例:
每日凌晨2点自动同步 /home/user/data/
到远程服务器:
编辑
crontab
:crontab -e
添加以下行:
0 2 * * * rsync -avz -e ssh /home/user/data/ backup@remote-server:/backup/data/ >> /var/log/rsync.log 2>&1
6. 高级用法与技巧
6.1 使用 SSH 进行加密传输
默认情况下,rsync
使用远程 shell(如SSH)进行数据传输。可以通过 -e
选项指定SSH参数。
示例:
使用指定的SSH端口(如2222)进行远程同步:
rsync -avz -e "ssh -p 2222" /src/ user@remote:/dest/
6.2 利用过滤规则
通过过滤规则精确控制哪些文件或目录需要同步或排除。
示例:
同步 /src/
目录,但排除所有 .git
目录和 node_modules
目录:
rsync -av --exclude='.git/' --exclude='node_modules/' /src/ /dest/
6.3 利用 --dry-run
进行模拟
在实际执行同步前,使用 --dry-run
查看将要执行的操作,避免误操作。
示例:
模拟同步操作:
rsync -av --dry-run /src/ /dest/
6.4 结合 cron
实现自动化
设置定时任务,实现自动化的定期备份或同步。
示例:
每周一凌晨3点同步 /data/
到远程服务器:
编辑
crontab
:crontab -e
添加以下行:
0 3 * * 1 rsync -avz -e ssh /data/ user@remote:/backup/data/ >> /var/log/rsync_backup.log 2>&1
7. 常见问题及解决办法
7.1 文件权限问题
问题:同步后文件权限不正确。
解决办法:
- 使用
-a
选项(归档模式),确保保留权限。 - 确保在目标系统上有足够的权限进行文件写入。
示例:
rsync -av /src/ /dest/
7.2 同步中断导致的数据不一致
问题:同步过程中断,可能导致部分文件未完全同步。
解决办法:
- 重新运行
rsync
命令,rsync
会自动识别已同步的文件,仅传输剩余部分。 - 使用
--partial
保留部分传输的文件,以加快恢复速度。
示例:
rsync -av --partial /src/ /dest/
7.3 远程主机认证失败
问题:无法通过SSH连接到远程主机,出现认证错误。
解决办法:
- 确认远程主机的SSH服务正常运行。
- 检查SSH密钥配置或密码是否正确。
- 使用
-e
选项指定正确的SSH参数(如端口)。
示例:
rsync -avz -e "ssh -p 2222" /src/ user@remote:/dest/
7.4 高带宽使用导致网络拥塞
问题:rsync
同步过程中占用大量带宽,影响其他网络服务。
解决办法:
- 使用
--bwlimit
限制rsync
的带宽使用。 - 在非高峰时段进行同步。
示例:
限制带宽为500KB/s:
rsync -avz --bwlimit=500 /src/ /dest/
7.5 删除目标中源不存在的文件
问题:希望目标目录中不再源目录中的文件被自动删除。
解决办法:
- 使用
--delete
选项实现目标目录与源目录一致。 - 如果不希望删除,可以不使用
--delete
,或使用其他相关选项(如--delete-excluded
)。
示例:
rsync -av --delete /src/ /dest/
8. 总结
rsync
是一个极其灵活和高效的文件同步工具,适用于各种备份、镜像和数据传输需求。通过熟练掌握其常用参数和使用场景,您可以实现快速、可靠的数据同步和备份。
关键要点:
- 增量传输:
rsync
仅传输变化的部分,节省带宽和时间。 - 灵活的过滤规则:通过包含和排除模式,精确控制同步内容。
- 保留文件属性:使用
-a
选项保留权限、时间戳等文件属性。 - 加密传输:结合SSH实现安全的数据传输。
- 自动化:通过
cron
实现定期的自动化同步任务。
9. 附录:完整参数列表
以下是 rsync
命令的部分常用参数及其说明,更多参数请参考 man rsync
。
参数 | 说明 |
---|---|
-a , --archive |
归档模式,等同于 -rlptgoD 。递归并保留符号链接、权限、时间戳、所有权、组和设备文件。 |
-v , --verbose |
详细输出模式。 |
-z , --compress |
在传输过程中压缩数据。 |
-h , --human-readable |
以人类可读的格式显示文件大小。 |
-r , --recursive |
递归复制整个目录树。 |
-u , --update |
仅更新目标中源文件较新的文件。 |
-n , --dry-run |
模拟执行,显示将要执行的操作但不实际执行。 |
--delete |
删除目标中源不存在的文件。 |
--exclude=PATTERN |
排除匹配 PATTERN 的文件或目录。 |
--include=PATTERN |
包含匹配 PATTERN 的文件或目录。 |
--progress |
显示每个文件的传输进度。 |
--stats |
在传输完成后显示详细统计信息。 |
--bwlimit=KBPS |
限制传输带宽,单位为KB/s。 |
-e , --rsh=COMMAND |
指定远程 shell,如 ssh 。 |
--partial |
保留部分传输的文件,便于中断后恢复。 |
--backup |
为覆盖的文件创建备份。 |
--backup-dir=DIR |
指定备份文件的存放目录。 |
--delete-before |
在传输开始前删除目标中源不存在的文件。 |
--delete-during |
在传输过程中删除目标中源不存在的文件。 |
--delete-after |
在传输完成后删除目标中源不存在的文件。 |
--exclude-from=FILE |
从指定文件中读取排除模式。 |
--include-from=FILE |
从指定文件中读取包含模式。 |
示例:
递归同步并保留所有属性:
rsync -av /src/ /dest/
通过SSH同步并限制带宽:
rsync -avz -e ssh --bwlimit=1000 /src/ user@remote:/dest/
排除特定文件和目录:
rsync -av --exclude='*.log' --exclude='cache/' /src/ /dest/
删除目标中源不存在的文件:
rsync -av --delete /src/ /dest/