当前位置: 首页 > article >正文

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

以上就是rsync的基本使用方法,如有错误请各位大佬多多指正😁😁


http://www.kler.cn/a/472032.html

相关文章:

  • 使用python将多个Excel表合并成一个表
  • LAMP搭建
  • jenkins入门12-- 权限管理
  • 计算机网络之---有线网络的传输介质
  • 十年后LabVIEW编程知识是否会过时?
  • 支付宝手机网站支付
  • Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin
  • 『SQLite』如何使用索引来查询数据?
  • matlab编写Newton插值多项式
  • 旷视科技C++面试题及参考答案
  • 关于FPGA中添加FIR IP核(采用了GOWIN EDA)
  • 使用宝塔面板,安装 Nginx、MySQL 和 Node.js
  • 后端Java开发:第十天
  • 【Linux】进程概念(PCB)与进程创建(fork)
  • 策略模式(Stragety Pattern)
  • PostgreSQL 运维的难与“难” --上海PG大会主题记录
  • Cloudflare IP 优选工具:轻松找到最快的 CDN 节点
  • Unity 3D游戏开发从入门进阶到高级
  • 【蓝桥真题练习】蓝桥杯 2021 国赛 A 组 E 题
  • 云商城--业务+架构学习和环境准备
  • php 多进程那点事,用 swoole 如何解决呢 ?
  • 【Cocos TypeScript 零基础 5.1】
  • win下搭建elk并集成springboot
  • 未来趋势:电商平台API接口的智能化与自动化发展
  • MYSQL----------MySQL权限管理
  • get和post有什么区别