开发者

Linux中rsync命令使用方式

开发者 https://www.devze.com 2025-03-21 11:15 出处:网络 作者: likeyou~coucou
目录一、rsync简介二、rsync本地模式和远程模式1、命令说明2、安装3、命令语法,分几个模式4、本地模式4.1 对文件同步4.2 对同步目录(注意语法的区别)4.3 无差异化拷贝5、远程模式三、rsync服务模式-服务端配置1、
目录
  • 一、rsync简介
  • 二、rsync本地模式和远程模式
    • 1、命令说明
    • 2、安装
    • 3、命令语法,分几个模式
    • 4、本地模式
      • 4.1 对文件同步
      • 4.2 对同步目录(注意语法的区别)
      • 4.3 无差异化拷贝
    • 5、远程模式
    • 三、rsync服务模式-服务端配置
      • 1、为什么需要服务模式
        • 2、修改rsync配置文件
          • 3、创建用户和数据目录
            • 4、创建rsync专用的账号密码
              • 5、设置开机自启动
              • 四、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

                  Linux中rsync命令使用方式

                  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/

                  Linux中rsync命令使用方式

                  rsync同步后,nfs-31机器/tmp目录下面文件就变成rsync-41 /root下的数据了

                  Linux中rsync命令使用方式

                  # PULL 拉取模式(需要确定,数据最终放在了哪)
                  # 把rsync-41 /root下的数据,拷贝到 nfs-31 /tmp下
                  
                  rsync -avzP root@172.16.1.41:/root/ /tmp/

                  Linux中rsync命令使用方式

                  Linux中rsync命令使用方式

                  注意:

                  # 不同主机之间同步数据 --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/pythonrsync.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 startinpythong, 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 ~]javascript # 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 http://www.devze.combytes  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中rsync命令使用方式

                  总结

                  以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

                  0

                  精彩评论

                  暂无评论...
                  验证码 换一张
                  取 消

                  关注公众号