rsync笔记
rsync
开源的
备份工具(本地、远程)
本地备份
cp
dd
rsync
远程备份
scp
nfs
ftp
samba
rsync
scp备份
将一个文件或者目录传到远程主机上,实现备份效果
做的全量备份
rsync备份
可以实现类似于scp的全量备份效果
也可以实现增量备份(自动查找新文件,实现备份)
rsync的功能和特点
1. 可以实现服务器各种资源的备份(可以夸文件系统)
2. linux-rsync,windows-cwrsync
3. 可以做全量备份,也可以做增量备份
4. 在做备份的时候,可以排除一些特定的文件不做备份
5. 可以结合ssh实现加密传输
6. rsync支持工作在后台的模式(守护进程模式)
7. rsync可以结合inotify/sersync实现自动实时备份
8. rsync在传输文件的过程中可做限速
rsync的工作模式
1. 命令行模式(shell模式)
类似于cp、dd命令,实现备份文件的复制(备份)
2. 远程模式(远程shell模式)
利用ssh实现数据的远程传输,类似于 scp
3. 列表模式
类似于执行ls命令,仅仅用于列出文件内容列表(不是做复制操作)
4. 后台模式(守护进程模式)
rsync是工作在后台的
rsync实时自动备份
结合inotify/sersync
inotify/sersync:监控文件和目录中的文件是否发生更改(找出新文件)
rsync:将找出的文件备份过去
rsync的用法
1.本地使用(cp)
2.远程使用(scp)
3.守护进程(socket)
rsync用法
选项
-p:保持文件的权限属性不变
-v:显示执行过程信息
-r:目录做递归
-a:归档
-z:压缩
-l:仅仅传输软链接自身
-L:传输软连接所指向的原始文件
-b:在备份文件的时候,如果备份文件已经存在,会将目标位置下旧的文件重命名,然后生成新的备份
--suffix=xxx 指定旧备份文件的后缀名
--backup-dir=xxxx 指定将旧备份文件移动到哪个位置下
-e:结合ssh实现加密传输
-e "ssh -p 22"
用法1:本地用法
Local: rsync [OPTION...] SRC... [DEST]
例子:
# rsync /etc/passwd /home/passwd.bak
# rsync -b --suffix=.bak2 --backup-dir=/tmp/ /etc/passwd /home/
用法2:远程shell
拉取:rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推送:rsync [OPTION...] SRC... [USER@]HOST:DEST
例子:
拉取:rsync -v -e "ssh -p 22" toot@10.220.5.194:/home/passwd /tmp/
推送:rsync -v /root/c.sh root@10.220.5.194:/home/
说明
1. rsync默认也是基于ssh来实现的,如果目标主机的ssh端口不是22,那么在用rsync的必须用-e选项
2. rsync通常都需要首先做密钥分发
3. rsync在远程传输文件的时候,仅仅会传输新文件
4. 在进行文件传输过程中,必须使用对方主机上的一个用户,还必须知道其密码,而且该用户还要有权限
案例:将整个home目录传递到190的tmp下
# rsync -r -avz /home root@10.220.5.190:/tmp
用法3:守护进程模式
Pull: rsync [OPTION...] [虚拟用户@]HOST::模块名... [DEST]
Push: rsync [OPTION...] SRC... [虚拟用户@]HOST::模块名
rsync的配置文件
/etc/rsyncd.conf(默认不存在)
格式:
全局参数1
全局参数2
...
[模块1]
模块参数1
模块参数2
...
[模块2]
模块参数1
模块参数2
...
模块:其实就是一个目录,这个模块用于保存客户端所传递过来的文件
参数:
pid file:指定rsync的pid文件的保存位置
uid:指定运行rsync进程的用户id
gid:指定运行rsync进程的用户组id
port:指定rsync所监听的端口(默认端口873)
path:指定模块所对应的目录的位置
use chroot:指定将用户锁定在家目录中
max connections:最大连接数(指定最多同时有多少个客户端在传输文件)
log file:指定日志文件的位置
log format:指定日志格式
lock file:指定rsync进程的锁文件的位置
read only:指定模块是否为只读状态
write only:指定模块是否为只写状态
list:指定用用户是否可以查看模块所对应的路径下的文件列表
exclude:指定排除不做传输的文件
exclude from:通过读取一个文件,来获取不对哪些文件做传输
auth users:指定用于连接这个模块所要使用的匿名用户名
secrets file:指定保存虚拟用户和密码文件
hosts allow:指定可以做文件传输的主机
hosts deny:黑名单
timeout:指定客户端的超时时间
启动rsync的进程的帮助
Usage: rsync --daemon [OPTION]...
--address=ADDRESS :指定所监听的IP地址
--bwlimit=KBPS :限速
--config=FILE :指定其配置文件的路径(默认位置/etc/rsyncd.conf)
案例:
将190 191 192 193上的数据备份到195上,要求如下
1)备份到195的/data/backup
2)要求195的rsync以ruser身份运行
准备工作
1. 关闭防火墙
2. 关闭selinux
第一步:配置195(用于接收各个主机所传递过来的备份)
1)创建目录
# mkdir -pv /data/backup
2)创建用于运行rsync进程的用户ruser
# useradd -r -s /sbin/nologin -u 361 ruser
3)修改目录属主属组
# chown -R 361.361 /data
4)修改(创建)rsync配置文件:/etc/rsyncd.conf
pid file=/var/lock/subsys/rsync.pid
lock file=/var/lock/subsys/rsync.lock
uid=361
gid=361
log file=/var/log/rsync.log
timeout=100
[dir1]
path=/data/backup
max connections=100
user chroot=yes
read only=no
list=yes
auth users=suser
secrets file=/etc/rsync.pwd
hosts allow=10.220.5.0/24
5)创建虚拟用户文件,并并创建虚拟用户
# echo "suser:123" >>/etc/rsync.pwd
6)修改虚拟用户文件权限为600
# chmod 600 /etc/rsync.pwd
7)启动rsync服务
# rsync --daemon --config=/etc/rsyncd.conf
8)检查是否启动成功
# ss -tnl | grep 873
【至此,rsyncd就配置完成了,然后就可以在其他节点向rsync传递数据了】
第二步:在190 191 上给195做拉取 和 推送 操作
1)执行推送和拉取,测试一下
拉取:# rsync -avz suser@10.220.5.195::dir1 ./
推送:# rsync -avz /home/* suser@10.220.5.195::dir1
2)在创建客户端密码文件(方便实现自动化)
# echo "123" >>/etc/rsync_tuser.passwd
3)修改密码文件的权限为600
# chmod 600 /etc/rsync_tuser.passwd
4)再次执行推送/拉取,用密码文件实现认证
# rsync -avz tuser@10.220.5.195::dir2 ./ --password-file=/etc/rsync_tuser.passwd
排除
--exclude=filename
例子:
排除单个文件:--exclude=5.txt
排除多个文件:--exclude={5.txt, 7.txt}
基于通配符做排除:--exclude=*txt
完全同步(无差异)
做完同步之后,两端的文件完全一致
推送:以发送方的文件为准
对方没有的发送过去
对方有,但是自己没有的,将对方主机上的文件删除
拉取:与对方主机上的文件为准
自己这一方没有就拉取下来
自己有,但是对方主机上没有的,就将自己上的文件删除
选项
--delete
补充:传输失败的原因
1. 用户名或者密码写错了
2. 密码文件指定错了
3. 虚拟用户密码文件权限不是600
4. 模块对应的文件的属主不是rsync daemon的运行者身份
rsync+inotify/sersync
ftp
samba
ntp
1.编写sysV风格的rsync的管理脚本
2.准备三个主机(A B C)
在A主机上发布模块mod1 mod2 mod3
匿名用户muser1可以管理mod1 mod2两个模块
匿名用户muser2可以管理mod2 mod3两个模块
总结:
rsync的daemon端做的操作
1. 创建模块对应的目录
2. 创建配置文件
3. 创建rsync运行所需要的匿名用户
4. 创建访问mod所用的虚拟用户文件,权限为600
5. 目录的属主是运行rsync的用户名
6. 启动daemon
rsync客户端的操作
1. 创建密码文件,权限为600
2. 使用rsync来做文件的拉取和推送
报错解决方法
1. 看终端的报错信息
2. 查看rsync的日志文件
################################################
rsync+inotify
inotify:查找发送了改变的文件或者新文件,可以持续检测一个目录中的文件是否发生更改
rsync:发送所找到的文件
软件inotify-tools有两个组件
inotifywait:检测一个目录下的文件所发生事件
inotifywatch:统计所触发的事件的次数
inotifywait的选项
-r:递归目录
-q:仅仅打印监控的事件信息
-m:一直处于监控状态
--excludei:排除文件或目录(不区分大小写)
--exclude:排除文件或目录(区分大小写)
--format:指定输出格式
%w:显示触发监控的事件的所在路径.
%f:显示触发监控的事件的文件名
%e:显示所触发的事件
%T:显示事件的触发时间
--timefmat:指定输出的时间的格式
-e:指定要监控的事件
监控的事件
access file or directory contents were read
modify file or directory contents were written
attrib file or directory attributes changed
close_write file or directory closed, after being opened in writeable mode
close_nowrite file or directory closed, after being opened in read-only mode
close file or directory closed, regardless of read/write mode
open file or directory opened
moved_to file or directory moved to watched directory
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory
create file or directory created within watched directory
delete file or directory deleted within watched directory
delete_self file or directory was deleted
unmount file system containing file or directory unmounted
案例:
195主机的 /data1 中的数据实时的同步到 190 191 的 /img1
分析
195安装inotify,实现自动发现data1下新文件,并发送过去
190 191安装rsync demon,实现可以自动文件到/img1
第一步:实现190 和191的配置
略(见上个案例)
第二步:配置195
1)安装inotify
# yum install inotify-tools -y
2)手动执行监控/data
# inotifywait -mrq --timefmt '%F %T' --format "%T %w%f %e" -e create,delete,open,close /data/
3)在另一个终端中,去data下创建一个文件
略
4)在inotifywati终端中,可以看到所触发的事件系信息
略
第三步:脚本实现自动监控并发送
#!/bin/bash
prog="inotifywait"
events="create,delete,close_write"
opt="-mrq"
dir="/data1/"
remote_pre="10.220.5."
anon_user="suser1"
mod_name="dir1"
pwd_file="/etc/r.pwd"
$prog $opt -e $events --format "%w%f" $dir | while read line
do
for dest in 190 191
do
remote_host=$remote_pre$dest
#rsync -az $line $anon_user@$remote_host::$mod_name --password-file=$pwd_file
#cd $dir
rsync -az --delete $dir $anon_user@$remote_host::$mod_name --password-file=$pwd_file
done
done
运行方式
# nohup s.sh &