linux中的数据备份工具——rsync

    技术2025-09-18  67

    rsync是什么?

    rsync是可以实现全量和增量的本地或远程数据同步备份工具。配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。适用于unix,linux,windows等多种操作系统。

    简介:

    rsync具有本地和远程两台主机之间数据快速复制同步镜像,远程备份功能。从同步效率上看,rsync更胜一筹。

    rsync相当于scp,cp,rm。但是优于每一个,因为他们只能每次拷贝完整的数据,不能实现增量备份,而rsync可以。rsync同步镜像时,通过具有独特的“quick check”算法: 仅同步大小或者最后修改时间发生变化的文件或目录也可根据权限和属主等属性的变化进行同步,要加上相应参数可同步同一文件内增加的内容

    rsync三种工作方式:

    单个本机之间数据传输,类似于cp命令。借助rcp,ssh通道传输数据,类似于scp。以守护进程(socket)方式传输数据。
    本地传输模式

    语法:rsync [-option] souce destation

    常用选项:

    -v显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息-P显示文件传输的进度信息-a --archive归档模式,表示递归传输并保持文件属性。-r --recursive递归到目录中去。-t --times保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新 :检查出mtime不同从而导致增量传输无效。-o --owner保持owner属性(属主)。-g --group保持group属性(属组)。-p --perms保持perms属性(权限,不包括特殊权限)。-D是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。-l --links如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。-z传输时进行压缩提高效率。–delete以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端执行的,所以它是在-e指定所要使用的远程shell程序,默认为ssh。

    例:

    将/etc目录备份到当前目录,备份过来的是etc目录 rsync -azvP /etc ./ 将/etc目录下内容备份到当前目录,备份过来的是etc目录下文件 rsync -azvP /etc ./ -azv选项备份,个属性不变 当前参数只同步增量 [root@fei /]# cd /etc/ [root@fei etc]# touch aaa [root@fei etc]# cd /tmp/ [root@fei tmp]# rsync -azvP /etc ./ sending incremental file list etc/ etc/aaa 0 100% 0.00kB/s 0:00:00 (xfr#1, ir-chk=1182/1192) sent 54,058 bytes received 656 bytes 109,428.00 bytes/sec total size is 31,229,214 speedup is 570.77
    借助ssh通道在不同主机之间传输数据
    打包当前机器/etc发送到192.168.126.131主机/tmp目录下。 rsync -azvP -e 'ssh -p 22' /etc root@192.168.126.131:/tmp -e :指定协议,默认ssh,可以不用指定 反之则可以拉取 rsync -azvP -e 'ssh -p 22' root@192.168.126.131:/etc /tmp

    以守护进程(socket)方式传输数据

    搭建环境:

    配置服务端:

    确认安装rsync------rpm -qa rsync修改配置文件------/etc/rsyncd.conf uid = root gid = root use chroot = no #程序安全设置 max connections = 4 #指定最大连接数量 pid file = /var/run/rsyncd.pid #指定pid文件 lock file = /var/run/rsync.lock #进程锁 log file = /var/log/rsyncd.log #指定日志文件 timeout = 300 #超时时间 [backup] #定义一个backup模块 path = /backup/ #指定使用的共享目录 ignore errors #有错误时忽略 read only = false #可读写? list = false #阻止远程列表(不允许远程查看服务器) hosts allow = 192.168.126.0/24 #允许ip hosts deny = 0.0.0.0/32 #阻止ip auth users = rsync_backup #指定虚拟用户名 secrets file = /etc/rsync.password #指定密码文件 创建共享目录,创建rsync用户 useradd -M -s /sbin/nologin rsync mkdir /backup/ #此处应该与配置文件中指定的相同(path) 启动服务 rsync --daemon natstat -tualpn |grep rsync #检查是否启动 更改共享目录属主属组以及权限 chown -R rsync:rsync /backup/ #将共享目录属组,属主改为rsync chmod -R 755 /backup/ 创建虚拟账户和密码存入指定文件 echo " rsync_backup:111111" > /etc/rsync.password #将虚拟用户和密码存指定文件,该文件与配置文件中指定保持相同(secrets.file) chmod 600 /etc/rsync.password 将服务加入到开机启动项 echo "rsync --daemon " >> /etc/rc.local 重启服务 pkill rsync #关闭 rsync --deamon

    配置客户端

    只需要创建密码文件即可

    echo " 111111" > /etc/rsync.password #此处不用写入虚拟用户 chmod 600 /etc/rsync.password

    到此处环境搭建完毕


    所有的传输命令都由客户端发起

    推送测试:

    rsync -zav /tmp rsync_backup@192.168.126.131::backup --password-file=/etc/rsync.password #将本地/tmp目录推送到服务器的共享目录 #::backup --》指定模块,不是文件名(在配置文件中定义的)。一定用两个冒号 #--password-file=/etc/rsync.password :指定密码,避免交互输入、 #利用ssh远程连接检查 [root@fei tmp]# ssh root@192.168.126.131 "ls /backup" root@192.168.126.131's password: tmp #备份成功

    拉去测试

    [root@fei ~]# ls #本机/root/目录下文件 anaconda-ks.cfg test.sh #拉去指定目录的指定文件到本机 [root@fei ~]# rsync -zav rsync_backup@192.168.126.131::backup/tmp/test /root/ --password-file=/etc/rsync.password ^C [root@fei ~]# ls anaconda-ks.cfg test test.sh #拉取成功 去除某目录下某文件之后拉取 rsync -zav --exclude=etc rsync_backup@192.168.126.131::backup/tmp/ /root/ --password-file=/etc/rsync.password #拉取共享目录下/tmp下内容,除过etc文件 [root@shisan tmp]# ls #共享目录/tmp下 cutpinglog cutpinglogsh dati2.sh etc pinglog_test test test2.sh test.sh text vmware-root_5934-1002483909 [root@shisan tmp]# pwd /backup/tmp [root@fei ~]# ls #客户机 anaconda-ks.cfg test.sh [root@fei ~]# rsync -zav --exclude=etc rsync_backup@192.168.126.131::backup/tmp/ /root/ --password-file=/etc/rsync.password receiving incremental file list ./ .dati2.sh.swp dati2.sh test.sh test2.sh .ICE-unix/ .Test-unix/ .X11-unix/ .XIM-unix/ .font-unix/ cutpinglog/ cutpinglog/2020-06-23/ cutpinglogsh/ pinglog_test/ test/ test/aa/ test/aa/bb/ test/aa/bb/cc/ text/ text/aa/ text/aa/bb/ text/aa/bb/cc/ vmware-root_5934-1002483909/ sent 198 bytes received 2,466 bytes 5,328.00 bytes/sec total size is 14,030 speedup is 5.27 [root@fei ~]# ls anaconda-ks.cfg cutpinglog cutpinglogsh dati2.sh pinglog_test test test2.sh test.sh text vmware-root_5934-1002483909 若要排除多个 则使用--exclode-from=file.txt 将要排除的文件名写入file.txt文件中 rsync -zav --exclude-file=file.txt rsync_backup@192.168.126.131::backup/tmp/ /root/ --password-file=/etc/rsync.password

    同步测试:

    [root@shisan backup]# ls #服务端,共享目录 tmp 同步1 [root@fei-7 tmp]# rsync -zav --delete rsync_backup@192.168.126.131::backup /tmp/ --password-file=/etc/rsync.password #以共享目录为标准,同步客户机上/tmp目录,使/tmp目录和共享目录内容相同 [root@fei-7 tmp]# ls tmp 同步2 [root@fei-7 tmp]# touch aaa #在客户机同步目录创建文件 [root@fei-7 tmp]# rsync -zav --delete rsync_backup@192.168.126.131::backup /tmp/ --password-file=/etc/rsync.password receiving incremental file list deleting aaa ./ sent 664 bytes received 54,082 bytes 109,492.00 bytes/sec total size is 31,244,729 speedup is 570.72 [root@fei-7 tmp]# ls #由于服务端共享目录没有该文件,所以被删除 tmp 同步3 [root@shisan backup]# touch bbb #在服务端共享目录下创建文件 [root@shisan backup]# ls bbb tmp [root@fei-7 tmp]# ls #客户端同步目录中没有 tmp [root@fei-7 tmp]# rsync -zav --delete rsync_backup@192.168.126.131::backup /tmp/ --password-file=/etc/rsync.password receiving incremental file list ./ bbb #该文件得到同步 sent 687 bytes received 54,150 bytes 36,558.00 bytes/sec total size is 31,244,729 speedup is 569.77 [root@fei-7 tmp]# ls bbb tmp [root@shisan backup]# cat bbb [root@shisan backup]# echo "hello word " > bbb #给服务端中的文件写入内容 [root@shisan backup]# cat bbb hello word [root@fei-7 tmp]# cat bbb [root@fei-7 tmp]# rsync -zav --delete rsync_backup@192.168.126.131::backup/bbb /tmp/bbb --password-file=/etc/rsync.password #从客户端来同步 receiving incremental file list bbb #该文件的到同步 sent 43 bytes received 106 bytes 298.00 bytes/sec total size is 12 speedup is 0.08 [root@fei-7 tmp]# cat bbb #客户机同步成功 hello word 也可以将源和目的调换位置,让服务端来同步客户端 是共享目录内容和客户端保持相同 [root@fei-7 tmp]# rsync -zav --delete /tmp/ rsync_backup@192.168.126.131::backup --password-file=/etc/rsync.password 同步时也可以用排除选项 [root@fei-7 tmp]# rsync -zav --delete --exclode=bbb /tmp/ rsync_backup@192.168.126.131::backup --password-file=/etc/rsync.password - -exclude ( --exclude-file= )指定排除规则来排除不需要传输的文件。- -delete以SRC为主,对DEST进行同步。多则删之,少则补之- -bwlimit=##限制传输速度

    --delete参数较为危险,容易造成本地数据丢失,所以谨慎使用


    rsync向比较scp的优点:

    rsync更适合传输大文件scp更适合传输小而多的文件

    rsync实际应用场景

    rsync+inotify实现全网数据备份。通过打包备份,利用rsync+inotify应用将本地数据存储到一个固定存储服务器上。
    先简单介绍一下inotify

    inotify简介

    inotify:查找发送了改变的文件或者新文件,可以持续检测一个目录中的文件是否发生更改。

    软件inotify-tools有两个组件

    inotifywait:检测一个目录下的文件所发生事件

    inotifywatch:统计所触发的事件的次数

    inotifywait的选项

    -r:递归目录 -q:仅仅打印监控的事件信息 -m:一直处于监控状态[组合使用-mqr] --excludei:排除文件或目录(不区分大小写) --exclude:排除文件或目录(区分大小写) --format:指定输出格式 %w:显示触发监控的事件的所在路径.[%w%f组合使用就能得到文件名] %f:显示触发监控的事件的文件名 %e:显示所触发的事件 %T:显示事件的触发时间 --timefmat:指定输出的时间的格式 -e:指定要监控的事件

    inotify监控的事件

    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

    环境准备

    这里的固定存储服务器就用上边搭建的rsync共享目录,搭建过程相同。 inotfiy客户端环境搭建

    此过程与上边的rsync同步测试试验中,客户端搭建方法相同,只需安装inotify工具即可

    下载inotify应用(需要epel源) 这里我使用了阿里的国内源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@fei-7 yum.repos.d]# ls bak epel.repo [root@fei-7 yum.repos.d]# yum install rsync inotify-tools -y 创建要备份的目录 [root@fei-7 /]# mkdir /datebak 创建密码文件并写入密码,修改文件权限 echo " 111111" > /etc/rsync.password chmod 600 /etc/rsync.password 创建一个自动化监控脚本 [root@fei-7 ~]# cat datebak.sh #!/bin/bash dir="/datebak" remote_host="192.168.126.131" anon_user="rsync_backup" mod_name="backup" pwd_file="/etc/rsync.password" inotifywait -mrq -e create,delete,close_write --format "%w%f" $dir | while read line do rsync -rz --delete $dir $anon_user@$remote_host::$mod_name --password-file=$pwd_file echo "$line" >> /tmp/rsync.log 2>&1 done 实现 放入后台持续运行 nohup sh datebak.sh & 书写计划任务定期执行 0 2 * * * ./etc/profile sh datebak.sh 2>&1/dev/null
    Processed: 0.022, SQL: 9