rsync虚拟环境远程备份
前言:
我们说 做人要留一手 以备不时之需 而对于数据来说 备份同时也很重要 我们常说的备份工具很多 FTP Samba 再不然 CP都可以 我们这篇文档说的rsync也是一个很好的备份工具
这篇文章可能有点乱
基本介绍
rsync
是一个功能强大的文件同步和复制工具,常用于 Linux、Unix 系统,也可在 Windows 上使用(需借助 Cygwin 或 Windows Subsystem for Linux)。它的主要特点是通过 增量传输 算法高效地同步文件,只复制源和目标之间有差异的部分,大大节省时间和带宽。
核心功能
- 增量同步:仅传输文件变化的部分,而非整个文件。
- 远程同步:支持通过 SSH 或 rsync 守护进程远程操作。
- 保留文件属性:可保留权限、时间戳、所有者等元数据。
- 递归复制:递归处理目录和子目录。
- 压缩传输:传输前自动压缩数据,适合低速网络。
- 排除规则:支持忽略特定文件或目录。
配置文件位置与结构
- 主配置文件:通常位于
/etc/rsyncd.conf
(Linux/Unix)。 - 模块定义:配置文件由多个
[module]
块组成,每个块定义一个独立的同步目录。
核心配置参数
以下是常用参数及其说明:
全局参数
ini
# 全局配置
uid = nobody # 运行 rsync 的用户
gid = nobody # 运行 rsync 的组
use chroot = yes # 限制在模块路径内(安全增强)
max connections = 4 # 最大并发连接数
syslog facility = local5 # 日志记录位置
pid file = /var/run/rsyncd.pid # 进程 ID 文件
address = 192.168.10.1 #主机IP
port = 873 #端口
模块参数
ini
[module_name] # 模块名称(客户端通过此名称访问)
path = /data/module_name # 实际路径
comment = Backup Service # 模块描述
read only = yes # 是否只读(yes/no)
list = yes # 是否允许列出模块(yes/no)
auth users = username # 允许访问的用户(需配合 rsyncd.secrets)
secrets file = /etc/rsyncd.secrets # 密码文件路径
hosts allow = 192.168.1.0/24 # 允许访问的 IP 范围
hosts deny = * # 拒绝其他所有 IP
密码文件配置
-
创建密码文件(例如
/etc/rsyncd.secrets
):
iniusername:password
-
设置权限:
bashchmod 600 /etc/rsyncd.secrets
完整示例配置
ini
# /etc/rsyncd.conf
# 全局配置
uid = nobody
gid = nobody
use chroot = yes
max connections = 10
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
# 备份模块
[backup]
path = /data/backup
comment = Home Directory Backup
read only = no
list = yes
auth users = backup_user
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24
# 网站文件模块
[www]
path = /var/www/html
comment = Web Server Files
read only = yes
list = yes
auth users = web_user
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.0/24, 10.0.0.0/8
客户端连接示例
使用上述配置后,客户端可以通过以下方式连接:
bash
# 从远程服务器复制到本地
rsync -avz user@remote:/path/to/source/ /path/to/destination/
# 从本地复制到远程服务器
rsync -avz /path/to/source/ user@remote:/path/to/destination/
# 使用模块名访问
rsync -avz 用户@192.168.10.1::backup/ /local/destination/
# 通过 SSH 访问(无需配置文件,直接用路径)
rsync -avz -e ssh backup_user@server:/data/backup/ /local/destination/
#将什么备份到哪
选项详解
-
-a
(archive mode,归档模式)- 功能:递归复制目录,并保留几乎所有文件属性(如权限、时间戳、所有者、链接等)。
- 等价于:
-rlptgoD
(递归、保留符号链接、时间戳、权限、组、所有者、设备文件等)。 - 常见用途:用于完整备份,确保目标与源完全一致。
-
-v
(verbose,详细模式)-
功能:显示详细的传输进度和文件列表,便于监控同步过程。
-
输出示例:
plaintextsending incremental file list ./ file1.txt 123 100% 0.00kB/s 0:00:00 (xfer#1, to-check=1/3) dir/ dir/file2.txt 456 100% 0.44kB/s 0:00:00 (xfer#2, to-check=0/3)
-
-
-z
(compress,压缩传输)- 功能:在传输前对文件进行压缩,减少网络传输的数据量。
- 适用场景:适用于带宽有限的远程同步(如通过 SSH 跨网络传输)。
- 注意:压缩会增加 CPU 开销,本地同步时通常无需使用。
无密码备份
(多用在脚本中)
要实现 rsync
无密码(密钥认证)同步,需要配置 SSH 密钥对认证。以下是详细步骤:
步骤 1:生成 SSH 密钥对(本地执行)
bash
# 生成 RSA 密钥对(按提示回车即可,无需输入密码)
ssh-keygen -t rsa -b 4096
# 连续按三次回车,默认会生成:
# - 私钥:~/.ssh/id_rsa
# - 公钥:~/.ssh/id_rsa.pub
步骤 2:复制公钥到远程服务器(本地执行)
bash
# 使用 ssh-copy-id 工具自动复制公钥
ssh-copy-id rsync@192.168.10.1
# 输入远程用户的密码(仅需输入一次)
# 成功后会显示类似:
# Number of key(s) added: 1
步骤 3:验证无密码登录(本地执行)
bash
ssh rsync@192.168.10.1
# 如果配置成功,将直接登录,无需输入密码
步骤 4:使用密钥认证的 rsync 命令
bash
# 方式一:通过 SSH 协议(推荐)
rsync -avz -e ssh /http/hehe rsync@192.168.10.1:back
# 方式二:通过 rsync 协议(需服务器配置 rsync 守护进程)
rsync -avz /http/hehe rsync@192.168.10.1::back/
但我们发现 “:”和“::”的区别
在 rsync 中,::
和 :
两种语法的差异,本质上是 rsync 两种工作模式的区别,导致目标路径的解析方式完全不同,这也是你观察到 “路径归属用户不同” 的核心原因。
两种语法对应的工作模式
rsync 有两种主要的文件传输模式,分别对应 ::
和 :
两种路径写法:
语法格式 | 工作模式 | 路径解析逻辑 |
---|---|---|
user@host::module/path | rsync 守护进程模式 | 依赖远程主机上的 rsyncd 服务(需提前配置 rsyncd.conf ),路径基于配置的模块定义。 |
user@host:path | SSH 模式 | 通过 SSH 协议传输,路径是远程主机上 user 用户的家目录下的相对路径(或绝对路径)。 |
具体差异:为什么路径归属用户不同?
**(1)** ::
语法:rsync 守护进程模式
-
场景:使用
rsync@192.168.10.1::back
时,back
是 rsync 守护进程配置的 “模块名” ,而非实际目录。 -
路径解析:
-
远程主机需提前通过
rsyncd.conf
配置模块back
,例如:
ini[back] path = /root/back # 模块对应的实际路径(这里配置为 root 用户的 /root/back) comment = Backup module uid = root # 运行该模块的用户(决定文件权限归属) gid = root auth users = rsync # 允许访问的用户 secrets file = /etc/rsyncd.secrets # 密码文件
-
此时
rsync@192.168.10.1::back
实际指向的是path
字段定义的/root/back
,路径归属由模块配置的uid
决定(例子中是 root)。
-
-
核心:路径由
rsyncd.conf
中模块的path
和uid
强制指定,与登录用户(rsync
)无关。
**(2)** :
语法:SSH 模式
-
场景:使用
rsync@192.168.10.1:back
时,依赖 SSH 协议传输,无需rsyncd
服务。 -
路径解析:
-
back
是远程rsync
用户的 家目录下的相对路径(等价于~rsync/back
,即/home/rsync/back
,假设rsync
用户的家目录是/home/rsync
)。 - 如果写绝对路径(如
rsync@192.168.10.1:/back
),则直接指向远程主机的/back
目录,与用户家目录无关。
-
-
核心:路径基于 SSH 登录的用户(
rsync
)的家目录解析,权限受该用户的系统权限限制。
3. 总结:为什么 “归属用户” 不同?
- 当使用
::
时:路径由远程rsyncd
服务的模块配置(rsyncd.conf
中的path
和uid
)决定,可能指向 root 或其他用户的目录,与登录用户(rsync
)无关。 - 当使用
:
时:路径默认是 SSH 登录用户(rsync
)的家目录下的路径,归属该用户(除非写绝对路径)。
这就是为什么两种语法会导致目标路径 “归属不同用户”—— 本质是工作模式和路径解析逻辑的根本差异。
高级配置:SSH 配置文件(可选)
在本地 ~/.ssh/config
中添加服务器配置,简化命令:
bash
# 创建或编辑配置文件
vim ~/.ssh/config
# 添加以下内容:
Host backup-server
HostName 192.168.10.1
User rsync
IdentityFile ~/.ssh/id_rsa # 指定私钥路径
之后可以使用别名代替完整地址:
bash
rsync -avz /http/hehe backup-server:/path/to/backup/
使用脚本自动化备份
人类因为懒发明出了自动化 那么我们可以通过自动化脚本备份去自动备份
要实现自动化备份,你可以结合 inotify-tools
(用于监控文件变化)和 rsync
(用于同步文件)。以下是具体实现方案:
步骤 1:安装 inotify-tools
yum install -y inotify-tools
tar-zxf inotify-tools-3.14.tar.gz-C /usr/src/
cd /usr/src/inotify-tools-3.14/
./configuremake && make install
inotifywait命令参数
-m 持续监控
-r 递归模式,监控子目录中的一切
-q 输出信息简化
-e 要监控的事件[modify(修改)、create(创建)、move(移动)、delete(删除)、attrib(属性更改)]
大家会发现 他会卡住进程 然后汇报情况 那么思考一下 怎么样才能做到 “同步数据”呢?
监控命令
inotifywait -mrq -e modify,create,move,delete /http/hehe
命令参数解析
-
-m
:持续监控模式(而非监控一次就退出)。 -
-r
:递归监控目录下的所有子目录和文件。 -
-q
:静默模式,只输出事件信息,不显示监控启动等冗余信息。 -
-e modify,create,move,delete
:指定需要监控的事件类型:-
modify
:文件内容被修改 -
create
:创建新文件或目录 -
move
:文件或目录被移动(包括重命名) -
delete
:文件或目录被删除
-
传输命令
rsync -avz -e ssh /hehe/ rsync@192.168.10.2::back/
自动化脚本:
最简单
#!/bin/bash
jk="inotifywait -mrg -e create, move, delete, modify /hehe/"
bf=" rsync -avz --delete -e ssh /hehe/ rsycn@192. 168. 10. 2: back"
<span class="katex--inline"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi><mi>k</mi><mi mathvariant="normal">∣</mi><mi>w</mi><mi>h</mi><mi>i</mi><mi>l</mi><mi>e</mi><mi>r</mi><mi>e</mi><mi>a</mi><mi>d</mi><mi>f</mi><mi>w</mi><mi>a</mi><mi>d</mi><mi>o</mi></mrow><annotation encoding="application/x-tex">jk | while read f w a
do
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"><span class="mord mathnormal" style="margin-right:0.03148em;">jk</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">hi</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">ere</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.10764em;">df</span><span class="mord mathnormal" style="margin-right:0.02691em;">w</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span><span class="mord mathnormal">o</span></span></span></span></span>bf
done
</span>
作用
通过 inotifywait
实时监控本地 /hehe/
目录的文件变化(包括创建、移动、删除、修改),一旦检测到变化,就自动通过 rsync
和 SSH 协议将该目录同步到远程服务器 192.168.10.2
上 hbb
用户的 back
目录(默认是 rsync 的家目录下的 back
文件夹)
解释:
-
while read f w a
-
while read
用于循环读取管道传递过来的内容(即inotifywait
监控到的事件信息)。 -
f
、w
、a
是三个变量,用于接收每行事件信息的三个部分:-
f
:发生变化的目录路径(例如/hehe/
或/hehe/subdir/
)。 -
w
:发生的事件类型(例如CREATE
、MODIFY
、DELETE
等)。 -
a
:受影响的文件名(例如file.txt
、image.jpg
)。
-
-
-
do bfdone</code></strong></p><ul><li><code>do</code>和<code>done</code>是循环体的开始和结束标记。</li><li><code>bf done</code></strong></p> <ul> <li><code>do</code> 和 <code>done</code> 是循环体的开始和结束标记。</li> <li><code>bfdone</code></strong></p><ul><li><code>do</code>和<code>done</code>是循环体的开始和结束标记。</li><li><code>bf
是之前定义的变量,代表rsync
同步命令(例如rsync -avz --delete -e ssh /hehe/ hbb@192.168.10.2:back
)。 - 意思是:每当
inotifywait
检测到目录变化(产生一行事件信息),就执行一次同步命令。
通俗理解
整个逻辑可以简单描述为:
“持续监控 /hehe/
目录,一旦有文件创建、修改、移动或删除,就自动执行一次同步操作,把最新的文件同步到远程服务器”。
总结
自动化是人类的一大智慧结晶 在实际生产环境中 自动化备份可以提高服务器的冗余功能 当然 AI是个好东西 想深入了解可以去根据博主的这篇文章 去自己学习 这篇文章我已经尽力了 希望可以帮到大家