rsync 远程同步与系统备份恢复

适用环境:RHEL 5 / RHEL 6 / CentOS 系列。 内容覆盖:rsync 的特性、安装与常用选项;本地同步、远程同步(SSH 与 daemon 两种模式)、rsyncd.conf 与密码文件、基于 xinetd 的服务配置、inotify+rsync 实时同步;系统备份的分类、策略与 dump/restore 工具;以及 dd 命令在磁盘克隆、MBR 备份、生成稀疏文件、销毁数据等场景中的用法。文末保留练习。


一、rsync 概述

rsync 是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原有文件的权限、属主、属组、修改时间以及软硬链接等附加信息。

1.1 主要特性

  1. 可以镜像保存整个目录树和文件系统;
  2. 容易保留原有权限、owner、group、修改时间以及软硬链接;
  3. 传输效率高,使用同步算法,只传输发生变化的部分;
  4. 支持匿名传输,方便网站镜像。

1.2 安装

yum install rsync -y

1.3 配置文件

rsync daemon 模式主要涉及三个配置文件(默认不存在,需手动创建):

文件 作用
/etc/rsyncd.conf 主配置文件
/etc/rsyncd.secrets 用户名与密码文件
/etc/rsyncd.motd 客户端连接时显示的欢迎信息

二、rsync 常用选项

选项 含义
-v, --verbose 显示详细输出
-a, --archive 归档模式,等价于 -rlptgoD
-r 递归子目录
-l 保留软链接
-p 保留权限
-t 保留文件修改时间
-g 保留属组
-o 保留属主
-D 等价于 --devices --specials,支持块、字符等特殊设备文件
-R 保留相对路径
-H 保留硬链接
-A 保留 ACL 权限
-X 保留扩展属性
-z 传输时压缩
-e 指定远程 shell,如 ssh
--delete 删除目标目录中源端不存在的文件,使两端完全一致
--password-file 从指定文件读取 daemon 模式密码
--bwlimit 限速(KB/s)
--exclude/--include 排除/包含匹配规则

三、rsync 基本用法

3.1 本地同步

# 将 /home 目录下的内容同步到 /backup(包含隐藏文件)
rsync -av /home/ /backup

路径末尾的 / 非常关键:

  • rsync -av /home/ /backup:同步 /home 目录中的内容到 /backup;
  • rsync -av /home /backup:将 /home 目录本身同步到 /backup/home。

3.2 远程同步(SSH 模式)

默认基于 SSH 传输,无需额外配置 daemon:

# 本地推送到远程
rsync -av /home/ 192.168.1.10:/backup

# 远程拉取到本地
rsync -av 192.168.1.20:/backup/ /backup/

# 指定 SSH 端口与参数
rsync -avz -e "ssh -p 22" /home/ 192.168.1.10:/backup

3.3 镜像同步(删除多余文件)

如果远程目录中有文件在本地已被删除,可加 --delete 使两端完全一致:

rsync -aHAXv --delete /test/ /test2/

--delete 具有破坏性,正式使用前建议先加 -n(--dry-run)做试运行。


四、rsync daemon 模式

SSH 模式依赖远程系统账号;daemon 模式不需要远程 SSH 账号,使用 rsync 自身的虚拟用户与密码文件,便于做网站镜像、脚本化同步。

4.1 服务端配置

第一步:创建主配置文件

vim /etc/rsyncd.conf

最小配置:

motd file = /etc/rsyncd.welcome

[test]
path = /share/150105

创建欢迎信息文件:

vim /etc/rsyncd.welcome
*******************************************
******   ^_^ Welcome to use rsync!  ^_^  ****
*******************************************

第二步:通过 xinetd 启动 rsync

RHEL 6 中 rsync 通常借助 xinetd 托管。编辑:

vim /etc/xinetd.d/rsync

将 disable 与 wait 从 yes 改为 no:

service rsync
{
    disable         = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure += USERID
}

第三步:重启 xinetd 并验证端口

/etc/init.d/xinetd restart
netstat -ntlup | grep 873

输出:

tcp  0  0  0.0.0.0:873  0.0.0.0:*  LISTEN  4080/xinetd

rsync daemon 默认监听 TCP 873。

4.2 客户端访问

# 列出服务器端共享模块(双冒号后跟主机地址)
rsync -v 192.168.1.10::

输出:

*******************************************
******   ^_^ Welcome to use rsync!  ^_^  ****
*******************************************
notes

拉取共享模块到本地:

rsync -a 192.168.1.10::notes /notes/

daemon 模式下,主机与模块名之间使用 两个冒号 ::;未配置认证时匿名访问,便于脚本调用,但需要配合 iptables 等保证安全。

如果出现 permission denied,可能是 SELinux 未关闭:

# 临时切换为警告模式
setenforce 0

# 永久关闭(需重启)
vim /etc/selinux/config
SELINUX=disabled

五、rsyncd.conf 增强配置

针对模块 notes,常见增强需求及对应参数:

需求 xinetd 方式 rsyncd.conf 方式
记录日志到 /var/log/rsyncd.log log_type(SYSLOG/FILE) log file / syslog facility
隐藏共享模块名 - list = false
限制同时只能有 1 个客户端连接 instances max connections
只允许指定 IP 同步 only_from hosts allow
只允许在某时间段同步 access_times -

完整示例:

motd file = /etc/rsyncd.welcome

[notes]
path = /var/www/html
list = false
max connections = 1
log file = /var/log/rsyncd.log
hosts allow = 192.168.1.107 192.168.1.109 192.168.1.0/24

常用 rsyncd.conf 参数:

参数 含义
motd file 欢迎信息文件路径
path 模块对应的同步目录
list 客户端 rsync host:: 时是否显示该模块(false 为隐藏)
max connections 最大并发连接数
log file 日志文件路径
hosts allow / hosts deny 允许/拒绝的 IP 或网段
uid / gid 以哪个身份读写文件(默认 nobody)
read only 是否只读,需要推送时设为 no
auth users 允许访问模块的虚拟用户列表
secrets file 用户名密码文件路径
ignore errors 忽略一些 I/O 错误

六、基于密码文件的远程同步

需求:将 192.168.1.109(本地同步端)上的 /localtest/ 实时同步到 192.168.1.107(远程被同步端)的 /remotetest/。

6.1 远程被同步端(192.168.1.107)

创建同步目录:

mkdir /remotetest/

编辑 rsyncd.conf:

uid = root
gid = root

[testsource]
path = /remotetest/
ignore errors
read only = no
auth users = test
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.1.109

uid/gid 指定为 root,否则默认使用 nobody,需要将目录权限改为 757 才能写入。

创建密码文件,格式为 用户名:密码:

vim /etc/rsyncd.secrets
test:321

出于安全考虑,密码文件权限必须为 600:

chmod 600 /etc/rsyncd.secrets

启用 xinetd 中的 rsync 并启动:

vim /etc/xinetd.d/rsync
# disable = no

/etc/init.d/xinetd restart
chkconfig xinetd on

6.2 本地同步端(192.168.1.109)

创建同步目录:

mkdir /localtest/

本地密码文件只需写密码,用户名通过命令行指定:

vim /etc/rsyncd.secrets
321
chmod 600 /etc/rsyncd.secrets

6.3 手动测试同步

rsync -a --delete --password-file=/etc/rsyncd.secrets \
    /localtest/ test@192.168.1.107::testsource

七、inotify+rsync 实时同步

7.1 实时同步原理

inotify 是 Linux 内核提供的文件系统事件监控机制。inotify-tools 提供两个命令:

  • inotifywait:等待并监控文件系统事件;
  • inotifywatch:统计文件系统事件。

监控源目录一旦发生增、删、改、属性变化等事件,就立即触发 rsync,从而实现实时同步。

7.2 安装 inotify-tools

wget http://ncu.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
tar xzvf inotify-tools-3.13.tar.gz -C /usr/src/
cd /usr/src/inotify-tools-3.13/
./configure
make
make install

安装后产生:

/usr/local/bin/inotifywait
/usr/local/bin/inotifywatch

如果运行出现共享库错误:

error while loading shared libraries: libinotifytools.so.0: cannot open shared object file

将 /usr/local/lib 加入动态链接库缓存:

echo "/usr/local/lib" >> /etc/ld.so.conf
ldconfig

7.3 inotifywait 常用选项

选项 含义
-m, --monitor 持续监控(默认收到一次事件就退出)
-r, --recursive 递归监控子目录
-q, --quiet 安静模式,只输出事件信息
-e, --event 指定监控的事件,如 modify,delete,create,attrib,move

7.4 本机实时同步脚本

监控 /test 目录,发生变化即同步到 /test2:

vim /tmp/1.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /test | while read files
do
    rsync -a --delete /test/ /test2/
done

后台运行:

nohup sh /tmp/1.sh &

对 /test 进行增删改操作,验证 /test2 是否实时同步。

7.5 跨主机实时同步脚本(含密码文件)

在本地同步端(192.168.1.109)创建:

vim /bin/rsync.sh
#!/bin/bash
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /localtest | while read files
do
    rsync -a --delete --password-file=/etc/rsyncd.secrets \
        /localtest/ test@192.168.1.107::testsource
done

赋予执行权限并后台运行:

chmod 755 /bin/rsync.sh
nohup sh /bin/rsync.sh &

加入开机自启:

vim /etc/rc.local
nohup sh /bin/rsync.sh &

测试:在 192.168.1.109 的 /localtest 中做任意操作,到 192.168.1.107 的 /remotetest 中查看是否同步成功。

7.6 双向实时同步

可使用 inotify 在两端各部署一套脚本实现"伪双向",也可使用专门的软件(如 unison)做双向实时同步。


八、系统备份

8.1 什么是系统备份

将系统上的重要数据或系统本身进行备份,防止由于误删除、软硬件故障、灾难等造成数据丢失。

8.2 常用备份工具

工具 说明
cp / scp 本地或远程拷贝,简单直接
rsync 本地/远程同步、增量同步、实时同步
dd 存储最底层的块级拷贝,不依赖文件系统
amanda 最早的开源备份软件之一,支持网络备份
dump / restore Linux 上的分区级备份工具(dump 只能备份整个分区)

8.3 备份分类

类型 说明
完全备份(全备) 备份所有数据
增量备份 只备份自上一次备份(任意级别)以来发生变化的数据
累计增量备份 备份自上一次完全备份(或更低级别)以来所有变化的数据

8.4 备份方式

  1. 本地备份:例如将 /aaa/test 备份为 /bbb/test.bak。本地存储损坏时数据仍会丢失;
  2. 异盘备份:备份到另一块硬盘,预防单盘损坏;
  3. 异地备份(异地容灾):将数据备份到远端机房或数据中心,预防火灾、地震等机房级灾难。

8.5 备份介质

介质 特点
硬盘 随机访问方便,但物理磁头易损,单位容量价格相对较高
磁带 由磁带驱动器与磁带构成,经济、可靠、容量大、适合顺序读写的大规模归档

九、使用 dump/restore 制定备份策略

9.1 安装 dump

yum install -y dump

9.2 dump 常用选项

选项 含义
-0..-9 备份层级,0 为完全备份,1-9 为不同级别的增量备份
-f <文件> 指定备份文件的存放路径与文件名
-u 备份完成后在 /etc/dumpdates 中记录文件系统、层级、日期与时间(仅对整个分区备份有效,备份单个目录或文件不需要)

9.3 备份策略示例

典型策略:周一全备,周二、周三增量,周四累计增量,周五、周六增量,周日累计增量。

星期 一 二 三 四 五 六 日 一
备份方式 全 增 增 累 增 增 累 全
备份层级 0 1 2 1 2 3 2 0

对应命令:

# 周一:完全备份
dump -0u /dev/sda8 -f /backup/sda8_0_1.dump
# 周二:增量(相对于周一 0 级)
dump -1u /dev/sda8 -f /backup/sda8_1_2.dump
# 周三:增量(相对于周二 1 级)
dump -2u /dev/sda8 -f /backup/sda8_2_3.dump
# 周四:累计增量(相对于周一 0 级)
dump -1u /dev/sda8 -f /backup/sda8_1_4.dump
# 周五:增量(相对于周四 1 级)
dump -2u /dev/sda8 -f /backup/sda8_2_5.dump
# 周六:增量(相对于周五 2 级)
dump -3u /dev/sda8 -f /backup/sda8_3_6.dump
# 周日:累计增量(相对于周一 0 级)
dump -2u /dev/sda8 -f /backup/sda8_2_7.dump

命令格式示意:

dump  -1u  /dev/sda8         -f  /backup/sda8_1_4.dump
 ↑     ↑    ↑                ↑   ↑
备份  选项  待备份设备/分区   选项 备份文件路径

9.4 查看备份文件内容

restore -t -f /backup/sda8_0_1.dump

9.5 自动备份脚本

每天一个脚本的方式(注意会覆盖上一周同名文件):

# /tmp/1.sh(周一)
dump -0u /dev/sda8 -f /backup/sda8_0_1.dump

# /tmp/2.sh(周二)
dump -1u /dev/sda8 -f /backup/sda8_1_2.dump

为避免覆盖,按日期命名:

# /tmp/1.sh(周一)
mkdir -p /backup/`date +%Y%m%d`
dump -0u /dev/sda8 -f /backup/`date +%Y%m%d`/sda8_0_1.dump

# /tmp/2.sh(周二)
dump -1u /dev/sda8 -f /backup/`date -d "-1 days" +%Y%m%d`/sda8_1_2.dump

更优做法是一个脚本通过 date +%A 判断星期几:

vim /tmp/10.sh
#!/bin/bash
day=`date +%A`

case "$day" in
    Monday)
        mkdir -p /backup/`date +%Y%m%d`
        dump -0u /dev/sda8 -f /backup/`date +%Y%m%d`/sda8_0_1.dump
        ;;
    Tuesday)
        dump -1u /dev/sda8 -f /backup/`date -d "-1 days" +%Y%m%d`/sda8_1_2.dump
        ;;
    Wednesday)
        dump -2u /dev/sda8 -f /backup/`date -d "-2 days" +%Y%m%d`/sda8_2_3.dump
        ;;
    Thursday)
        dump -1u /dev/sda8 -f /backup/`date -d "-3 days" +%Y%m%d`/sda8_1_4.dump
        ;;
    Friday)
        dump -2u /dev/sda8 -f /backup/`date -d "-4 days" +%Y%m%d`/sda8_2_5.dump
        ;;
    Saturday)
        dump -3u /dev/sda8 -f /backup/`date -d "-5 days" +%Y%m%d`/sda8_3_6.dump
        ;;
    Sunday)
        dump -2u /dev/sda8 -f /backup/`date -d "-6 days" +%Y%m%d`/sda8_2_7.dump
        ;;
    *)
        echo "日期有误"
esac

在 /etc/crontab 中加入定时任务,每天凌晨 2:01 执行:

01 2 * * *   root   sh /tmp/10.sh

9.6 恢复备份

恢复需按备份层级顺序进行(先 0 级,再依次恢复增量):

cd /dump
restore -r -f /backup/sda8_0_1.dump
ls
# dump0  lost+found  restoresymtable

restore -r -f /backup/sda8_1_4.dump
ls
# dump0  dump1  dump2  dump3  lost+found  restoresymtable

restoresymtable 是 restore 在增量恢复时用于传递状态的临时文件,恢复完成后可删除。

9.7 备份实施流程

  1. 分析待备份数据,评估并设计备份策略(工具、频率、是否增量/累计增量、保留周期);
  2. 根据策略编写备份脚本;
  3. 使用 crontab//etc/crontab 配置定时任务,并加上备份成功/失败的通知(邮件、短信等)。

十、dd 命令

10.1 作用与原理

dd 用于按指定大小拷贝文件,并可在拷贝过程中进行转换。它工作在 块设备层,可以直接读写物理卷,不依赖文件系统。

Linux 存储栈大致分为五层:

应用程序 → 虚拟文件系统(VFS) → 文件系统 → 设备驱动 → 物理卷

dd 直接作用于设备驱动/物理卷层,因此能做磁盘对拷、MBR 备份等底层操作。

10.2 常用参数

参数 含义
if=<文件> 输入文件(input file),如 /dev/sda、/dev/zero
of=<文件> 输出文件(output file)
bs=<大小> 块大小(block size),一次读写多少字节,可使用 K/M/G 单位
count=<块数> 仅拷贝前 N 个块
skip=<块数> 从输入文件开头跳过 N 个块再开始读
seek=<块数> 从输出文件开头跳过 N 个块再开始写(产生稀疏文件)
conv=<参数> 转换参数,如 notrunc(不截断输出文件)

10.3 典型用法

1. 备份与恢复 MBR

MBR 位于磁盘开头的 512 字节(446 字节引导程序 + 64 字节分区表 + 2 字节标志)。

# 备份 MBR
dd if=/dev/sda of=/backup/mbr.backup bs=1 count=512

# 破坏 MBR(危险!会清掉分区表,df -h 将看不到分区)
dd if=/dev/zero of=/dev/sda bs=1 count=512

# 从备份恢复 MBR
dd if=/backup/mbr.backup of=/dev/sda

2. 整块磁盘克隆

# 将 sda 整盘克隆到 sdb(要求 sdb 容量不小于 sda)
dd if=/dev/sda of=/dev/sdb

# 反向恢复
dd if=/dev/sdb of=/dev/sda

# 将整盘备份为镜像文件
dd if=/dev/sda of=/backup/sda.backup

# 从镜像文件恢复
dd if=/backup/sda.backup of=/dev/sda

3. 从光驱制作 ISO 镜像

dd if=/dev/cdrom of=/xxx.iso

4. 导出内存数据

dd if=/dev/mem of=/backup/mem.bin

5. 销毁磁盘数据

使用随机数覆盖整个磁盘,使数据难以恢复:

dd if=/dev/urandom of=/dev/sda

6. 修复磁盘(长时间未使用的磁盘)

dd if=/dev/sda of=/dev/sda

原理是通过全盘读写刷新磁道,实际效果有限且耗时,谨慎使用。

10.4 生成测试文件

# 生成 1G 的文件(实际占用 1G 磁盘空间)
dd if=/dev/zero of=test bs=1M count=1024

# 生成稀疏文件(逻辑大小 40T,实际只占少量空间)
dd if=/dev/zero of=test bs=1M count=1 seek=40000000
ll -h test
du -sh test

10.5 稀疏文件

稀疏文件是 UNIX 类文件系统和 NTFS 支持的特性:

  • 普通文件:系统会立即为其分配所需存储空间。100G 文件创建后立即占用 100G 空间;
  • 稀疏文件:只登记文件元数据,不分配实际数据块,仅在写入特定块时才分配,实际占用空间按需要逐步增长。

适用场景:磁盘镜像、数据库快照、日志文件、大型文件的预分配/增量下载(如电驴中 100G 文件可在剩余空间只有 90G 时先开始下载)。

示例:

dd if=/dev/zero of=test bs=1M count=1 seek=40000000
ll -h test        # 逻辑大小约 40TB
du -sh test       # 实际占用仅 1MB 左右

当超出文件系统限制时会报错:

dd: failed to truncate to 17825792000000 bytes in output file `test1': File too large

10.6 ext4 单文件大小限制

在默认块大小 4096 字节时,ext4 单文件最大约为 16T;若块大小为 1024 字节,则单文件最大约为 4T。

格式化时可使用 -b 指定块大小:

mkfs.ext4 -b 1024 /dev/sda8

查看文件系统块大小:

dumpe2fs /dev/sda8 | grep "Block size:"

输出:

dumpe2fs 1.41.12 (17-May-2010)
Block size:               1024

十一、练习

  1. 使用 rsync 实现本机 /test 到 /test2 的实时同步(包含删除操作)。
  2. 配置 rsync daemon 模式,要求:
    • 模块名为 notes,对应路径 /var/www/html;
    • 模块在客户端列表中隐藏;
    • 仅允许指定 IP 同步;
    • 使用密码文件认证,不依赖 SSH。
  3. 结合 inotify 与密码文件,实现 /localtest 到远程主机 /remotetest 的实时推送。
  4. 使用 dump 为本机某个分区制定"周一全备 + 周中增量"的备份策略,并通过 crontab 自动执行。
  5. 使用 dd 备份 MBR,再练习从备份恢复;并生成一个 1G 的普通文件和一个稀疏文件,通过 ls -lh 与 du -sh 比较两者占用差异。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏