一、引言
在 Linux 和 UNIX 系统中,rsync
是一个非常强大的工具,用于同步文件和目录。它不仅具有高效的增量备份能力,而且支持多种传输协议,如 SSH、rsync 协议等。本文旨在介绍 rsync
的基本用法和常见操作,帮助读者快速掌握其使用技巧。
二、rsync 基本概念
rsync
的工作原理是通过比较源和目标位置的文件差异,只传输差异部分,从而实现高效的同步。这使得 rsync
特别适合用于备份和镜像等场景。
三、介绍rsync 是什么?
rsync 是一个常用的 Linux 应用程序,用于文件同步。
它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。
rsync(Remote Sync)是一个强大的文件同步工具,广泛用于在本地或远程系统之间同步文件和目录。它可以在不同系统之间同步数据,保持文件的一致性,同时节省带宽和时间。
四、安装
如果本机或者远程计算机没有安装 rsync,可以用下面的命令安装。
# Debian
$ sudo apt-get install rsync
# Red Hat
$ sudo yum install rsync
# Arch Linux
$ sudo pacman -S rsync
注意,传输的双方都必须安装 rsync。
五、rsync 基本语法
rsync
的基本语法如下:
rsync [选项 -avz] 源路径 目标路径
-a:归档模式,保持文件属性,递归地复制目录。
-v:详细输出,显示正在复制的文件。
-z:压缩传输,减少数据传输量。
常见示例(默认ssh协议):
- 将本地目录
/path/to/source
同步到远程服务器/path/to/destination
:
rsync -avz /path/to/source username@remote_host:/path/to/destination
- 从远程服务器同步目录到本地:
rsync -avz username@remote_host:/path/to/source /path/to/destination
六、常用选项
1. -a
或 --archive
归档模式,表示以递归方式传输文件,并保持所有文件属性,如权限、时间戳、符号链接等。
2. -v
或 --verbose
详细模式,输出同步过程中的详细信息。
3. -z
或 --compress
在传输过程中对文件进行压缩,以提高传输效率。
4. --delete
删除目标位置中存在于源位置但已不存在的文件。这有助于保持源和目标之间的完全同步。
默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用–delete参数,这将删除只存在于目标目录、不存在于源目录的文件。
5. --exclude
排除某些文件或目录。可以多次使用此选项来排除多个文件或目录。
6. --exclude-from=FILE
从文件中读取要排除的文件或目录列表。每行一个排除规则。
7. --progress
显示同步过程中的进度信息。
8. --bwlimit=RATE
限制传输带宽,单位为 kB/s。
9. 同步模拟
有时你可能只想查看同步操作的结果而不实际执行,可以使用--dry-run
选项进行模拟:
rsync -avz --dry-run /path/to/source_directory/ /path/to/destination_directory/
10. 其他参数实例
-r表示递归,即包含子目录。
-a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以-a比-r更有用。下面的用法才是常见的写法。
-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。
-n参数模拟命令执行的结果,并不真的执行命令。
rsync -av source destination
目标目录destination如果不存在,rsync 会自动创建。执行上面的命令后,源目录source被完整地复制到了目标目录destination下面,即形成了destination/source的目录结构。
rsync -a source/ destination
source目录里面的内容,就都被复制到了destination目录里面,并不会在destination下面创建一个source子目录。
rsync -av --delete source/ destination
--delete参数会使得destination成为source的一个镜像。
排除问题操作
--exclude 参数
排除所有.TXT的文件
rsync -av --exclude='*.txt' source/ destination
rsync -av --exclude '*.txt' source/ destination
注意,rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"
如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样。
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
--include 参数
--include参数用来指定必须同步的文件模式,往往与--exclude结合使用。
rsync -av --include="*.txt" --exclude='*' source/ destination
七、进阶用法
1. 使用 SSH 密钥进行无密码同步
通过配置 SSH 密钥认证,可以实现 rsync
的无密码同步。首先,在本地生成 SSH 密钥对,并将公钥复制到远程服务器上的 ~/.ssh/authorized_keys
文件中。然后,在 rsync
命令中使用 -e ssh
选项来指定使用 SSH 协议进行传输。
确保在远程主机上已经设置了密钥,并且在本地主机上也已经设置了密钥。然后使用以下命令进行同步:
rsync -avz -e 'ssh -i /path/to/private_key' /path/to/source_directory/ username@remote_host:/path/to/destination_directory/
2. 定时同步
结合 Linux 的 cron
工具,可以实现定时同步文件或目录。例如,编辑 /etc/crontab
文件,添加一行类似下面的配置:
0 1 * * * /usr/bin/rsync -avz /path/to/source /path/to/destination
这表示每天凌晨 1 点执行一次同步操作。
八、远程同步
1. SSH 协议
本地文件同步远程服务器
rsync -av source/ username@remote_host:destination
远程文件同步本地服务器
rsync -av username@remote_host:source/ destination
栗子:
rsync -av nexus-3.29.0-02-unix.tar.gz 42.193.12.218@root:/home/humx
ssh: Could not resolve hostname root: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(605) [sender=3.0.9]
[root@iZwz9aehttqhrmcj5oiusuZ test]# rsync -av nexus-3.29.0-02-unix.tar.gz root@42.193.12.218:/home/humx
The authenticity of host '42.193.12.218 (42.193.12.218)' can't be established.
ECDSA key fingerprint is 22:49:b2:5c:7c:8f:73:56:89:29:8a:bd:56:49:74:66.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '42.193.12.218' (ECDSA) to the list of known hosts.
root@42.193.12.218's password:
sending incremental file list
nexus-3.29.0-02-unix.tar.gz
sent 163855898 bytes received 31 bytes 636333.70 bytes/sec
total size is 163835797 speedup is 1.00
录入密码后,信息会记录到ssh的配置文件:known_hosts中,下次还得录入密码
rsync 默认使用 SSH 进行远程登录和数据传输。
由于早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。
rsync -av -e ssh source/ user@remote_host:/destination
但是,如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。
rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
上面命令中,-e参数指定 SSH 使用2234端口。
2. rsync 协议
除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用rsync://协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::。
$ rsync -av source/ 192.168.122.32::module/destination
注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。
如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令。
$ rsync rsync://192.168.122.32
rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。
$ rsync -av source/ rsync://192.168.122.32/module/destination
九、增量备份
rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。
除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。
具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
--link-dest
参数用来指定同步时的基准目录。
$ rsync -a --delete --link-dest /compare/path /source/path /target/path
上面命令中,--link-dest
参数指定基准目录/compare/path
,然后源目录/source/path
跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path
。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。