在linux系统中,对文件或者目录的拷贝、备份等是很重要的基础工作。Rsync 是一个非常强大的工具,可以帮助我们高效地完成同步文件和目录任务,其支持断点续传,可以本地拷贝也可以远程拷贝,特别适合在网络不稳定或者传输大文件的场景。本文主要介绍rsync对目录及文件本地同步、异地同步、删除文件的案例。
rsync基本语法
语法: rsync 选项 [源目录] [目标目录]
-a 表示归档模式,即递归复制、保持符号链接、权限、时间戳、组、所有者和设备
-v 表示详细模式,会显示更多的信息
-z 表示在传输时压缩数据
--partial 保留部分传输的文件,断点续传时会继续
--progress 显示传输进度
--dry-run (-n) 只测试,预演,不实际同步
--checksum 比较文件的校验
--bwlimit 限速 (单位KB/s)
前置条件
大部分linux发行版都预安装的有rsync这个工具,你可以使用此命令“rpm -qa | grep rsync”查看是否安装。
如果未查询到安装包,需要进行安装,方法如下:
Debian/Ubuntu: apt install rsync
CentOS/RHEL: yum install rsync
也可以使用rpm包或者源代码安装。
本地目录同步
本地同步就是在本机上不同目录进行同步(目录可以在任意磁盘或者分区上),因为rsync是基于文件系统的目录和文件拷贝,所以跟目录所在分区的文件系统类型无关。
我这里的系统在根目录下分别使用t2目录作为源同步目录,d2目录作为目标同步目录。
(示例一)/t2目录下有5个txt文件,/d2目录下是空的。
命令:rsync -avzv --partial /t2/ /d2/ (注意t2目录名称后面有“/”)
请注意!上面这条命令的源目录t2后面有“/”表示同步t2目录下的子目录或者文件。
(示例二)同步整个t2目录到d2目录下
如果是“rsync -avzv --partial /t2 /d2/ ”(注意t2目录名称后面没有“/”),是把整个t2目录都同步到d2目录下(包含t2目录名本身),如下:
请注意!请注意!同步命令里面包含“--partial”参数,表示支持断点续传,如果你要断点续传一定要加这个参数,rsync默认是不启用断点续传的。
(示例三)排除某个文件或者目录
这里演示排除文件“3.txt”不同步,命令:rsync -avzv --partial --exclude="3.txt" /t2/ /d2/(注意t2目录名称后面有“/”)
(示例四) 删除目标目录中多余的文件
这里演示目标d2目录中原来已经存在“test.txt”文件,在执行同步命令中添加“--delete”参数会把目标目录原有文件删除掉,只保留源目录t2同步过来的文件。
命令:rsync -avz --partial --delete /t2/ /d2/ (注意t2目录名称后面有“/”)
(示例五)在实际同步前测试命令效果(不实际同步)
命令:rsync -avz --dry-run --partial /t2/ /d2/ (注意t2目录名称后面有“/”)
也可以是用 “-n”参数,等同于“--dry-run”
异地同步目录(采用ssh方式)
在两个不同的linux系统间同步目录,采用ssh方式。
使用一台Almalinux作为同步源,根目录下的/t2目录,t2目录中有5个txt文件。
使用一台Rockylinux作为目标, 根目录下的/test目录,目录为空。
请注意,异地目录同步和本地同步的参数一样,只是多了“-e”参数用于指定ssh执行,我这里只演示其中基本的目录同步,其余的示例请参考以上其他示例内容即可。
(示例六)将Almalinux的/t2目录下的内容同步到Rockylinux的/test目录下
命令:rsync -avz --partial -e "ssh -p 50022" /t2/ root@172.18.5.248:/test/
“-e”参数用于指定“ssh”,请结合实际指定ssh的端口号
再到Rockylinux的/test目录下有同步过来的文件
rsync作为服务端守护进程模式
以上的示例,是在本地或者异地(两台主机)间的目录同步,都是一对一的目录同步。如果你的网络中有多台主机需要向同一台主机请求目录同步,可以将其配置为服务端。
(示例七)我这里使用一台Almalinux作为同步源(服务端),根目录下有t2目录;一台Rockylinux作为目标(客户端),根目录下有test目录:
在需要配置为rsync服务端的Almalinux系统上启用rsync服务:
首先配置rsync服务的配置文件/etc/rsyncd.conf,我这里的配置如下:
[root@almalinux t2]# cat /etc/rsyncd.conf | grep -v ^$ | grep -v ^#
uid = nobody #启动服务的用户
gid = nobody # 启动服务的用户组
use chroot = yes #限定在指定目录里
max connections = 4 # 最大的连接数
pid file = /var/run/rsyncd.pid # 服务运行的pid文件
exclude = lost+found/ #排除某个目录
transfer logging = yes #传输日志
timeout = 900 #超时时间
lock file = /var/run/rsync.lock #锁文件,确保并发数据一致性
log file = /var/log/rsyncd.log #日志文件
hosts allow = 172.18.5.0/24 #允许访问的客户端IP
[rs] #模块名称,可以随意命名,很重要,非常重要!
path = /t2 #服务端共享的目录,被客户端同步的目录,很重要!
comment = rsync test #描述
auth users = rs #允许访问的客户端用户名称,要在服务端创建这个用户
secrets file = /etc/rsyncd.secrets #用户的密码文件
其次创建用户rs: useradd rs -M
最后创建/etc/rsyncd.secrets密码文件(这个文件存放rsync用户的名称和密码)
touch /etc/rsync.secrets
将用户rs和密码(密码自定义,我这里配置123456)写入/etc/rsyncd.secrets文件
echo "rs:123456" >> /etc/rsyncd.secrets
对/etc/rsyncd.secrets 权限进行修改(很重要,必须修改,否责后续客户端无法访问)
chmod 600 /etc/rsyncd.secrets
启动命令: rsync --daemon (也可以使用systemctl管理)
在客户端Rockylinux上配置目录同步请求(请求将服务端的t2目录下的内容同步过来)
rsync -avz --partial rs@172.18.5.245::rs /test
请注意:
在ip地址后面有两个冒号“::”
rs@172.18.5.245::rs (左边的rs是在服务端创建的用户,右边的rs是/etc/rsyncd.conf里的模块名称)
关于采用服务端守护进程模式进行rsync异地同步目录添加各种参数,可以在以上的示例自行添加,这里就不再复述。
使用rsync删除大量文件
你是否会遇到过linux系统某些服务日志异常,导致产生大量文件,比如一个目录里面有百万个文件,这种情况很容易导致文件系统inode数量占用率高、容量占用率高等问题,如果使用传统的rm -rf 就会删除失败并报错,类似这样“-bash: /bin/rm: Argument list too long” 。
(示例八) 下面我们模拟一下环境,比如在根目录下的rr目录,我们创建100万个txt文件,如下:
seq 1 1000000 | xargs -I {} touch "{}.txt",随后使用rm -rf *这种方式删除文件会报错。
使用rsync对/rr目录下的100万个txt文件进行删除,方法如下:
首先创建一个空目录(这个目录随意创建),我这里在根目录下创建一个null目录
命令:
rsync --delete-before -d /null/ /rr/ (请注意,目录名称后面要有“/”)
使用这种方法的前提是要先建立一个空目录多这么这一步。
总结
以上内容列举了使用rsync本地同步目录、异地同步目录、删除大量文件的示例,我们再把核心要点总结一下:
1. rsync默认是根据目录下文件的大小、时间戳对源目录和目标目录进行比对后执行同步操作,如果要更精确到文件内容的变更同步,需要加上“--checksum”参数(但加上checksum参数后,相对来说同步效率要慢点)。
2. rsync默认不会启用断点续传功能,需要加上“ --partial”这个参数。
3. rsync的使用场景有很多,比如数据备份、服务器之间的数据同步、大文件数据迁移、系统灾备和镜像等,并且支持断点续传、增量传输,通过灵活的参数配置,甚至对较差的网络环境提高数据传输有很大的作用。