rsync虚拟环境远程备份

rsync虚拟环境远程备份

前言:

我们说 做人要留一手 以备不时之需 而对于数据来说 备份同时也很重要 我们常说的备份工具很多 FTP Samba 再不然 CP都可以 我们这篇文档说的rsync也是一个很好的备份工具

这篇文章可能有点乱

基本介绍

rsync​ 是一个功能强大的文件同步和复制工具,常用于 Linux、Unix 系统,也可在 Windows 上使用(需借助 Cygwin 或 Windows Subsystem for Linux)。它的主要特点是通过 增量传输 算法高效地同步文件,只复制源和目标之间有差异的部分,大大节省时间和带宽。

核心功能

  1. 增量同步:仅传输文件变化的部分,而非整个文件。
  2. 远程同步:支持通过 SSH 或 rsync 守护进程远程操作。
  3. 保留文件属性:可保留权限、时间戳、所有者等元数据。
  4. 递归复制:递归处理目录和子目录。
  5. 压缩传输:传输前自动压缩数据,适合低速网络。
  6. 排除规则:支持忽略特定文件或目录。

配置文件位置与结构

  1. 主配置文件:通常位于 /etc/rsyncd.conf​(Linux/Unix)。
  2. 模块定义:配置文件由多个 [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

密码文件配置

  1. 创建密码文件(例如 /etc/rsyncd.secrets​):
    ini

    username:password
    
  2. 设置权限
    bash

    chmod 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/

#将什么备份到哪

选项详解

  1. -a(archive mode,归档模式)

    • 功能:递归复制目录,并保留几乎所有文件属性(如权限、时间戳、所有者、链接等)。
    • 等价于-rlptgoD​(递归、保留符号链接、时间戳、权限、组、所有者、设备文件等)。
    • 常见用途:用于完整备份,确保目标与源完全一致。
  2. -v(verbose,详细模式)

    • 功能:显示详细的传输进度和文件列表,便于监控同步过程。

    • 输出示例
      plaintext

      sending 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)
      
  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/pathrsync 守护进程模式依赖远程主机上的 rsyncd​ 服务(需提前配置 rsyncd.conf​),路径基于配置的模块定义。
user@host:pathSSH 模式通过 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​ 文件夹)

解释:
  1. while read f w a

    • while read​ 用于循环读取管道传递过来的内容(即 inotifywait​ 监控到的事件信息)。

    • f​、w​、a​ 是三个变量,用于接收每行事件信息的三个部分:

      • f​:发生变化的目录路径(例如 /hehe/​ 或 /hehe/subdir/​)。
      • w​:发生的事件类型(例如 CREATE​、MODIFY​、DELETE​ 等)。
      • a​:受影响的文件名(例如 file.txt​、image.jpg​)。
  2. 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​)。

  3. 意思是:每当 inotifywait检测到目录变化(产生一行事件信息),就执行一次同步命令

通俗理解

整个逻辑可以简单描述为:
持续监控 /hehe/目录,一旦有文件创建、修改、移动或删除,就自动执行一次同步操作,把最新的文件同步到远程服务器”。

总结

自动化是人类的一大智慧结晶 在实际生产环境中 自动化备份可以提高服务器的冗余功能 当然 AI是个好东西 想深入了解可以去根据博主的这篇文章 去自己学习 这篇文章我已经尽力了 希望可以帮到大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值