工作中需要用到rsync来备份服务器的数据,现在简单介绍一下怎么使用rsync。
用途
a fast, versatile, remote (and local) file-copying tool.
一个快速的,万能的,远程或本地文件拷贝工具。
命令介绍
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
对于以上命令,rsync有六种不同的工作模式:
1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。
2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。
3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。
4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。
5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。
6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。
-v, --verbose #详细模式输出。
-q, --quiet #精简输出模式。
-c, --checksum #打开校验开关,强制对文件传输进行校验。
-a, --archive #归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-r, --recursive #对子目录以递归模式处理。
-R, --relative #使用相对路径信息。
-b, --backup #创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir #将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX #定义备份文件前缀。
-u, --update #仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
-l, --links #保留软链结。
-L, --copy-links #想对待常规文件一样处理软链结。
--copy-unsafe-links #仅仅拷贝指向SRC路径目录树以外的链结。
--safe-links #忽略指向SRC路径目录树以外的链结。
-H, --hard-links #保留硬链结。
-p, --perms #保持文件权限。
-o, --owner #保持文件属主信息。
-g, --group #保持文件属组信息。
-D, --devices #保持设备文件信息。
-t, --times #保持文件时间信息。
-S, --sparse #对稀疏文件进行特殊处理以节省DST的空间。
-n, --dry-run #现实哪些文件将被传输。
-w, --whole-file #拷贝文件,不进行增量检测。
-x, --one-file-system #不要跨越文件系统边界。
-B, --block-size=SIZE #检验算法使用的块尺寸,默认是700字节。
-e, --rsh=command #指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH #指定远程服务器上的rsync命令所在路径信息。
-C, --cvs-exclude #使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。
--existing #仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。
--delete #删除那些DST中SRC没有的文件。
--delete-excluded #同样删除接收端那些被该选项指定排除的文件。
--delete-after #传输结束以后再删除。
--ignore-errors #及时出现IO错误也进行删除。
--max-delete=NUM #最多删除NUM个文件。
--partial #保留那些因故没有完全传输的文件,以是加快随后的再次传输。
--force #强制删除目录,即使不为空。
--numeric-ids #不将数字的用户和组id匹配为用户名和组名。
--timeout=time #ip超时时间,单位为秒。
-I, --ignore-times #不跳过那些有同样的时间和长度的文件。
--size-only #当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。
--modify-window=NUM #决定文件是否时间相同时使用的时间戳窗口,默认为0。
-T --temp-dir=DIR #在DIR中创建临时文件。
--compare-dest=DIR #同样比较DIR中的文件来决定是否需要备份。
-P #等同于 --partial。
--progress #显示备份过程。
-z, --compress #对备份的文件在传输时进行压缩处理。
--exclude=PATTERN #指定排除不需要传输的文件模式。
--include=PATTERN #指定不排除而需要传输的文件模式。
--exclude-from=FILE #排除FILE中指定模式的文件。
--include-from=FILE #不排除FILE指定模式匹配的文件。
--version #打印版本信息。
--address #绑定到特定的地址。
--config=FILE #指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT #指定其他的rsync服务端口。
--blocking-io #对远程shell使用阻塞IO。
-stats #给出某些文件的传输状态。
--progress #在传输时现实传输过程。
--log-format=formAT #指定日志文件格式。
--password-file=FILE #从FILE中得到密码。
--bwlimit=KBPS #限制I/O带宽,KBytes per second。
-h, --help #显示帮助信息。
服务端配置
如果采用第4,5种工作模式来使用rsync,则需要在服务器上有三个配置文件:rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息),这三个配置文件内容如下所示:
#Global Settings
port=873 #运行端口,默认873
uid = root
gid = root
use chroot = no #将path目录作为进程的根目录,更安全,但path目录外的链接和相对路径的链接无法备份
#host allow = #允许的ip或ip段
motd file = /etc/rsyncd/rsyncd.motd #rsyncd.motd定义服务器信息
max connections = 20
log file = /var/log/rsyncd.log #日志文件
pid file = /var/run/rsyncd.pid #进程写到该文件中
lock file = /var/run/rsync.lock
[BBS] #模块
path = /home/apache/htdocs/bbs
read only = yes
ignore errors #忽略IO错误
list = yes
#exclude = #排除/path路径下对应的目录
#[backup]
#path = /home/backup
#read only = yes
#ignore errors
#list = yes
rsync相当于一个网络程序,已经绑定了自己的端口【873】,然后一直等待别人来通信。 可以使用别名这种方式,例如:
rsync -vzrtopgu --password-file=/etc/rsyncd/rsyncd.secrets --progress --delete --exclude 'pre-revprop-change' root@192.168.8.213::BBS /home
本地rsync链接到远程服务器192.168.8.213,然后把别名 BBS 传给远程服务器,服务器通过rsync.conf读取到BBS的配置信息,然后向本地询问用户名和密码,本地通过--password-file
得到密码,并将其发给服务器,服务器得到用户名和密码后,读取/etc/rsyncd.secrets进行验证,验证通过后,服务器将数据同步到本地。
[user]:[passwd] #例如:root:123456
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the http://pm.glodon.com/bbs/ rsync services!
2016------2017
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
无密码同步
有3种方式进行无密码同步。
-
rsync原生配置:用到了
--password-file
参数,需要分别在本地和服务端配置密码文件,rsync进程可自动读取。 -
使用ssh-keygen生成一对公钥和私钥,将公钥放在服务端,并写入authorized_keys中。
-
使用expect进行rsync同步:定义password变量。
核心算法
官网有对rsync算法的介绍。 这里做一个大概的描述: 现有两台机器a与b,a上有文件A,b上有文件B,且文件A与B非常相似(可能来自同一份源文件,只各自做了少量修改)。则rsync算法由如下若干步骤组成:
-
b以s个字节为单位,将文件B分割成不重叠的若干块(例如B是1024字节,s是512字节,则B被分割成不重叠的2块)。最后一块可能不到s个字节。
-
b对每个s字节块都计算两种校验和:32位的弱“滚动”校验和、128位的强MD4校验和。
-
b将这些校验和发给a。
-
a逐一搜索A中每个s字节块(因为A中出现不同内容的长度可能是非s整数倍的字节,所以A中每个s字节块的步进偏移量是1),找到与B中某s字节块有同样弱校验和与强校验和的字节块。(a如何找到文件A中与文件B中相同的字节块,这里就不详述了。该步骤是个计算密集的过程。为了提高性能,弱校验和的算法应该仔细设计,以到达单向、快速、计算量小。)
-
a向b发送一串指令。b根据这些指令同步B文件。这些指令要么是到B某个字节块的引用,要么是数据内容。这些数据内容均是A中与B不同的字节块。
-
b通过以上步骤,最终同步B文件。