rsycn的使用

rsycn的使用

rsync 文件同步命令使用

一、rsync介绍

Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录。

Rsync 是用于取代rcp的一个工具,Rsync使用所谓的 “Rsync 算法” 来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。您可以参考 How Rsync Works A Practical Overview 进一步了解 rsync 的运作机制。

Rsync 的初始作者是 Andrew Tridgell 和 Paul Mackerras,它当前由http://rsync.samba.org维护。

Rsync的基本特点如下:

  1. 可以镜像保存整个目录树和文件系统;
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;
  3. 无须特殊权限即可安装;
  4. 优化的流程,文件传输效率高;
  5. 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
  6. 支持匿名传输,以方便进行网站镜像。

在使用rsync进行远程同步时,可以使用两种方式:远程Shell方式(建议使用ssh,用户验证由 ssh 负责)和C/S方式(即客户连接远程rsync服务器,用户验证由rsync服务器负责)。

无论本地同步目录还是远程同步数据,首次运行时将会把全部文件拷贝一次,以后再运行时将只拷贝有变化的文件(对于新文件)或文件的变化部分(对于原有文件)。

rsync在首次复制时没有速度优势,速度不如tar,因此当数据量很大时您可以考虑先使用tar进行首次复制,然后再使用rsync进行数据同步。

二、服务器信息

腾讯云轻量应用服务器

  • CPU:2核
  • 内存:4G
  • 外存:SSD 80G
  • 带宽:8M
  • 流量:1200G/月(只算出流量)
  • 系统:Ubuntu 20.04.3 LTS

三、服务器安装服务

通常来说服务器都自带了rsync服务,可使用rsycn --version命令检测软件是否纯在,如没有可使用如下命令安装。

1
sudo apt-get install rsync

四、rsync启动配置

4.1 写配置文件

  • 首先要选择服务器启动方式
    • 对于负荷较重的rsync服务器应该使用独立运行方式
    • 对于负荷较轻的rsync服务器可以使用xinetd运行方式
  • 创建配置文件rsyncd.conf
  • 对于非匿名访问的rsync服务器还要创建认证口令文件

4.2 以xinetd方式启动

xinetd是一个超级守护进程

xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。

xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。

本服务器采用的启用方式

4.2.1 安装xinetd

如果在/etc/下没有xinetd.d目录,则没安装xinetd,需要执行一下命令安装。

1
sudo apt-get install xinetd

4.2.2 配置xinetd使rsync开始工作

安装完毕后,创建/etc/xinetd.d/rsync配置文件,并且编辑

1
2
sudo touch /etc/xinetd.d/rsync
sudo vim /etc/xinetd.d/rsync
1
2
3
4
5
6
7
8
9
10
11
12
13
service rsync
{
disable = no
socket_type = stream
wait = no
user = root

# 放置rsync软件的具体位置
server = /usr/bin/rsync

server_args = --daemon
log_on_failure += USERID
}

:wq退出保存。

4.2.3 启动rsync作为使用xinetd的守护进程

1
sudo vim /etc/default/rsync

rsync默认配置

主要修改:RSYNC ENABLE=inetd,使用xinetd启用

4.2.4 添加专门管理备份文件夹目录的用户rsyncAdmin

1
sudo useradd -d /home/rsyncDir -m rsyncAdmin

这样就在home目录生成rsyncDir,并且由rsyncAdmin管理。

4.2.5 创建 /etc/rsync/rsyncd.conf 配置rsync使其在

1
2
3
sudo touch /etc/rsync/rsyncd.conf
sudo ln -s /etc/rsync/rsyncd.conf /etc/rsyncd.conf
sudo vim /etc/rsyncd.conf

编辑里面的内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 管理备份目录的用户
uid = rsyncAdmin

# 管理备份目录的用户组
gid = rsyncAdmin

# 安全功能,数据是否锁定到备份目录
use chroot = yes

# 并发连接,同时多少客户端访问
max connections = 2

# 超时时间。
timeout = 600

# 进程号所在文件
pid file = /var/run/rsyncd.pid

# 锁文件
lock file = /var/run/rsyncd.lock

# 日志文件,查看报错等
log file = /var/log/rsync.log

# 忽略错误
ignore errors

# 可写
read only = false

# 不允许列表
list = false

# 哪些主机可以访问。
# hosts allow = 172.16.1.0/24

# 哪些主机不允许访问。
# hosts deny = 0.0.0.0/32

# 欢迎信息
motd file = /etc/rsyncd/rsyncd.motd

# 存放密码的文件:格式:用户名:密码,权限必须600
secrets file = /etc/rsync/rsyncd.secrets

# [模块名]远程访问使用模块名访问,名字可以自己随便取
[lab_backup]
# 说明注释
comment = Welcome to backup server!

# 远程虚拟连接用户
auth users = lab

# 服务端用户备份的目录
path = /home/rsyncDir/

# 不压缩
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

# 排除文件
exclude = *.Ds_Store

4.2.6 创建 /etc/rsync/rsyncd.secrets 配置用户名和密码.

1
sudo vim /etc/rsync/rsyncd.secrets

注意用以下格式命名虚拟用户名和密码

<user_name>:<password>

保存退出后设置好权限:

1
sudo chmod 600 /etc/rsync/rsyncd.secrets

4.2.7 启动

1
sudo /etc/init.d/xinetd restart

检查是否开始监听端口:

1
netstat -an | grep 873

若有信息输出且显示LISTEN,则正在监听

检查是否能连接使用

1
rsync lab@xxx.xxx.xxx.xxx::lab_backup # 然后输入之前设定的密码

有目录列出则成功

4.2.8 腾讯云服务器开放端口

添加规则处添加873的tcp端口。

开放端口

4.3 独立运行 rsync 服务

最简单的独立运行 rsync 服务的方法是执行如下的命令:

1
/usr/bin/rsync --daemon

此方式启动需要修改/etc/default/rsync文件,允许--daemon启动:

RSYNC_ENABLE=false
改为
RSYNC_ENABLE=true

否则在启动时报错:

1
rsync daemon not enabled in /etc/default/rsync, not starting... ... (warning).

五、客户端使用

5.1 Mac OS动安装rsycn

因为mac系统自带的rsycn版本比较古老,需要安装新一点版本的,这里采用手动编译安装的方式。

截止2022/3/11版本最新,若有更新版本,则需要修改下述中curl链接中的版本号

随便打开一个工作目录,例如家目录/home/User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
cd ~;
curl -OL https://github.com/Cyan4973/xxHash/archive/v0.8.0.tar.gz;
tar -xvf v0.8.0.tar.gz;
cd xxHash-0.8.0;
make -j4;
sudo make install;

cd ~;
curl -OL https://github.com/lz4/lz4/archive/v1.9.3.tar.gz;
tar -xvf v1.9.3.tar.gz;
cd lz4-1.9.3;
make -j4;
sudo make install;

cd ~;
curl -OL https://www.openssl.org/source/openssl-1.1.1k.tar.gz;
tar -xvf openssl-1.1.1k.tar.gz;
cd openssl-1.1.1k ;
./config; # 注意这里是config
make -j4;
sudo make install;

cd ~;
curl -OL https://github.com/facebook/zstd/archive/v1.5.0.tar.gz;
tar -xvf v1.5.0.tar.gz;
cd zstd-1.5.0 ;
make -j4;
sudo make install;

cd ~;
curl -OL https://rsync.samba.org/ftp/rsync/src/rsync-3.2.3.tar.gz;
tar -xvf rsync-3.2.3.tar.gz;
cd rsync-3.2.3;
./configure; # 注意这里是configure
make -j4;
sudo make install;

软件最终安装在/usr/local/bin目录下,而原系统预安装的在/usr/bin

使用/usr/local/bin/rsync --version即可验证是否安装陈工

为了方便直接使用rsync命令,可在~/.bashrc或者~/.zshrc加入

1
alias rsync /usr/local/bin/rsync

然后source ~/.bashrc~/.zshrc

因为最后的安装脚本没有考虑到需要删除原来Mac OS X自带的rsync.1 man文件,所以需要删除旧版本的man文件。

1
sudo rm /usr/share/man/man1/rsync.1.gz

5.2 Ubuntu安装rsycn

1
sudo apt-get install rsycn

5.3 本地“推”上服务器

5.3.1 语法1:

rsync [OPTION …] [SRC] [USER]@[HOST]::[DEST] …
rsync命令 参数选项 [本机路径] [虚拟用户]@[主机地址]::[模块名]…

5.3.2 语法2:

rsync [OPTION …] [SRC] rsync://[USER]@[HOST]/[DEST] …
rsync命令 参数选项 [本地路径] rsync://[虚拟用户]@[主机地址]/[模块名]..

5.3.3 用法举例

1
rsync -avzP --delete --exclude "*.DS_Store" . lab@175.178.73.244::lab_backup/实验室文件

注: 这个命令的意思就是说,用lab用户登录到服务器上,把当前文件夹中的数据,同步到服务器目录实验室文件/下。当服务器没有实验室文件/这个目录时,系统会自动创建一个;当存在实验室文件/这个目录中,要注意它的写权限。并且文件本地对服务器要完全一致(本地删了服务器也要删除对应文件),排除本地*.DS_Store文件。

参数:

  • -a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
  • -z 传输时压缩;
  • -P 传输进度;
  • -v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档
  • –delete 表示服务器端上的数据要与客户端完全一致
  • –exclude “.DS_Store” 排除本地`.DS_Store`文件

5.4 服务器“拉”回本地

5.4.1 语法1:

rsync [OPTION…] [USER@]HOST::SRC… [DEST]
rsync命令 参数选项 [本机路径] [虚拟用户]@[主机地址]::[模块名]…

5.4.2 语法2:

rsync [OPTION…] rsync://[USER@]HOST[:PORT]/SRC… [DEST]
rsync命令 参数选项 [本地路径] rsync://[虚拟用户]@[主机地址]/[模块名]..

注意–delete要慎用!!!我试过因为路径没写好的问题删了自己本地的一堆文件,幸好git救了我。血的教训啊!

六、OPTION参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能。
--remove-source-files:要求删除源端已经成功传输的文件。

七、定时忘服务器同步

7.1 MAC OS

7.1.1 运行cron

1
2
3
sudo /usr/sbin/cron start
sudo /usr/sbin/cron restart
sudo /usr/sbin/cron status

运行后有cron: cron already running, pid: 1169显示。

7.1.2 创建密码文件

1
2
3
mkdir /Users/<Username>/.rsync
vim /Users/<Username>/.rsync/rsync.password # 编辑输入密码
chmod 600 /Users/<Username>/.rsync/rsync.password

7.1.3 创建定时任务

1
2
3
4
5
6
crontab -e

# 输入以下文本,rsync.exclude是提前写好的排除文件
16 10 * * * cd /Users/<Username>/Documents/lab && rsync -rtz --delete --exclude-from="rsync.exclude" --password-file="/Users/<Username>/.rsync/rsync.password" --log-format="[\%t] \%o \%f \%b" ./ lab@175.178.73.244::lab_backup/lab/ >> /Users/<Username>/.rsync/rsync.log 2>&1

30 22 * * * cd /Users/<Username>/Documents/lab && rsync -rtuz --exclude-from="rsync.exclude" --password-file="/Users/<Username>/.rsync/rsync.password" --log-format="[\%t] \%o \%f \%b" lab@175.178.73.244::lab_backup/lab/ ./ >> /Users/<Username>/.rsync/rsync.log 2>&1

保存退出,crontab: installing new crontab则成功加入列表。

crontab -l查看列表。

语义:每天凌晨0点10分打开目标路径后执行同步服务器指令

7.1.4 大坑

百分号问题
1
man 5 crontab

Percent-signs (%) in the command,
unless escaped with backslash (\), will be changed into newline charac-
ters, and all data after the first % will be sent to the command as
standard input.

大概意思是说
在cron文件的第六列,也就是命令列
百分号(%)被赋予了特殊含义
被看做是换行符,而且,其后面的内容被当做命令的标准输入

所以,要想正常使用百分号(%)的功能
需要在其前面添加转义符(\)

环境变量问题

Unix/Linux下使用crontab时的运行环境已经不是用户环境了,因此原本用户下的一些环境变量的设置就失效了。

/etc/crontab文件定义的系统cron环境变量,默认的PATH/sbin:/bin:/usr/sbin:/usr/bin

在写脚本的时候,最好加上:

1
2
3
#!/bin/bash
source /etc/profile
export LANG=en_US.UTF-8 # 支持中文(其实上面那个应该包含了)
cron权限问题

在设置里“完全磁盘访问权”加上cron软件,在/usr/sbin下。

7.2 Ubuntu 20.04 TLS

7.2.1 运行cron

1
2
3
4
5
6
7
安装:apt-get install cron
启动:service cron start
重启:service cron restart
停止:service cron stop
检查状态:service cron status
查询cron可用的命令:service cron
检查Cronta工具是否安装:crontab -l

运行后有* cron is running显示。

7.2.2 创建密码文件

1
2
3
mkdir ~/.rsync
vim ~/.rsync/rsync.password # 编辑输入密码
chmod 600 ~/.rsync/rsync.password

7.2.3 创建定时任务

1
2
3
4
5
# 第一次使用crontab -e会提示选择编辑器,用vim.basic
crontab -e

# 输入以下文本,rsync.exclude是提前写好的排除文件
10 22 * * * cd /mnt/d/lab/ && rsync -rtvzP --delete --exclude-from="rsync.exclude" --password-file="~/.rsync/rsync.password" --log-format="[\%t] \%o \%f \%b" ./ lab@XXX.XXX.XXX.XXX::lab_backup/lab/ > /dev/null 2>&1

保存退出,crontab: installing new crontab则成功加入列表。

crontab -l查看列表。

语义:每天晚上10点10分打开目标路径后执行同步服务器

参考资料

  1. rsync服务器的安装与配置
  2. Mac OS X:升级rsync和同步应用实例
  3. rsync(一):基本命令和用法
  4. mac手动编译安装rsync
  5. Ubuntu下crontab的安装和使用
  6. Linux crontab 命令
  7. man rsync翻译(rsync命令中文手册)
  8. 手把手教你crontab排障

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×