rsync远程同步介绍
rsync(Remote Sync,远程同步)是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,切采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份,镜像服务器等应用。
rsync官方站点是http://rsync.samba.org/,由Wayne Davsion进行维护。作为一种常用的备份工具,rsync往往是Linux和Unix系统默认安装的基本组件之一。
在远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为同步源。在同步过程中,同步源负责提供文档的原始位置,发起端应对改设置具有读取权限。
rsync作为同步源时以守护进程运行,为其他客户机提供备份源。配置rsync同步源需要建立配置文件rsyncd.conf,创建备份账号,然后将rsync程序以“--daemon”选项运行。
rsync的基本用法(加粗部分表示常用)
格式:rsync [选项] 原始位置 目标位置
-r:递归整个目录树
-l:用来备份链接文件
-v:显示同步过程详细信息
-a:归档模式,保留文件权限属性等。等同于”-rlptgoD”
-z:在传输文件时进行压缩
-p:保留文件权限标记
-P:显示更详细过程
-t:保留文件时间标记
-g:保留文件属组标记
-o:保留文件属主标记
-H:保留硬连接文件
-A:保留ACL属性
-D:保留设备文件及其它特殊文件
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据校验和来决定是否跳过文件
首先确保如果要做rsync+inotify实时同步的话,要查看系统内核。Linux内核从2.6.13版本开始提供了inotify通知接口,用来监控文件系统的各种变化情况。
[root@root ~]# uname -r
2.6.32-431.el6.x86_64
注意:root用户是服务端lisi用户是客户端
第一步:安装xinetd和rsync。由于rsync是非常实用的备份工具所以Linux都是默认安装好的,并启动服务。
[root@root ~]# rpm -ivh /mnt/Packages/xinetd-2.3.14-39.el6_4.x86_64.rpm
[root@root ~]# rpm -q rsync
rsync-3.0.6-9.el6_4.1.x86_64
[root@root ~]# vi /etc/xinetd.d/rsync 启用xinetd
disable = no 将yes改为no
[root@root ~]# service xinetd start
正在启动 xinetd: [确定]
[root@root ~]# netstat -natp | grep 873 rsync端口是tcp的873
tcp 0 0 :::873 :::* LISTEN 28033/xinetd
基于安全性考虑,对于rsync的同步源最好仅允许以只读方式做同步。另外,同步可以采用匿名的方式,只要将其中的“auth users”和“secrets file”配置记录去掉就可以。
第二步:为备份账户创建数据文件。由于账号信息采用明文存放,因此应调整文件权限,避免账号信息泄露。
[root@root ~]# useradd benet
[root@root ~]# echo "123" | passwd --stdin benet 密码指定123
给用户对/var/www/html/设置权限
[root@root ~]# ls /var/www/html/
[root@root ~]# setfacl -R -m user:benet:rwx /var/www/html/
[root@root ~]# setfacl -R -m default:benet:rwx /var/www/html/
[root@root ~]# getfacl /var/www/html/ 查看权限
getfacl: Removing leading '/' from absolute path names
# file: var/www/html/
# owner: root
# group: root
user::rwx
user:benet:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:benet:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
第三步:rsync备份操作
[root@root ~]# cp -R /boot/grub/ /var/www/html/ 拷贝一份测试文件到需要被备份的目录下
[root@root ~]# ls /var/www/html/ 查看目录
grub
远程ssh有两种方式,第一种需要知道对方用户密码,另一种就是通过ssh-keygen生成秘钥。
(ssh远程管理openssh使用详解http://liqingwen.blog.51cto.com/9853378/1693597)
第一种输入密码远程ssh登陆(默认密码验证方式)
[root@root ~]# ssh 192.168.100.200 远程ssh
The authenticity of host '192.168.100.200 (192.168.100.200)' can't be established.
RSA key fingerprint is c5:0c:2a:f9:56:53:0a:28:f1:60:c9:a7:37:0c:8c:bc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.200' (RSA) to the list of known hosts.
[email protected]'s password: 输入对方用户密码
Last login: Fri Aug 28 13:58:24 2015 from 192.168.100.1
虚拟用户
[root@lisi ~]# mkdir /web
[root@lisi ~]# rsync -azP --delete [email protected]:/var/www/html/ /web/
从服务器上的用户备份文件到客户端
The authenticity of host '192.168.100.100 (192.168.100.100)' can't be established.
RSA key fingerprint is c5:0c:2a:f9:56:53:0a:28:f1:60:c9:a7:37:0c:8c:bc.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.100' (RSA) to the list of known hosts.
[email protected]'s password: 输入用户benet密码
有部分内容省略・・・ ・・・
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1505) [generator=3.0.6]
rsync: send_files failed to open "/var/www/html/grub/grub.conf": Permission denied (13)
注释:/boot/grub/grub.conf 这个文件在发送时失败,原因是缺少权限。可以把文件权限改为644,再次执行就可以解决问题。
[root@lisi ~]# ls /web
grub
[root@lisi ~]# exit
logout
Connection to 192.168.100.200 closed.
[root@root ~]# cd /var/www/html/grub/
[root@root grub]# ls -l grub.conf
-rw-------+ 1 root root 761 8月 28 14:31 grub.conf
[root@root grub]# chmod 644 grub.conf 添加权限
[root@root grub]# ls -l grub.conf
-rw-r--r--+ 1 root root 761 8月 28 14:31 grub.conf
[root@root grub]# ssh 192.168.100.200再次远程到客户端
[email protected]'s password:
Last login: Fri Aug 28 14:33:37 2015 from 192.168.100.100
第二种通过生成密钥方式进行无密码登录
[root@lisi ~]# ssh-keygen 生成密钥对
[root@lisi ~]# ssh-copy-id [email protected] 上传公钥到服务器的benet用户
[email protected]'s password: 输入benet用户密码
[root@lisi ~]# rsync -azP --delete [email protected]:/var/www/html/ /web/再次备份
[email protected]'s password:
receiving incremental file list
grub/grub.conf
761 100% 743.16kB/s 0:00:00 (xfer#1, to-check=11/18)
sent 31 bytes received 878 bytes 259.71 bytes/sec
total size is 255280 speedup is 280.84
可以通过编辑脚本进行执行备份操作
[root@lisi ~]# vim /opt/rsync.sh
#!/bin/bash
rsync -az --delete [email protected]:/var/www/html/ /web/
[root@lisi ~]# chmod +x /opt/rsync.sh
[root@lisi ~]# rm -rf /var/www/html/
[root@lisi ~]# rm -rf /web/*
[root@lisi ~]# ls /web/
[root@lisi ~]# cd /opt/
[root@lisi opt]# ./rsync.sh
[root@lisi opt]# ls /web/
grub
计划备份
[root@lisi opt]# crontab -e
01 3 * * * /opt/rsync.sh & 每天3点10分运行脚本
配置rsync服务器及需要备份的目录,不使用系统用户
[root@root grub]# vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes 禁锢在源目录
address = 192.168.100.100 监听地址
port 873 监听端口
max connections = 5
log file = /var/log/rsyncd.log 日志文件位置
pid file = /var/run/rsyncd.pid 存放进程ID的文件位置
lock file = /var/run/rsync.lock
hosts allow = 192.168.100.0/24 允许访问的客户机地址
[wwwroot]
path = /var/www/html/
comment = Document Root of mail.benet.com
read only = yes 是否为只读
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z 同步时不再压缩的文件类型
auth users = back 授权账户
secrets file = /etc/rsyncd_users.db 存放账户信息的数据文件
根据上述操作,创建账号数据文件,添加一行用户记录,以冒号分隔,虚拟账户名称”back”密码”abc123”
[root@root grub]# grep db /etc/rsyncd.conf
secrets file = /etc/rsyncd_users.db
[root@root grub]# vim /etc/rsyncd_users.db
back:abc123 设置密码
[root@root grub]# ssh 192.168.100.200
[email protected]'s password:
Last login: Fri Aug 28 14:45:18 2015 from 192.168.100.100
[root@lisi ~]# rsync -azP [email protected]::wwwroot /web/
Password: 输入back密码
receiving incremental file list
sent 58 bytes received 440 bytes 110.67 bytes/sec
total size is 255280 speedup is 512.61
[root@lisi ~]# rm -rf /web/* 删除备份文件
[root@lisi ~]# rsync -azP [email protected]::wwwroot /web/
Password:
./
@ERROR: auth failed on module wwwroot
rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]
[root@lisi ~]# ls /web/
[root@lisi ~]# rsync -azP [email protected]::wwwroot /web/ 开始备份
[root@lisi ~]# ls /web/
Grub
在192.168.100.200上输入变量,无需交互密码
[root@lisi ~]# export RSYNC_PASSWORD=abc123 在192.168.100.100上输入变量,无需交互密码
[root@lisi ~]# rm -rf /web/*
[root@lisi ~]# rsync -azP [email protected]::wwwroot /web/
receiving incremental file list
・・・ ・・・省略
sent 352 bytes received 148758 bytes 298220.00 bytes/sec
total size is 255280 speedup is 1.71
进行rsync+inotify实时同步
[root@lisi ~]# cd /proc/sys/fs/inotify/
[root@lisi inotify]# ls
max_queued_events max_user_instances max_user_watches
[root@lisi inotify]# vim /etc/sysctl.conf 配合inotify触发备份、调整内核参数
# Kernel sysctl configuration file for Red Hat Linux
・・・ ・・・省略
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
fs.inotify.max_queued_events = 16384 监控事件的队列
fs.inotify.max_user_instances = 1024 最多监控实例数
fs.inotify.max_user_watches = 1048576 每个实例最多监控文件数
[root@lisi inotify]# sysctl -p 立即生效
[root@root grub]# mkdir /abc 创建文件夹
[root@root grub]# cd /abc
通过软件工具直接将所需安装包移动到客户端中然后进行解压缩。
[root@root abc]# ls
inotify-tools-3.14.tar.gz
[root@root abc]# tar zxvf inotify-tools-3.14.tar.gz 解压改软件
[root@root abc]# mv inotify-tools-3.14 /opt
[root@root abc]# cd /opt/inotify-tools-3.14/
[root@root inotify-tools-3.14]# yum -y install gcc gcc-c++ 手工编译安装
[root@root inotify-tools-3.14]# ./configure
[root@root inotify-tools-3.14]# make && make install
进行监测
[root@root inotify-tools-3.14]#inotifywait -mrq -e modify,create,move,delete /var/www/html/
Inotifywait可监控、modify:修改、 create:创建、 move:移动、 delete:删除等操作。
在另打开一个连接,并创建一个文件
在回到监测的连接中,查看。你可以对里面进行创建、删除等操作。