Linux中rsync命令使用方式
一、rsync简介
rsync 是一种高效的文件复制和同步工具,常用于在本地或远程计算机之间同步文件和目录
主要特性:
增量同步:rsync 会检测源和目标文件之间的差异,只传输发生变化的部分,而不是重新传输整个文件。这样就能有效减少数据传输量。
支持远程同步:rsync 可以通过 SSH、RSH 或者 rsync 自身的协议在远程服务器之间传输文件。
文件压缩:可以在传输过程中启用压缩选项,减少网络带宽的使用。
文件权限、时间戳和符号链接的保留:rsync 支持保留文件的权限、时间戳、符号链接等文件属性。
支持排除规则:可以通过排除规则,指定哪些文件或目录不被同步。
支持断点续传:在传输过程中断开连接后,rsync 可以从断点继续传输数据,而不需要重新开始。
二、rsync本地模式和远程模式
1、命令说明
通过rsync的命令,来实现,数据目录A 拷贝到数据目录B
语法:rsync [选项] 源数据 目的数据
2、安装
centos: yum install rsync -y ubuntu: apt-get install rsync
3、命令语法,分几个模式
- 本地模式
rsync 参数 源路径 目标路径
rsync -xxxxx /var/log /tmp
- 远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法1 ,rsync默认走ssh协议
rsync 参数 源路径 user@ip:目标路径
例如:
rsync -avzP /var/log/ root@10.0.0.31:/tmp/
语法2
rsync 参数 源路径 user@ip::目标路径
- 远程模式,拉取方式,拉取别人机器的数据到自己的机器上(下载)
- rsync 参数 user@ip:源路径 目标路径
- rsync 参数 user@ip::源路径目标路径
例如:
rsync -avzP root@10.0.0.31:/var/log/ /tmp/
参数解释:
-v
详细模式输出-a
归档模式,递归的方式传输文件,并保持文件的属性,等同于 -rlptgoD-r
递归拷贝目录-l
保留软链接-p
保留原有权限-t
保留原有时间(修改)-g
保留属组权限-o
保留属主权限-D
等于--devices --specials 表示支持b,c,s,p类型的文件-R
保留相对路径-H
保留硬链接-A
保留ACL策略-e
指定要执行的远程shell命令-E
保留可执行权限-X
保留扩展属性信息 a属性
比较常用的组合参数
rsync -avzP
-a
保持文件原有属性-v
显示传输细节情况-z
对传输数据压缩传输-P
显示文件传输的进度信息
你在命令行里,执行命令,如果喜欢看到命令的执行过程 ,则使用
-avzP
脚本里面?则使用
bash xxx.sh rsync -az
4、本地模式
linux机器本身,数据来回发送
# 后面cp命令可以不用了,用rsync当作cp使用
# /var/log/50G cp /var/log/ /tmp/ touch /var/log/new1.file cp /var/log/ /tmp/
# 用rsync,支持增量备份 # /var/log/50G
rsync -avzP /var/log/ /tmp/ touch /var/log/new1.file rsync -avzP /var/log/ /tmp/
4.1 对文件同步
把本地的的/var/log/messages 文件 拷贝到/opt下 拷贝单个文件 [rsync-41 root ~] # rsync -avzP /var/log/messages /opt sending incremental file list messages 247,040 100% 51.09MB/s 0:00:00 (xfr#1, to-chk=0/1) sent 28,823 bytes received 35 bytes 57,716.00 bytes/sec total size is 247,040 speedup is 8.56 拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多 --bwlimit=10 先生成一个5G文件 dd bs=100M count=50 if=/dev/zero of=/var/log/my_self.log [rsync-41 root ~] # [rsync-41 root ~] # dd bs=100M count=50 if=/dev/zero of=/var/log/my_self.log 50+0 records in 50+0 records out 5242880000 bytes (5.2 GB) copied, 47.1259 s, 111 MB/s rsync -avzP /var/log/my_self.log /opt iotop查看磁盘的读写IO情况 限制单个大文件的传输,速度只给他20M每秒 [rsync-41 root ~] # rsync -avzP --bwlimit=20 /var/log/my_self.log /opt sending incremental file list my_self.log 3,957,981,184 75% 20.12MB/s 0:01:02
4.2 对同步目录(注意语法的区别)
拷贝后的数据,是否携带该目录本身 [rsync-41 root ~] # rsync -avzP /var/log /opt sending incremental file list log/ log/boot.log 8,382 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=53/55) log/boot.log-20241203 8,973 100% 8.56MB/s 0:00:00 (xfr#2, to-chk=52/55) log/boot.log-20250104 16,793 100% 5.34MB/s 0:00:00 (xfr#3, to-chk=51/55) ...... [rsync-41 root ~] # [rsync-41 root ~] # ls -lh /opt/ total 4.9G drwxr-xr-x 7 root root 4.0K Jan 6 11:04 log -rw------- 1 root root 242K Jan 6 10:54 messages -rw-r--r-- 1 root root 4.9G Jan 6 10:55 my_self.log 不拷贝该目录本身,拷贝目录下的数据 [rsync-41 root ~] # rsync -avzP /var/log/ /opt sending incremental file list ./ boot.log 8,382 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=53/55) boot.log-20241203 8,973 100% 8.56MB/s 0:00:00 (xfr#2, to-chk=52/55) boot.log-20250104 ...... [rsync-41 root ~] # ls -lh /opt/ total 4.9G drwxr-xr-x 2 root root 232 Dec 2 16:13 anaconda drwx------ 2 root root 23 Dec 2 16:37 audit -rw------- 1 root root 11K Jan 6 11:04 cron -rw------- 1 root root 21K Jan 4 18:38 cron-20250104 -rw-r--r-- 1 root root 286K Jan 6 10:55 lastlog drwxr-xr-x 7 root root 4.0K Jan 6 11:04 log -rw------- 1 root root 184 Jan 6 10:28 maillog -rw------- 1 root root 564 Jan 4 17:09 maillog-20250104 -rw------- 1 root root 254K Jan 6 11:04 messages -rw------- 1 root root 833K Jan 4 18:37 messages-20250104 -rw-r--r-- 1 root root 4.9G Jan 6 10:55 my_self.log .... 测试文件夹的增量拷贝 [rsync-41 root ~] # mkdir /test1 [rsync-41 root ~] # rsync -avzP /test1/ /test2 sending incremental file list ./ sent 43 bytes received 19 bytes 124.00 bytes/sec total size is 0 speedup is 0.00 [rsync-41 root ~] # echo "123" >/test1/1.png [rsync-41 root ~] # rsync -avzP /test1/ /test2 sending incremental file list ./ 1.png 4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/2) sent 111 bytes received 38 bytes 298.00 bytes/sec total size is 4 speedup is 0.03 [rsync-41 root ~] # ls -lh /test2/ total 4.0K -rw-r--r-- 1 root root 4 Jan 6 11:10 1.png [rsync-41 root ~] #
4.3 无差异化拷贝
使用--delete参数 将目标目录的数据清空,保证完全和源目录的数据一致
[rsync-41 root ~] # ls /test1/ 1.png 2.png 3.png 4.png 5.png [rsync-41 root ~] # [rsync-41 root ~] # ls /test2/ 1.png [rsync-41 root ~] # [rsync-41 root ~] # rsync -azvP --delete /test1/ /test2/ sending incremental file list ./ 1.png 4 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) 2.png 0 100% 0.00kB/s 0:00:00 (xfr#2, to-chk=3/6) 3.png 0 100% 0.00kB/s 0:00:00 (xfr#3, to-chk=2/6) 4.png 0 100% 0.00kB/s 0:00:00 (xfr#4, to-chk=1/6) 5.png 0 100% 0.00kB/s 0:00:00 (xfr#5, to-chk=0/6) sent 319 bytes received 114 bytes 866.00 bytes/sec total size is 4 speedup is 0.01 [rsync-41 root ~] # ls /test1/ 1.png 2.png 3.png 4.png 5.png [rsync-41 root ~] # ls /test2/ 1.png 2.png 3.png 4.png 5.png # rsync拷贝文件夹,携带目录本身 # 把test1目录本身,连带着数据,都拷贝到test2下 rsync -avzP /test1 /test2/ 最终会生成 /test2/test1/ 该文件夹的数据,和源数据目录 /test1是一样的
注:对rsync限速,因为rsync在传输数据时,会占用大量的磁盘IO,以及如果是网络传输的话,占用网络带宽,会导致其他程序受影响
所以rsync这样的备份服务,都是在夜里,凌晨操作,被影响其他程序
--bwlimit
5、远程模式
将/root下的数据,拷贝到/tmp下面
- 把rsync-41 /root下的数据
- 拷贝到 nfs-31 /tmp下
使用rsync命令实现如scp的作用
# PUSH 推送模式,上传模式 把rsync-41 /root下的数据,拷贝到 nfs-31 /tmp下 登录rsync41 用ip形式、再用主机名形式 添加无差异化参数,该参数,慎用!搞清楚了自己在做什么! rsync -avzP --delete /root/ root@172.16.1.31:/tmp/
rsync同步后,nfs-31机器/tmp目录下面文件就变成rsync-41 /root下的数据了
# PULL 拉取模式(需要确定,数据最终放在了哪) # 把rsync-41 /root下的数据,拷贝到 nfs-31 /tmp下 rsync -avzP root@172.16.1.41:/root/ /tmp/
注意:
# 不同主机之间同步数据 --delete rsync -avzP --delete root@172.16.1.41:/root /tmp/ #坑:如果/和一个空目录进行完全同步,那么效果和删根一样 # 坑:传输过程不限速导致带宽被占满 ,--bwlimit=50 远程传输 nfs-31下的 /tmp/2G.log 备份到 rsync-41的/opt下 rsync -avzP /tmp/2G.log root@172.16.1.41:/opt
-a
保持文件原有属性-v
显示传输过程-z
压缩传输数据-P
显示传输进度
远程备份文件,并重命名
远程传输 nfs-31下的 /tmp/2G.log 备份到 rsync-41的/opt下,且是无差异化备份 等于清空原有/opt下的数据 [nfs-31 root ~] # rsync -avzP /tmp/2G.log root@172.16.1.41:/opt/2G.log root@172.16.1.41's password: sending incremental file list 2G.log 0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) sent 84 bytes received 35 bytes 47.60 bytes/sec total size is 0 speedup is 0.00 [nfs-31 root ~] # [rsync-41 root ~] # ls /opt/ vmware-network.3.log vmware-network.3.log2 [rsync-41 root ~] # [rsync-41 root ~] # [rsync-41 root ~] # ls anaconda-ks.cfg network.sh
三、rsync服务模式-服务端配置
1、为什么需要服务模式
Rsync 借助 SSH 协议同步数据存在的缺陷:
(1).使用系统用户(不安全) /etc/passwd
(2).使用普通用户(会导致权限不足情况) 3.守护进程传输方式: rsync 自身非常重要的功能(不使用系统用户,更加安全)
2、修改rsync配置文件
[rsync-41 root ~] # vim /etc/rsyncd.conf uid = www gid = www port = 873 fake super = yes use chroot = no max connections = 200 timeout = 600 ignore errors read only = false list = false auth users = rsync_backup secrets file = /etc/rsync.passwd log file = /var/log/rsyncd.log ##################################### [backup] comment = niumait.cn about rsync path = /backup [data] comment = this is secord backup dir,to website data.. path = /data
3、创建用户和数据目录
根据配置文件中定义的信息,创建对应的用户,备份的目录 该无法登录的用户,只是用于运行进程的账户 useradd -u 1000 -M -s /sbin/nologin www 创建配置文件中定义的2个备份目录 mkdir -p /data/ /backup [rsync-41 root ~] # useradd -u 1000 -M -s /sbin/nologin www [rsync-41 root ~] # [rsync-41 root ~] # mkdir -p /data /backup [rsync-41 root ~] # [rsync-41 root ~] # chown -R www:www /data/ [rsync-41 root ~] # chown -R www:www /backup/ [rsync-41 root ~] # ll -d /data/ /backup/ drwxr-xr-x 2 www www 6 Jan 6 14:01 /backup/ drwxr-xr-x 2 www www 6 Jan 6 14:01 /data/ [rsync-41 root ~] #
4、创建rsync专用的账号密码
(这一步很重要,如果后面有错基本也是来这排查)
1.创建密码文件,写入账户和密码,用于和客户端连接时候的认证 vim /etc/rsync.passwd 2.写入账户密码 [rsync-41 root ~] # cat /etc/rsync.passwd rsync_backup:niuma666 3.待会客户端向rsync服务器推送数据,就得用这个账号密码!!!! 4.这一步,非常重要,rsync要求降低密码文件的权限,且必须是600 [rsync-41 root ~] # chmod 600 /etc/rsync.passwd [rsync-41 root ~] # ll /etc/rsync.passwd -rw------- 1 root root 22 Jan 6 14:05 /etc/rsync.passwd
5、设置开机自启动
设置rsyncd服务,运行,且开机自启 [rsync-41 root ~] # systemctl start rsyncd [rsync-41 root ~] # systemctl status rsyncd ● rsyncd.service - fast remote file copy program daemon Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; disabled; vendor preset: disabled) Active: active (running) since Mon 2025-01-06 14:11:28 CST; 12s ago Main PID: 3686 (rsync) CGroup: /system.slice/rsyncd.service └─3686 /usr/bin/rsync --daemon --no-detach Jan 06 14:11:28 rsync-41 systemd[1]: Started fast remote file copy program daemon. Jan 06 14:11:28 rsync-41 rsyncd[3686]: params.c:Parameter() - Ignoring badly formed line in conf...rors Jan 06 14:11:28 rsync-41 rsyncd[3686]: rsyncd version 3.1.2 starting, listening on port 873 Hint: Some lines were ellipsized, use -l to show in full. [rsync-41 root ~] # [rsync-41 root ~] # systemctl enable rsyncd Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service. 检查服务进程是否运行 [rsync-41 root ~] # ps -ef|grep 'rsync' | grep -v 'grep' root 3686 1 0 14:11 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [rsync-41 root ~] # [rsync-41 root ~] # netstat -tunlp|grep rsync tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3686/rsync tcp6 0 0 :::873 :::* LISTEN 3686/rsync
四、rsync服务模式-客户端配置
1、安装rsync
2、配置密码文件及授权
非交互式密码的操作,如下2个方法 1. 生成密码文件,每次连接都指定这个密码文件(在客户端生成) [nfs-31 root ~] # cat /etc/rsync.passwd niuma666 还必须降低密码文件的权限才行,必须是600 [nfs-31 root ~] # chmod 600 /etc/my_rsync.pwd [rsync-41 root ~] # ll /etc/rsync.passwd -rw------- 1 root root 22 Jan 6 14:05 /etc/rsync.passwd [nfs-31 root ~] # rsync -avzP --password-file=/etc/rsync.passwd test.tar.gz rsync_backup@rsync-41::bac p sending incremental file list test.tar.gz 10,240 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) sent 123 bytes received 43 bytes 332.00 bytes/sec total size is 10,240 speedup is 61.69 2. 生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的值,是配置文件中的密码即可 [nfs-31 root ~] # tail -1 .bashrc export RSYNC_PASSWORD="niuma666" [nfs-31 root ~] # rsync -avzP test.tar.gz rsync_backup@rsync-41::backup sending incremental file list test.tar.gz 10,240 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) sent 123 bytes received 43 bytes 332.00 bytes/sec total size is 10,240 speedup is 61.69 [nfs-31 root ~] # rsync -avzP test.tar.gz rsync_backup@rsync-41::data sending incremental file list test.tar.gz 10,240 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1) sent 123 bytes received 43 bytes 332.00 bytes/sec total size is 10,240 speedup is 61.69
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Linux 详解 /var/log/xferlog的各个字段解析
这篇文章主要介绍了Linux 详解 /var/log/xferlog的各个字段解析的相关资料,需要的朋友可以参考下2017-05-05
最新评论