运维必备!Linux运维远程传输文件命令详解

2022-05-30 00:00:00 文件 目录 目标 主机 同步

文本目录

  • rsync命令介绍

  • rsync命令特性

  • rsync常用参数

  • rsync基础使用

  • rsync排除文件

  • rsync远程同步

  • rsync增量备份

  • rsync双向同步

企业数据存储需求



在企业里数据是重要的,因此需要将数据做好保存和备份,以此来避免由于一些特殊原因从而导致的数据丢失等严重问题。

这时可以考虑做一套 rsync + inotify 组成的文件实时双向自动同步功能

rsync 介绍

rsync 是远程(或本地)复制和同步文件常用的命令。借助 rsync 命令,你可以跨目录,跨磁盘和跨网络远程与本地数据进行复制和同步

举例来说:在两台Linux主机之间进行数据备份和镜像。本文介绍在Linux主机上进行远程和本地传输文件的常见用法,不需要root账户也可以允许rsync

rsync特性

  1. 高效地复制同步数据到对端,或者对端到本地

  2. 支持复制链接、设备、属主、属组、权限

  3. rsync 使用远程更新协议  remote-update protocol  ,这允许仅仅传输两组文件之间的差异

  4. Rsync消耗较少的带宽,它使用压缩和解压缩方法,同时发送和接收数据

rsync同步基本说明

rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,但不能实现远程路径1到远程路径2之间的同步。

不考虑rsync的实现细节,就文件同步而言,涉及了源文件和目标文件的概念,还涉及了以哪边文件为同步基准。

例如,想让目标主机上的文件和本地文件保持同步,则是以本地文件为同步基准,将本地文件作为源文件推送到目标主机上。

反之,如果想让本地主机上的文件和目标主机上的文件保持同步,则目标主机上的文件为同步基准,实现方式是将目标主机上的文件作为源文件拉取到本地。

当然,要保持本地的两个文件相互同步,rsync也一样能实现,这就像Linux中cp命令一样,以本地某文件作为源,另一文件作为目标文件,但请注意,虽然rsync和cp能达到相同的目的,但它们的实现方式是不一样的。

既然是文件同步,在同步过程中必然会涉及到源和目标两文件之间版本控制的问题,例如是否要删除源主机上没有但目标上多出来的文件,目标文件比源文件更新(newer than source)时是否仍要保持同步,遇到软链接时是拷贝软链接本身还是拷贝软链接所指向的文件,目标文件已存在时是否要先对其做个备份等等。

rsync同步过程中由两部分模式组成:决定哪些文件需要同步的检查模式以及文件同步时的同步模式。

  1. 检查模式是指按照指定规则来检查哪些文件需要被同步,例如哪些文件是明确被排除不传输的。

    默认情况下,rsync使用"quick check"算法快速检查源文件和目标文件的大小、mtime(修改时间)是否一致,如果不一致则需要传输。

    当然,也可以通过在rsync命令行中指定某些选项来改变quick check的检查模式。

    rsync支持非常多的选项,其中检查模式的自定义性是非常有弹性的。

  2. 同步模式是指在文件确定要被同步后,在同步过程发生之前要做哪些额外工作。

    例如上文所说的是否要先删除源主机上没有但目标主机上有的文件,是否要先备份已存在的目标文件,是否要追踪链接文件等额外操作。

    rsync也提供非常多的选项使得同步模式变得更具弹性。

相对来说,为rsync手动指定同步模式的选项更常见一些,只有在有特殊需求时才指定检查模式,因为大多数检查模式选项都可能会影响rsync的性能。

rsync三种工作方式

  1. 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

  2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

  3. 本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

前两者的本质是通过管道通信,即使是远程shell。而方式3则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。


常用参数

基础使用

| -r 参数 

递归拷贝数据,不保留源文件属性

可以作为 cpmv 命令的替代方法,将源目录同步到目标目录


# 针对单个文件

rsync -r /root/test01.txt /tmp

# 针对多个文件

rsync -r /root/test01.txt /root/test02.txt /tmp

| -a 参数 

递归拷贝数据,保留源文件属性

-a 参数可以替代 -r ,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)

由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以 -a 比 -r 更有用


# 针对单个文件

rsync -a /root/test/test01.txt /tmp

# 针对目录下的所有文件

rsync -a /root/test/ /tmp

| --delete 参数 

默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录

它不会使两个目录保持相同,并且不会删除文件

如果要使得目标目录成为源目录的镜像副本,则必须使用 --delete 参数,这将删除只存在于目标目录、不存在于源目录的文件


rsync -av --delete /root/test/ /tmp

排除文件

| --exclude 参数

有时,我们希望同步时排除某些文件或目录,这时可以用 --exclude 参数指定排除模式

注意,rsync 会同步以 " . " 开头的隐藏文件,如果要排除隐藏文件,可以这样写 --exclude=".*"


rsync -av --exclude=".*"  /root/ /tmp

多个排除模式

--exclude="/root/test/*" 为排除该目录下的所有文件,但不包括目录本身


# 利用多个 --exclude 参数

rsync -av --exclude=".*" --exclude="/root/test/*" /root/ /tmp


# 利用 Bash 的大扩号的扩展功能

rsync -av --exclude={".*","/root/test/*"} /root/ /tmp

| --include 参数

用来指定必须同步的文件模式,往往与 --exclude 结合使用


# 指定同步时,排除所有文件,但是不包括以 .txt 结尾的文件

rsync -av --include="*.txt" --exclude='*' /root/ /tmp

远程同步

| SSH 协议

rsync 除了支持本地两个目录之间的同步,也支持远程同步

它可以将本地内容,同步到远程服务器


rsync -avz /root/test/ root@10.0.0.51:/test/

也可以将远程内容同步到本地


rsync -avz root@10.0.0.51:/test/ /root/test/

| rsync 协议

除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用 rsync://协议(默认端口873)进行传输

具体写法是服务器与目标目录之间使用双冒号分隔::


rsync -av /root/test/ 10.0.0.51::module/test/

注意,上面地址中的 module 并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配

如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令


rsync rsync://10.0.0.51

rsync 协议除了使用双冒号,也可以直接用 rsync:// 协议指定地址


rsync -av /root/test/ rsync://10.0.0.51::module/test/

增量备份

rsync 的大特点就是它可以完成增量备份,也就是默认只复制有变动的文件

除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录

具体做法是:

  1. 次同步是全量备份,所有文件在基准目录里面同步一份

  2. 以后每次同步都是增量备份,只同步源目录与基准目录之间有变动的部分

这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接

--link-dest 参数用来指定同步时的基准目录


rsync -a --delete --link-dest test02/path test01/path test03/path

上面命令中,--link-dest 参数指定基准目录 test02/path ,然后源目录 test01/path 跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录 test03/path

那些没变动的文件则会生成硬链接

这个命令的次备份时是全量备份,后面就都是增量备份了

rsync + inotify

| Server端

添加用户


useradd rsync -s /sbin/nologin

创建备份目录


mkdir -p /backup/

chown -R rsync: /backup/

创建身份验证文件


注意:

1、rsync服务是由那个用户启动的,该文件所属用户及用户组必须同启动用户

2、权限必须是600

echo "rsync_backup:123456" >> /etc/rsyncd.passwd

chmod 600 /etc/rsyncd.passwd

rsync配置文件(/etc/rsyncd.conf有直接vi没有直接创建)


# vi /etc/rsyncd.conf

######### 全局配置参数 ##########

port=888

uid = rsync

gid = rsync

use chroot = no

max connections = 200

timeout =300

motd file = /var/rsyncd/rsync.motd

pid file = /var/run/rsyncd.pid

lock file = /var/run/rsync.lock

log file = /var/log/rsyncd.log

dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

 

###########下面指定模块,并设定模块配置参数,可以创建多个模块###########

[backup]

path = /backup/ # 目录必须提前创建

ignore errors

read only = false

write only = false

#list = false

hosts allow = 10.0.0.0/24

auth users = rsync_backup

secrets file = /etc/rsyncd.passwd

启动服务


rsync --daemon

| Client端

免密登录文件


echo "123456" >> /etc/rsyncd.passwd # 只放密码即可

# 通过--password-file=/etc/rsyncd.passwd 指定文件

安装inotify


# 检查是否有安装inotify 如果没有就安装

rpm -qa inotify-tools

yum install inotify-tools –y


# 源码安装

wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

tar -xf inotify-tools-3.14.tar.gz -C /application/

cd /application/inotify-tools-3.14

./configure

make&&make install

ln -s /application/inontify-tools-3.14 /application/inontify 

测试监听路径


inotifywait -mrq --format '%T %w%f' -e creat /backup

# T 是指时间 w 是指路径 f 是指文件  详情看下方参数

总结

在本教程中,我们通过一些示例学习了如何使用 rsync 命令来复制或同步文件/目录。

感谢您的阅读,由于文档整理较费时费力,难免会有疏漏和不妥当地方,敬请谅解。

相关文章