0基础linux运维教程 安装以及rsync的传输方式与工作模式

莫道桑榆晚,为霞尚满天。这篇文章主要讲述0基础linux运维教程 安装以及rsync的传输方式与工作模式相关的知识,希望能为你提供帮助。
不少同学在安装上总会出现这样那样的问题,不是不兼容就是因为其他的因素影响了安装的进度,本章节主要讲解安装以及rsync的传输方式与工作模式。
三 安装注意,传输的双方都必须安装 rsync

yum install rsync -y

四 rsync的传输方式与工作模式4.1 两种传输方式
1.pull 拉-> 下载
客户端将服务器上的数据下载到本地服务器
问题:如果客户端过多,会对服务端造成压力过大
2.push 推-> 上传
客户端将本地数据上传到服务器
问题:如果客户端过多,上传速度会受到带宽影响,很慢

4.2 两种工作模式
4.2.1 本地模式
1、语法:
命令选项源数据目标地址
rsync [OPTION]... SRC [SRC]... DEST
2、常用选项:rsync支持一百多个选项,所以此处只介绍几个常用选项
-a --archive:归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-z:传输时进行压缩提高效率。
-R:使用相对路径
3、类似于cp命令,又不同于cp
(1)、cp命令只是本地复制,每次cp都会用源文件内容覆盖新文件,所以cp命令会修改文件时间属性,
(2)、rsync可本地可远程,首次rsync与cp一样,后续rsync会对比两个文件的不同,只传输文件更新的部分,如果未更新,则rsync不会修改文件任何属性
4、注意:源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身,这一点本地模式与远程模式均适用

示例1: 拷贝文件
[root@local ~]# rsync /etc/passwd /test

示例2:拷贝文件夹,-r,验证源路径带/后缀与不带后缀的两种情况
[root@local < sub> ]# rsync -r /etc/cron.d /test# 把文件夹cron.d拷贝到/test下
[root@local < /sub> ]# rsync -r /etc/cron.d/ /test# 把文件夹cron.d下的内容拷贝到/test下

实例3:拷贝文件夹,-R,使用相对目录
[root@local < sub> ]# mkdir -p /src/aaa/bbb/ccc
[root@local < /sub> ]# mkdir /dst
[root@local < sub> ]#
[root@local < /sub> ]# rsync -r /src/aaa/bbb/ccc /dst/
[root@local < sub> ]# ls /dst/
ccc
[root@local < /sub> ]#
[root@local < sub> ]# rm -rf /dst/*
[root@local < /sub> ]# rsync -r -R /src/aaa/bbb/ccc /dst/
[root@local < sub> ]# ls /dst/
src
[root@local < /sub> ]# rm -rf /dst/*
[root@local < sub> ]# rsync -r -R /src/./aaa/bbb/ccc /dst/
[root@local < /sub> ]# ls /dst/
aaa
[root@local < sub> ]# rm -rf /dst/*
[root@local < /sub> ]# rsync -r -R /src/aaa/./bbb/ccc /dst/
[root@local < sub> ]# ls /dst/
bbb
[root@local < /sub> ]#

实例3:--backup选项,对目标目录下已经存在的文件做一个备份
[root@remote < sub> ]# mkdir /egon111
[root@remote < /sub> ]# mkdir /egon222
[root@remote < sub> ]#
[root@remote < /sub> ]# echo 111 > /egon111/1.txt
[root@remote < sub> ]# echo 222 > /egon111/2.txt
[root@remote < /sub> ]# echo 333 > /egon111/3.txt
[root@remote < sub> ]#
[root@remote < /sub> ]# echo 666 > /egon222/1.txt
[root@remote < sub> ]# echo 888 > /egon222/2.txt
[root@remote < /sub> ]#
[root@remote < sub> ]# rsync -r --backup /egon111/ /egon222/
[root@remote < /sub> ]# ll /egon222/
总用量 20
-rw-r--r--. 1 root root 4 4月16 13:12 1.txt
-rw-r--r--. 1 root root 4 4月16 13:11 1.txt< sub>
-rw-r--r--. 1 root root 4 4月16 13:12 2.txt
-rw-r--r--. 1 root root 4 4月16 13:11 2.txt< /sub>
-rw-r--r--. 1 root root 4 4月16 13:12 3.txt
[root@remote < sub> ]#
[root@remote < /sub> ]# mkdir /egon222/bak
[root@remote < sub> ]# rsync -r --backup --backup-dir=/egon222/bak /egon111/ /egon222/
[root@remote < /sub> ]# ls /egon222/bak/
1.txt2.txt
[root@remote ~]# tree /egon222/
/egon222/
├── 1.txt
├── 2.txt
├── 3.txt
└── bak
├── 1.txt
└── 2.txt

【0基础linux运维教程 安装以及rsync的传输方式与工作模式】这样在目标目录下,已存在的文件就被做一个备份,备份文件默认使用"~"做后缀,可以使用"--suffix"指定备份后缀,例如
[root@remote ~]# rsync -r --backup --suffix=".bak" /egon111/ /egon222/

可以使用"--backup-dir"指定备份文件保存路径,但要求保存路径必须存在,指定备份路径后,默认将不会加备份后缀,除非使用"--suffix"显式指定后缀,如"--suffix=~"。
[root@remote < sub> ]# mkdir /egon222/bak
[root@remote < /sub> ]# rsync -r --backup --backup-dir=/egon222/bak /egon111/ /egon222/
[root@remote < sub> ]# ls /egon222/bak/
1.txt2.txt
[root@remote < /sub> ]# tree /egon222/
/egon222/
├── 1.txt
├── 2.txt
├── 3.txt
└── bak
├── 1.txt
└── 2.txt

示例4:
=======> 准备文件
[root@www < sub> ]# echo 666 > egon.txt
[root@www < /sub> ]# stat egon.txt
......
最近改动:2021-04-08 20:00:10...
=======> cp每次拷贝都是用新的覆盖旧的,即每次都是全量
[root@www < sub> ]# # 首次拷贝-> 全量
[root@www < /sub> ]# cp -a egon.txt egon111.txt
[root@www < sub> ]# stat egon111.txt
......
最近改动:2021-04-08 20:00:20... ---> 改变
[root@www < /sub> ]#
[root@www < sub> ]#
[root@www < /sub> ]#
[root@www < sub> ]# # 第二次拷贝-> 仍是全量
[root@www < /sub> ]# \\cp -a egon.txt egon111.txt# 加\\开头取消默认提示
[root@www < sub> ]# stat egon111.txt
......
最近改动:2021-04-08 20:00:30... ---> 改变
=======> rsync首次拷贝为全量,后续拷贝如果参照的源内容不变,则不覆盖目标文件
[root@www < /sub> ]# # 首次拷贝-> 全量
[root@www < sub> ]# rsync -az egon.txt egon222.txt
[root@www < /sub> ]# stat egon222.txt
......
最近改动:2021-04-08 20:00:40... ---> 改变
[root@www < sub> ]#
[root@www < /sub> ]#
[root@www < sub> ]#
[root@www < /sub> ]# # 第二次拷贝-> 检测到源文件没有发生变动,则不会覆盖目标文件
[root@www < sub> ]# rsync -az egon.txt egon222.txt
[root@www < /sub> ]# stat egon222.txt
......
最近改动:2021-04-08 20:00:40... ---> 不变
[root@www < sub> ]#
[root@www < /sub> ]#
[root@www < sub> ]#
[root@www < /sub> ]# # 第三次拷贝-> 检测到源文件没有发生变动,则不会覆盖目标文件
[root@www < sub> ]# rsync -az egon.txt egon222.txt
[root@www < /sub> ]# stat egon222.txt
......
最近改动:2021-04-08 20:00:40... ---> 不变

其他选项
# 0、选项-c、--checksum改变rsync的检查方式
默认情况下,rsync基于"quick check"算法只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输; 当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式,比如"--size-only"选项表示"quick check"将仅检查文件大小不同的文件作为待传输文件。
使用-c参数以后,则通过判断文件内容的校验和,决定是否重新传输,增强了数据传输的可靠性但降低了效率,是否使用该选项呢?如果是私网内部传输,网络通常可控且较为稳定,文件完整性通常不会有问题,不需要加-c选项,如果是传到外网,网络不可控且不够稳定,可以考虑加上-c选项增强可靠性,此时需要付出的代价就是效率的降低,用不用请自行斟酌
rsync支持非常多的选项
一些选项控制检查的模式(如-c、--size-only等)、一些选项控制文件同步的模式(例如--delete等)
检查模式决定了哪些文件需要被同步
文件同步模式决定了在文件确定要被同步后、同步过程发生之前要做的额外工作
相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能,例如上面所述-c选项
# 1、选项-n
如果不确定 rsync 执行后会产生什么结果,可以先用`-n`或`--dry-run`参数模拟执行的结果。
rsync -anv source/ destination
上面命令中,-n参数模拟命令执行的结果,并不真的执行命令。-v参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。
# 2、选项--delete
如果要使得目标目录成为源目录的镜像副本,则必须使用`--delete`参数,这将删除只存在于目标目录、不存在于源目录的文件,也就是"多则删之,少则补之"。
[root@www < sub> ]# echo 111 > /aaa/1.txt
[root@www < /sub> ]# echo 222 > /aaa/2.txt
[root@www < sub> ]# echo 333 > /aaa/3.txt
[root@www < /sub> ]# echo 444 > /bbb/4.txt
[root@www < sub> ]#
[root@www < /sub> ]#
[root@www < sub> ]#
[root@www < /sub> ]# rsync -az --delete /aaa/ /bbb/
[root@www ~]# ls /bbb/
1.txt2.txt3.txt
# 3、选项--exclude
有时,我们希望同步时排除某些文件或目录,这时可以用--exclude参数指定排除模式。
$ rsync -av --exclude=\'*.txt\' source/ destination
或者
$ rsync -av --exclude \'*.txt\' source/ destination
上面命令排除了所有 TXT 文件。
注意,rsync 会同步以"点"开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*"。
如果要排除source/下某个子目录里面的所有文件,但不希望排除该子目录本身,可以写成下面这样。
$ rsync -av --exclude \'dir1/*\' source/ destination
多个排除模式,可以用多个--exclude参数。
$ rsync -av --exclude \'file1.txt\' --exclude \'dir1/*\' source/ destination
多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。
$ rsync -av --exclude={\'file1.txt\',\'dir1/*\'} source/ destination
如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件。
$ rsync -av --exclude-from=\'exclude-file.txt\' source/ destination
# 4、选项--include
用来指定必须同步的文件模式,往往与--exclude结合使用。
$ rsync -av --include="[0-9].txt" --exclude=\'*\' source/ destination
上面命令指定同步时,排除所有文件,但是会包括1.txt、2.txt等文件,注意--include必须在--exclude之前

4.2.2 远程模式传输时需要认证远程主机的账号密码,有两种认证方式:ssh认证与守护进程rsync-daemon认证
# 1、ssh协议
(1)在本地与目标主机都安装rsync
(2)远程主机要打开sshd服务
(3)需要用到的账号是远程主机可登录系统账号---》不安全
(4)不受目录限制-------------------------》不安全
# 2、rsync协议
(1)在本地与目标主机都安装rsync
(2)远程主机要打开rsync守护进程
rsync --daemon

systemctl start rsyncd
(3)用到的是虚拟账号,虚拟账号对应的是配置文件中uid的权限,例如:uid=rsync
虚拟账号egon-------> 远端主机真实存在的系统账号rsync
(4)用的是模块名-》具体的目录

4.2.2.1 远程模式之SSH认证基于ssh协议:rsync 默认使用 SSH 进行远程登录和数据传输,详细地说,rsync 在传输数据之前,会先与远端进行一次 ssh 登录认证(采用的是系统账号),因此需要目标主机事先开启ssh服务。
语法:语法类似于scp命令,但备份方案不同于scp(scp 与 cp一样,每次都是全量)
# 拉取
命令选项远程用户@远程主机:远程的目录作为源本地作为目标
rsync [OPTION][USER@]HOST:SRC[DEST]
# 推送
命令选项本地数据作为源远程用户@远程主机:远程的目录作为目标
rsync [OPTION]SRC [SRC]...[USER@]HOST:DEST

示例1:拉取
[root@www < sub> ]# rsync -avz root@192.168.12.17:/data /bak/
......
[root@www < /sub> ]# ls /bak/
data
[root@www < sub> ]# 可以用stat命令查看一下最近改动时间,然后再次执行下行命令
[root@www < /sub> ]# rsync -avz root@192.168.12.17:/data /bak/
[root@www ~]# 此时用stat命令查看一下最近改动时间,与上一次完全相同

示例2:推送
[root@www ~]# rsync -avz /bak root@192.168.12.17:/data/# 推送

由于早期 rsync 不使用 SSH 协议,需要用??-e??参数指定协议,后来才改的。所以,下面??-e ssh??可以省略。
$ rsync -av -e ssh source/ user@remote_host:/destination

但是,如果 ssh 命令有附加的参数,则必须使用??-e??参数指定所要执行的 SSH 命令。
$ rsync -av -e \'ssh -p 8888\' source/ user@remote_host:/destination

上面命令中,??-e??参数指定 SSH 使用2234端口。
4.2.2.2 远程模式之守护进程认证1)守护进程模式之rsync协议
守护进程模式其实也是一种远程模式,只不过采用的是rsync协议传输,
若想采用rsync协议传输,则需要远程主机也安装rsync,并启动rsync守护进程,此时不需要依赖远程主机的sshd服务

2)为什么使用守护进程模式
1.基于ssh的认证,传输时会使用系统用户和密码,不安全,而守护进程模式使用的是虚拟用户和虚拟密码
2.当使用普通用户传输文件时会出现权限不足的情况,而守护进程模式可以解决这个问题

3)如何使用rsync协议传输 在传输时

    推荐阅读