rsync 全名 Remote Sync,是类 unix 系统下的数据镜像备份工具。可以方便的实现本地,远程备份,rsync 提供了丰富的选项来控制其行为。rsync 优于其他工具的重要一点就是支持增量备份。
rsync 是一个功能非常强大的工具,其命令也有很多功能选项,它的特性如下:
- 可以保持文件原来的权限、时间、所有者、组信息、软硬链接等等
- 可以从远程或者本地镜像保存整个目录树和文件系统
- 无须特殊权限 super-user 即可安装使用
- 快速:要比 scp (Secure Copy) 要快;第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。rsync 在传输数据的过程中可以实行压缩及解压缩操作,可以使用更少的带宽
- 安全:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接
- 支持匿名传输,以方便进行网站镜像
rysnc 的官方网站:http://rsync.samba.org/,可以从上面得到最新的版本。
rsync 的使用
Rsync 的命令格式可以为以下六种:
# 本地模式
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
上述命令中,SRC 表示源地址,而 DEST 表示目标地址,这二者可以是本地目录,也可以是远程服务器地址。当只有 SRC 地址没有 DEST 时会列出所有的文件列表,而不会执行拷贝。
rsync 有两种方式来连接远程服务器
- 使用 remote shell 程序,比如 ssh 或者 rsh
- 或者直接通过 TCP 来连接 daemon
这两种方式的直接区别体现在路径中的冒号 (:) ,当只有一个冒号时使用 remote shell,当有两个冒号时使用 daemon 连接。
rsync 有六种不同的工作模式:
- 拷贝本地文件;当 SRC 和 DEST 路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
- 使用一个远程 shell 程序(如 rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当 DEST 路径地址包含单个冒号”:”分隔符时启动该模式。
- 使用一个远程 shell 程序(如 rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当 SRC 地址路径包含单个冒号”:”分隔符时启动该模式。
- 从远程 rsync 服务器中拷贝文件到本地机。当 SRC 路径信息包含”::”分隔符时启动该模式。
- 从本地机器拷贝文件到远程 rsync 服务器中。当 DEST 路径信息包含”::”分隔符时启动该模式。
- 列远程机的文件列表。这类似于 rsync 传输,不过只要在命令中省略掉本地机信息即可。
这 6 种方式看似复杂,其实只要记住一些常用参数,然后记住一些常用方法就能够将 rsync
利用起来。
可以 man rsync
参考 rsync 文档,了解详细的使用方法,下面解析一些参数的使用
常用的几个参数
-v verbose 详细输出
-a 归档模式,递归方式传输文件,并保持连接,权限,用户和组,时间信息
-z 压缩文件传输
-h human-readable, 输出友好
-u 跳过已经存在的文件,备份更新
rsync 参数的具体解释如下:
|
|
Example
下面举例说明 rsync 的六种不同工作模式:
拷贝本地文件
当 SRC 和 DES 路径信息都不包含有单个冒号 “:” 分隔符时就启动这种工作模式。
同步文件
rsync -ahvz backup.tar.gz /backups/ # DESC 不存在时自动创建
将备份文件同步到 /backups/
目录下。
同步目录
rsync -avzh /home/src /backups/files/
将 /home/src
目录下的文件同步发送到 /backups/files
目录下。记住如果目标地址没有 src
目录,rsync 会自动创建该文件夹。
rsync -avz /home/src/ /backups/files/
SRC 路径末尾的 /
表示不自动创建 DEST 文件夹,在 man rsync
中的解释就是末尾的 /
表示”拷贝当前目录下的文件” ,而不是”拷贝当前的目录”.
远程 shell 拷贝到远程
使用一个远程 shell 程序(如 rsh、ssh) 来实现将本地机器的内容拷贝到远程机器。当 DES 路径地址包含单个冒号”:”分隔符时启动该模式。
rsync -avz /local/path/ user@remoteip:/path/to/files/
将本地 /local/path/
中的文件同步备份到远程 /path/to/files/
目录。
远程 shell 拷贝到本地
使用一个远程 shell 程序(如 rsh、ssh) 来实现将远程机器的内容拷贝到本地机器。当 SRC 地址路径包含单个冒号”:”分隔符时启动该模式。
rsync -avz user@remoteip:/home/user/src ./src
远程 rsync 服务器拷贝到本地
从远程 rsync 服务器中拷贝文件到本地机。当 SRC 路径信息包含”::”分隔符时启动该模式。
rsync -av user@remoteip::www /databack
拷贝本地文件到远程
从本地机器拷贝文件到远程 rsync 服务器中。当 DES 路径信息包含”::”分隔符时启动该模式。
rsync -av /databack user@remoteip::www
文件列表
列远程机的文件列表。这类似于 rsync 传输,不过只要在命令中省略掉本地机信息即可。
rsync -v rsync://remoteip /www
rsync 使用更改端口
经常遇见的一种情况就是 ssh 更改了默认 22 端口,这个时候使用 -e
参数即可。
rsync 有两种常用的认证方式,一种为 rsync-daemon 方式,另外一种则是 ssh。
ssh 一般为首选,但当远端服务器的 ssh 默认端口被修改后,rsync 时找不到一个合适的方法来输入对方 ssh 服务端口号。
比如现在向机器 remoteip 传送文件,但此时 remoteip 的 ssh 端口已经不是默认的 22 端口。
键入命令
rsync /local/path user@remoteip:/path/to/files/ # 出现错误
rsync 中的命令 参数 -e, --rsh=COMMAND
指定使用 rsh、ssh 方式进行数据同步。
参数的作用是可以使用户自由选择想要使用的 shell 程序来连接远端服务器,当然也可以设置成使用默认的 ssh 来连接,但是这样我们就可以加入 ssh 的参数了。
现在命令可以这样写了:
rsync -avz -e "ssh -p $port" /local/path/ user@remoteip:/path/to/files/
显示备份进度
可以使用 --progress
选项来显示进度
rsync -avzhe ssh --progress /home/files/ root@remoteip:/path/to/files/
限制备份文件最大值
设置 Max size 备份文件
rsync -avzhe ssh --max-size='2000k' /var/lib/rpm/ root@remoteip:/root/tmprpm
备份结束后自动删除本地文件
rsync --remove-source-files -zvh backup.tar /tmp/backups/
设置备份带宽
rsync --bwlimit=100 -avzhe ssh /var/lib/rpm/ root@remoteip:/root/tmprpm/
排除文件
排除文件或目录时,需要使用它们到源目录的相对路径。
有两个选项可以指定要排除的文件和目录:
- 从命令行,使用
--exclude
选项。 - 从文件,使用
--exclude-from
选项。
排除特定文件
要排除特定文件,请将文件的相对路径传递给--exclude
选项。
在以下示例中,不会传输文件src_directory/file.txt
:
rsync -a --exclude 'file.txt' src_directory/ dst_directory/
排除特定目录
排除特定目录与排除文件相同,只需将目录的相对路径传递给--exclude
选项,如下所示:
rsync -a --exclude 'dir1' src_directory/ dst_directory/
如果要排除目录内容,但不排除目录本身,请使用dir1/*
而不是dir1
:
rsync -a --exclude 'dir1/*' src_directory/ dst_directory/
排除多个文件或目录
要排除多个文件或目录,只需指定多个--exclude
选项:
rsync -a --exclude 'file1.txt' --exclude 'dir1/*' --exclude 'dir2' src_directory/ dst_directory/
如果您想使用单个--exclude
选项,则可以用大括号{}
列出要排除的文件和目录,用逗号分隔,如下所示:
rsync -a --exclude={'file1.txt','dir1/*','dir2'} src_directory/ dst_directory/
如果要排除的文件和/或目录数量很大,则可以使用多个--exclude
选项来指定要排除在文件中的文件和目录,然后将文件传递给--exclude-from
]选项。
下面的命令与上面的命令完全相同:
rsync -a --exclude-from='exclude-file.txt' src_directory/ dst_directory/
exclude-file.txt
file1.txt
dir1/*
dir2
Copy
根据模式排除多个文件或目录
借助rsync,您还可以根据与文件或目录名称匹配的模式排除文件和目录。
例如,要排除所有.jpg
个文件,您可以运行:
rsync -a --exclude '*.jpg*' src_directory/ dst_directory/
排除那些与特定模式匹配的文件和目录之外的所有其他文件和目录并不困难。假设您要排除所有其他文件和目录,但以.jpg
结尾的文件除外。
一种选择是使用以下命令:
rsync -a -m --include='*.jpg' --include='*/' --exclude='*' src_directory/ dst_directory/
使用多个包含/排除选项时,将应用第一个匹配规则。
--include='*.jpg'
-首先,我们包括所有.jpg
文件。--include='*/'
-然后,我们将所有目录都包含在src_directory
目录中。没有这个rsync,只会在顶层目录中复制*.jpg
个文件。-m
-删除空目录。
另一个选择是将 查找命令的输出传递给rsync:
find src_directory/ -name "*.jpg" -printf %P\\0\\n | rsync -a --files-from=- src_directory/ dst_directory/
-printf %P\\0\\n
-从文件路径中删除src_directory/
。--files-from=-
-表示仅包含来自标准输入的文件(从find命令传递的文件)。