rsync 远程同步与系统备份恢复
适用环境:RHEL 5 / RHEL 6 / CentOS 系列。 内容覆盖:rsync 的特性、安装与常用选项;本地同步、远程同步(SSH 与 daemon 两种模式)、
rsyncd.conf与密码文件、基于 xinetd 的服务配置、inotify+rsync 实时同步;系统备份的分类、策略与 dump/restore 工具;以及 dd 命令在磁盘克隆、MBR 备份、生成稀疏文件、销毁数据等场景中的用法。文末保留练习。
一、rsync 概述
rsync 是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原有文件的权限、属主、属组、修改时间以及软硬链接等附加信息。
1.1 主要特性
- 可以镜像保存整个目录树和文件系统;
- 容易保留原有权限、owner、group、修改时间以及软硬链接;
- 传输效率高,使用同步算法,只传输发生变化的部分;
- 支持匿名传输,方便网站镜像。
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 备份方式
- 本地备份:例如将
/aaa/test备份为/bbb/test.bak。本地存储损坏时数据仍会丢失; - 异盘备份:备份到另一块硬盘,预防单盘损坏;
- 异地备份(异地容灾):将数据备份到远端机房或数据中心,预防火灾、地震等机房级灾难。
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 备份实施流程
- 分析待备份数据,评估并设计备份策略(工具、频率、是否增量/累计增量、保留周期);
- 根据策略编写备份脚本;
- 使用
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
十一、练习
- 使用 rsync 实现本机
/test到/test2的实时同步(包含删除操作)。 - 配置 rsync daemon 模式,要求:
- 模块名为
notes,对应路径/var/www/html; - 模块在客户端列表中隐藏;
- 仅允许指定 IP 同步;
- 使用密码文件认证,不依赖 SSH。
- 模块名为
- 结合 inotify 与密码文件,实现
/localtest到远程主机/remotetest的实时推送。 - 使用 dump 为本机某个分区制定"周一全备 + 周中增量"的备份策略,并通过 crontab 自动执行。
- 使用
dd备份 MBR,再练习从备份恢复;并生成一个 1G 的普通文件和一个稀疏文件,通过ls -lh与du -sh比较两者占用差异。
此处评论已关闭