rsync - a fast, versatile, remote (and local) file-copying tool.
rsync synopsis:
rsync 支持三种传输模式:
local 本地
remote shell (ssh, rsh)
rsync daemon
rsync连接远程主机进行同步或备份时有两种途径:使用远程shell程序(如ssh或rsh)进行连接,或使用TCP直接连接rsync daemon。
当源路径或目的路径的主机名后面包含一个冒号分隔符时,rsync使用远程shell传输;当源路径或目的路径的主机名后面包含两个冒号,或使用rsync://URL时,rsync使用TCP直接连接rsync daemon。
特别的,如果只指定了源路径,而没有指定目的路径,rsync将会显示源路径中的文件列表,类似于使用命令ls -l。rsync把本地端看作client,把远程端当成server。注意:不要把server与rsync daemon混淆!daemon一定是server,而server却不一定是daemon,也可能是远程shell的衍生进程。
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 Usages with just one SRC arg and no DEST arg will list the source files instead of copying.
Rsync is a fast and extranordinarily versatile file copying tool. It can copy locally, to/from another host over any remote shell, or to/from a remote rsync daemon. Rsync finds files that need to be transferred using a "quick check" algorithm(by default) that looks for files that have changed in size or in last-modified time. Any changes in the other preserved attributes (as requested by options) are made on the destination file directly when the quick check indicates that the file‘s data does not need to be updated.
A trailing slash on the source changes this behavior to avoid creating an additional directory level at the destination. You can think of a trailing / on a source as meaning "copy the contents of this directory" as opposed to "copy the directory by name", but in both cases the attributes of the containing directory are transferred to the containing directory on the destination. In other words, each of the following commands copies the files in the same way, including their setting of the attributes of /dest/foo:
rsync -av /src/foo /dest # create foo directory in /dest/
rsync -av /src/foo/ /dest/foo # cp /src/foo/* /dest/foo
CONNECTING TO AN RSYNC DAEMON
It is also possible to use rsync without a remote shell as the transport. In this case you will directly connect to a remote rsync daemon, typically using TCP port 873. (This obviously requires the daemon to be running on the remote system, so refer to the STARTING AN RSYNC DAEMON TO ACCEPT CONNECTIONS section below for information on that.)
Some modules on the remote daemon may require authentication. If so, you will receive a password prompt when you connect. You can avoid the password prompt by setting the environment variable RSYNC_PASSWORD to the password you want to use or using the --password-file option. This may be useful when scripting rsync.
WARNING: On some systems environment variables are visible to all users. On those systems using --password-file is recommended.
rsync 的安装
for CentOS: # yum -y install rsync for ubuntu/debian # sudo apt-get install rsync
rsync 的配置文件
rsync daemon,有两种方式。其一是通过xinetd进程来管理;其二作为一个独立的进程启动。
经由 xinetd 控管:
第一步:安装 xinetd # yum -y install xinetd 第二步:编辑配置文件, 启动 rsync # vim /etc/xinetd.d/rsync disable = yes # 将disable=yes改为no 修改为: disable = no 第三步:重新启动 xinetd 进程 # service xinetd restart 查看状态: [root@skype ~]# ss -tulpn | grep 873 tcp LISTEN 0 64 :::873 :::* users:(("xinetd",1446,5))
作为独立进程启动:
运行的时候,加上 --daemon 选项 # /usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf
下面我们将涉及到三个文件 rsyncd.conf,rsyncd.secrets 和rsyncd.motd。
rsyncd.conf 是rsync服务器主要配置文件。
rsyncd.secrets是登录rsync服务器的密码文件。
rsyncd.motd是定义rysnc 服务器信息的,也就是用户登录时,所显示的信息。
我们需要手动建立这三个文件:
[root@skype ~]# mkdir /etc/rsync.d [root@skype ~]# touch /etc/rsync.d/rsyncd.{conf,secrets,motd} [root@skype ~]# tree /etc/rsync.d /etc/rsync.d |-- rsyncd.conf |-- rsyncd.motd `-- rsyncd.secrets 为了安全性,我们必须把 /etc/rsync.d/secrets 权限设置为 600 [root@skype ~]# chmod 600 /etc/rsync.d/rsyncd.secrets [root@skype ~]# ls -l /etc/rsync.d/rsyncd.secrets -rw-------. 1 root root 0 Apr 19 15:54 /etc/rsync.d/rsyncd.secrets
rsyncd.secrets 格式:
user1:123456 # 用户名:密码, 一行表示一个用户,此用户和系统用户无关
这个密码文件的文件属性设为root拥有, 且权限要设为600, 否则无法备份成功!
rsyncd.conf 格式
# Global Settings 全局设定 uid = nobody :以哪个用户的身份运行或获取数据的 gid = nobody :用户都以来宾帐号的方式运行 use chroot = no :在服务运行时要不要把他锁定在家目录 max connections = 10 :做为服务器端最大并发连接数 strict modes = yes :表示是否工作在严格模式下,严格检查文件权限等相关信息 pid file = /var/run/rsyncd.pid : 定义pid文件路径 log file = /var/log/rsyncd.log : 定义日志文件存放路径的 # Directory to be synced 定义共享目录的模块 [my_data_rsync] 要同步的目录名称,多个目录名称是不能重名的 path = /myrsync/data : 定义目录的路径 ignore errors = yes : 表示如果中间复制过程有一个文件出错了是要继续复制还是中止复制,yes表示继续复制,no表示中止复制 read only = no :如果打算让别人仅仅是来拉取数据的,yes就可以了,如果打算让别人推送过来做备份的那就为no,表示客户端是否可以推送的 write only = no :只允别人在里面写数据,但不可以拉取数据 hosts allow = 172.16.251.244:做白名单的,是否允许哪些主机可以访问的 hosts deny = * :黑名单的 说明: 1、二者都不出现时,默认为允许访问 2、只出现hosts allow,定义白名单,但没有被匹配到的主机由默认规则处理,即为允许 3、只出现hosts deny,定义黑名单,出现在名单中的都被拒绝 4、二者同时出现,先检查hosts allow,如果匹配就allow,否则检查hosts deny,如果匹配则拒绝,如是二者都不匹配,则由默认规则处理,即为允许 list = false :是否允许用户列出文件列表的 uid = root :以哪个用户身份去获取文件的 gid = root auth users = myuser:做用户验证的,只允许哪个用户来复制 secrets file = /etc/.rsync.passwd :存放验证用户的密码的
# Minimal configuration file for rsync daemon # See rsync(1) and rsyncd.conf(5) man pages for help # This line is required by the /etc/init.d/rsyncd script pid file = /var/run/rsyncd.pid port = 873 address = 192.168.3.134 #uid = nobody #gid = nobody uid = root gid = root use chroot = yes read only = yes #limit access to private LANs hosts allow=192.168.3.0/255.255.255.0 10.0.1.0/255.255.255.0 hosts deny=* max connections = 5 motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file #log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync #transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300 [linuxsirhome] path = /home list=yes ignore errors auth users = user1 secrets file = /etc/rsyncd/rsyncd.secrets comment = linuxsir home exclude = beinan/ samba/
读取 rsync.password 这个文件。这个文件内容只是linuxsir用户的密码
-a:归档模式,保持文件的所有属性,相当于-rlptgoD
-r:递归模式
-e:指定一个远程shell
-z:文件传输时进行压缩处理
--delete:镜像中常用,删除DEST中那些SRC中不存在的文件
在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如:
通知配置文件的改变
跟踪某些关键的系统文件的变化
监控某个分区磁盘的整体使用情况
系统崩溃时进行自动清理
自动触发备份进程
向服务器上传文件结束时发出通知
通常使用文件轮询的通知机制,但是这种机制只适用于经常改变的文件(因为它可以确保每过x秒就可以得到i/o),其他情况下都非常低效,并且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像Tripwire这样的数据完整性系统,它们基于时间调度来跟踪文件变化,但是如果想实时监控文件的变化的话,那么时间调度就束手无策了。Inotify就这样应运而生了。
Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化(增加、删除、修改、移动等各种细微事件)。近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:
% grep INOTIFY_USER /boot/config-$(uname -r) CONFIG_INOTIFY_USER=y
如果输出(‘CONFIG_INOTIFY_USER=y‘),那么你可以马上享受Inotify之旅了。
安装inotify-tools
# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz # tar xf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make && make install
#!/bin/bash #filename watchdir.sh path=$1 # /usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y/%H:%M‘ --format ‘%T %w %f‘ -e modify,delete,create,attrib $path /usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f%e‘ -e modify,delete,create,attrib $data_dir | while read files do #rsync -avzP $host::$dst $data_dir rsync -avzP --delete --progress $data_dir $host::$dst echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 done [root@node1 inotify-tools-3.14]# chmod u+x inotify_rsync.sh [root@node1 inotify-tools-3.14]# bash inotify_rsync.sh & [1] 4533 [root@node1 inotify-tools-3.14]# ps -ef | grep inoti | grep -v "grep" root 4533 1880 0 18:02 pts/1 00:00:00 bash inotify_rsync.sh root 4534 4533 0 18:02 pts/1 00:00:00 /usr/local/bin/inotifywait -mrq --timefmt %d/%m/%y %H:%M --format %T %w%f%e -e modify,delete,create,attrib /data/node1/ root 4535 4533 0 18:02 pts/1 00:00:00 bash inotify_rsync.sh
-m
是要持续监视变化。
-r
使用递归形式监视目录。
-q
减少冗余信息,只打印出需要的信息。
-e
指定要监视的事件列表。
--timefmt
是指定时间的输出格式。
--format
指定文件变化的详细信息。
master: 192.168.3.133 (rsync 分发节点,推送, inotify)
slave: 192.168.3.134 (rsync 服务节点,配置rsync --daemon 方式启动)
配置 slave(192.168.3.134):
1、安装 rsync 软件
# yum install rsync
2、手动创建rsync配置文件
# mkdir /etc/rsync.d # vim /etc/rsync.d/rsyncd.conf #全局配置开始,运行rsync的用户 uid = root gid = root usechroot = no max connections = 10 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [dnspod-sr] path = /root ignore errors read only = no write only = no list = false hosts allow = 192.168.3.133 # hosts allow = 192.168.1.0/24 # hosts deny = 0.0.0.0/32 auth users = backuser secrets file = /etc/rsync.d/rsyncd.secrets
3、创建备份目录
# mkdir dnspod-sr
4、建立 rsync 用户和密码文件
/etc/rsync.d/ rsyncd.secrets 格式为: username:password
权限必须是600, chmod 600 /etc/rsync.d/rsyncd.secrets
# echo ‘backuser:123‘ >> /etc/rsync.d/rsyncd.secrets 更改权限,必须是 600 # chmod 600 /etc/rsync.d/rsyncd.secrets
5、启动rsync并添加开机启动
# /usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf # echo "/usr/bin/rsync --daemon --config=/etc/rsync.d/rsyncd.conf" >> /etc/rc.local
配置 master: inotify
1. 安装 inotify 软件包
# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
# tar zxf inotify-tools-3.14.tar.gz
# cd inotify-tools-3.14
# ./configure && make && make install
2. 写一个脚本来实现,当 /root/dnspod-sr 中文件有变化时,让各rsync服务节点同步数据:
# vim /root/inotify.sh
#!/bin/bash
src=/root/dnspod-sr #此文件是rsync客户端本地文件,需要上传到各个rsync服务节点
des=dnspod-sr # slave 需要被上传推送的目录, rsyncd.conf 指定的模块 [dnspod-sr]
host=192.168.3.134 #rsync服务节点
user=backuser
/usr/local/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%f‘ -emodify,delete,create,attrib $src | while read file
do
#rsync -avzP $host::$dst $data_dir
/usr/bin/rsync -avzP --delete --progress $src $user@$host::$des --password-file=/etc/rsync.password
echo
"${file} was rsynced"
>>
/var/log/rsync.log 2>&1
done
注释:
inotifywait
-m:保持监听事件。
-r:递归查看目录。
-q:打印出事件。
-e modify,delete,create,attrib:监听写入,删除,创建,属性改变事件。
rsync
-a:存档模式,相当于使用-rlptgoD。
-v:详细模式输出。
-z:传输过程中压缩文件。
3. 给予执行权限
创建 /etc/rsync.password 文件,可以放在任意位置, 为之前指定的 backuser 保存密码
格式为:password # 在这里被坑了一次
权限为600:chmod 600 rsync.password
# echo "123" >> /etc/rsync.password
# chmod 600 /etc/rsync.password
# chmod +x /root/inotify.sh
# /root/inotify.sh & #在后台执行
4.最后,将此脚本加入系统自启动文件
# echo "/root/inotify.sh" >> /etc/rc.local
四、rsync如何排除不想同步的目录或文件
单个文件排除:比如我不想同步/opt/aa.php文件,直接使用 --exclude “aa.php”
rsync -vzrtopg --delete --progress --exclude"aa.php" $src backuser@$ip::$des--password-file=/etc/rsync.password > /dev/null 2>&1 && echo"$src was rsynced"
多个文件或目录排除:使用--exclude-from=“/root/xx.list”,文件列表,此文件名写绝对路径,写在哪里都可以,不必就写在/opt目录下
rsync -vzrtopg --delete --progress --exclude-from="/root/xx.list" $src backuser@$ip::$des --password-file=/etc/rsync.password > /dev/null2>&1 && echo "$src was rsynced"
编辑要排除文件的列表,即/root/xx.list
编辑要排除的文件列表,其中目录直接写目录名,文本文件写相对路径
本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1635859
原文地址:http://skypegnu1.blog.51cto.com/8991766/1635859