0

0

如何同步Linux目录内容 rsync增量备份实战技巧

P粉602998670

P粉602998670

发布时间:2025-08-28 09:46:01

|

1071人浏览过

|

来源于php中文网

原创

rsync是linux下实现目录同步和增量备份的首选工具,其核心优势在于高效传输、元数据保留、网络优化和部分断点续传能力;2. 基本命令为rsync -avz --delete source/ destination/,其中-a保留文件属性,-v显示过程,-z启用压缩,--delete保持目标与源完全一致;3. 源目录末尾斜杠至关重要,带斜杠复制内容,不带则复制目录本身;4. 使用--delete前应先用--dry-run模拟,避免误删;5. 对正在写入的文件同步时需谨慎,建议结合lvm快照保证一致性;6. 可通过--exclude、--include进行文件过滤,顺序影响匹配结果;7. --link-dest实现硬链接式增量备份,节省空间并保留完整快照;8. -p支持传输进度显示与断点续传,--bwlimit可限制带宽;9. 自动化备份应结合cron定时执行,并将输出重定向至日志文件;10. 编写脚本可实现服务启停、错误处理和通知机制,提升备份可靠性;11. 使用logrotate管理日志文件,定期检查日志确保备份正常运行且可恢复。

如何同步Linux目录内容 rsync增量备份实战技巧

说起Linux下的目录同步和增量备份,我脑子里第一个跳出来的,几乎都是rsync。它就是那个你每次想起来,都觉得“嗯,就它了”的工具。简单来说,rsync能高效地同步本地或远程目录内容,而且它天生就是为“增量”而生的,只会传输那些有变化的部分,极大节省时间和带宽。

解决方案

要实现Linux目录内容的同步和增量备份,rsync是你的不二之选。核心命令其实并不复杂,但里面的门道,尤其是一些参数的组合和使用场景,才是真正需要掌握的。

最常用的基础命令是这样的:

rsync -avz --delete /path/to/source/ /path/to/destination/

  • -a
    :这是个“归档模式”,包含了递归(
    -r
    )、保持符号链接(
    -l
    )、保持权限(
    -p
    )、保持修改时间(
    -t
    )、保持组(
    -g
    )、保持所有者(
    -o
    )以及保持设备文件(
    -D
    )等一系列常用选项。对于备份来说,这几乎是必不可少的,能确保目标目录的文件属性和源目录一模一样。
  • -v
    :显示详细的传输过程,让你知道rsync到底在干什么,哪些文件被传输了,哪些被跳过了。
  • -z
    :在传输过程中启用压缩。如果你是在网络上进行同步,这能显著减少传输的数据量,提高效率。
  • --delete
    :这个选项非常强大,它会删除目标目录中那些源目录里不存在的文件。这对于保持两个目录的“完全同步”至关重要。但使用时务必小心,一不留神可能就会删掉不该删的东西。

举例来说:

本地目录同步: 假设你想把

/home/user/documents
同步到
/mnt/backup/docs
rsync -avz --delete /home/user/documents/ /mnt/backup/docs/

远程目录备份(推送到远程): 你想把本地的

/var/www/html
备份到远程服务器
backup_server
/data/web_backups
目录下:
rsync -avz --delete /var/www/html/ user@backup_server:/data/web_backups/

远程目录备份(从远程拉取): 你想把远程服务器

data_server
/data/logs
目录拉取到本地的
/var/log/remote_logs
rsync -avz --delete user@data_server:/data/logs/ /var/log/remote_logs/

记住,源目录后的斜杠

/
至关重要。带斜杠表示复制目录内的内容,不带斜杠则表示复制目录本身。我个人经常会因为这个小细节犯错,导致目标目录结构不是我想要的。

rsync在增量备份中的核心优势与注意事项

rsync在增量备份场景下,简直是神一样的存在。它的“增量”并非简单地跳过已存在文件,而是更智能地只传输文件变化的部分(delta transfer)。这意味着如果一个大文件只有几行内容变了,它不会重新传输整个文件,只传输那几行变化的数据。

核心优势:

  • 高效传输: 这是它最大的亮点。无论是文件大小还是数量,rsync都能通过比较文件校验和和时间戳,只同步差异部分,大幅减少数据传输量。对于带宽有限或数据量巨大的场景,简直是救星。
  • 元数据保留:
    -a
    选项确保了文件的所有者、权限、时间戳等元数据都能被完整保留,这对于备份的完整性和可恢复性至关重要。
  • 网络优化:
    -z
    选项的压缩传输,让它在跨网络同步时表现出色。
  • 断点续传(部分): 虽然不是严格意义上的断点续传,但rsync可以识别已传输的部分文件,并在下次运行时继续传输未完成的部分,这在传输大文件时很有用。

注意事项和常见陷阱:

  • 源目录末尾的斜杠(
    /
    ):
    再次强调,这真的是个坑。
    • rsync source/ dest/
      :复制
      source
      目录内的所有内容
      dest
    • rsync source dest/
      :复制
      source
      目录本身
      dest
      ,结果是
      dest/source/
      。 选择错误,备份结构可能就乱套了。
  • --delete
    选项的威力:
    这个选项让目标目录与源目录保持完全一致,即源目录没有的文件,目标目录也会被删除。对于数据同步非常有用,但对于需要保留历史版本或防止误删的备份策略,可能需要配合
    --backup
    --link-dest
    等选项使用,或者干脆不用
    --delete
    ,只做追加式备份。我个人建议,每次用
    --delete
    前,先用
    --dry-run
    模拟一下。
  • 打开中的文件: rsync在同步文件时,如果文件正在被写入,可能会导致同步到的文件不完整或损坏。对于数据库文件、日志文件等持续写入的场景,最好在同步前暂停相关服务,或者使用LVM快照等技术来获取文件的一致性视图。
  • 硬链接处理: rsync默认处理硬链接时,会将它们当作独立文件复制。如果你想利用硬链接在目标端节省空间(例如,实现类似Time Machine的多版本备份),你需要用到
    --link-dest
    这个高级选项。

深入理解rsync的常见选项与高级用法

掌握了基础,我们来看看rsync更深层的一些用法,它们能让你的备份策略更灵活、更安全。

  • -p
    --partial --progress
    这两个选项常常一起使用。
    --partial
    会在传输中断时保留部分传输的文件,下次可以继续;
    --progress
    则会显示传输的进度条,这在大文件传输时非常有用,让你知道还有多久能完成。
    rsync -avzP source/ dest/
  • --dry-run
    -n
    这绝对是你每次尝试新rsync命令时的救命稻草。它会模拟整个传输过程,告诉你哪些文件会被复制、哪些会被删除,但不会真正执行任何操作。每次我构建新的rsync命令,尤其是带有
    --delete
    的时候,都会先跑一遍
    --dry-run
    ,确认无误才真正执行。
    rsync -avz --delete --dry-run source/ dest/
  • --exclude
    --include
    这是进行精细化控制的关键。你可以通过它们排除或包含特定文件或目录。
    • 排除所有
      .log
      文件:
      --exclude '*.log'
    • 排除一个名为
      temp
      的目录:
      --exclude 'temp/'
    • 从一个文件中读取排除列表:
      --exclude-from=exclude_list.txt
    • --include
      --exclude
      的顺序很重要,rsync会按照它们在命令行中的顺序进行匹配,一旦匹配成功就不会再往下匹配。通常是先
      --include
      --exclude
  • --link-dest=DIR
    这是实现真正意义上“硬链接式增量备份”的神器。它允许你指定一个目录作为“参考点”,rsync会检查这个参考目录中是否存在与当前源文件相同的文件。如果存在,并且文件内容完全一致,rsync就不会复制这个文件,而是在目标目录中创建一个指向参考目录中对应文件的硬链接。这样,每次备份看起来都是一个完整的快照,但实际上只有新文件和修改过的文件占用了额外空间,未变动的文件都只是硬链接。 例如,你每天凌晨1点执行备份,想保留过去7天的备份:
    rsync -av --link-dest=/mnt/backup/daily.6/ /path/to/source/ /mnt/backup/daily.7/
    然后,你可能需要一个脚本来轮换这些目录,比如把
    daily.6
    移到
    daily.5
    ,以此类推。
  • --bwlimit=KBPS
    限制带宽。如果你不想让rsync占用所有网络带宽,可以设置一个传输速率上限,单位是KBPS(千字节每秒)。
    rsync -avz --bwlimit=1000 source/ dest/
    (限制为1MB/s)

自动化rsync备份:结合定时任务与日志管理

手动执行rsync命令对于偶尔的同步可能没问题,但对于日常的增量备份,自动化是必须的。Cron是Linux下最常见的定时任务工具,结合rsync和一些简单的脚本,就能搭建起一套可靠的自动化备份系统。

Explainpaper
Explainpaper

阅读学术论文的更好方法,你的学术论文阅读助手。

下载

1. 使用Cron定时执行rsync:

打开你的用户cron表:

crontab -e
然后添加一行,比如每天凌晨3点执行备份:
0 3 * * * /usr/bin/rsync -avz --delete /path/to/source/ /path/to/destination/ >> /var/log/rsync_backup.log 2>&1

  • 0 3 * * *
    :表示每天的3点0分执行。
  • >> /var/log/rsync_backup.log 2>&1
    :这部分非常重要。它将rsync的所有输出(标准输出和标准错误)都重定向到一个日志文件。这样,即使你不在电脑前,也能通过查看日志文件来了解备份是否成功、哪些文件被同步了。

2. 编写更健壮的备份脚本:

对于更复杂的备份需求,比如需要备份前停止服务、备份后启动服务,或者根据日期生成不同的备份目录,直接在cron里写就显得不够灵活了。这时,你可以把rsync命令封装到一个shell脚本里。

创建一个文件,比如

/usr/local/bin/daily_backup.sh

#!/bin/bash

SOURCE_DIR="/path/to/source/"
DEST_DIR="/mnt/backup/daily/"
LOG_FILE="/var/log/rsync_daily_backup_$(date +\%Y\%m\%d).log"

echo "--- Backup started at $(date) ---" >> "$LOG_FILE"

# 假设需要备份前停止服务
# systemctl stop your_service_name >> "$LOG_FILE" 2>&1

/usr/bin/rsync -avz --delete "$SOURCE_DIR" "$DEST_DIR" >> "$LOG_FILE" 2>&1

RSYNC_EXIT_CODE=$?

if [ $RSYNC_EXIT_CODE -eq 0 ]; then
    echo "Backup completed successfully." >> "$LOG_FILE"
elif [ $RSYNC_EXIT_CODE -eq 24 ]; then
    echo "Backup completed with some files not found (e.g., deleted during sync), check logs." >> "$LOG_FILE"
else
    echo "Backup failed with error code: $RSYNC_EXIT_CODE. Please check logs." >> "$LOG_FILE"
    # 这里可以添加发送邮件或短信通知的逻辑
    # mail -s "Rsync Backup Failed!" your_email@example.com < "$LOG_FILE"
fi

# 假设备份后启动服务
# systemctl start your_service_name >> "$LOG_FILE" 2>&1

echo "--- Backup finished at $(date) ---" >> "$LOG_FILE"

给脚本执行权限:

chmod +x /usr/local/bin/daily_backup.sh
然后在cron里调用这个脚本:
0 3 * * * /usr/local/bin/daily_backup.sh

3. 日志管理:

自动化备份最怕的就是“静默失败”。你以为它在跑,结果根本没成功。所以,日志是你的眼睛。

  • 日志重定向: 如上面所示,将rsync的输出重定向到文件。

  • 日志轮转: 随着时间推移,日志文件会越来越大。你可以使用

    logrotate
    工具来自动管理日志文件,包括压缩、删除旧日志等。 创建一个
    logrotate
    配置文件,例如
    /etc/logrotate.d/rsync_backup

    /var/log/rsync_daily_backup_*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 0640 root root
    }

    这个配置会让

    rsync_daily_backup_
    开头的日志文件每天轮转一次,保留7个最新的压缩文件,如果文件不存在则不报错,如果文件为空则不轮转。

  • 定期检查日志: 即使有了自动化和日志,定期(比如每周)抽查一下日志文件,确认备份确实在正常运行,并且没有异常错误,这仍然是一个好习惯。毕竟,备份的最终目的是为了恢复,而一个从来没有验证过、或长期未检查的备份,在真正需要时,可能会给你一个“惊喜”。

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

589

2023.06.14

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

637

2023.06.21

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

457

2023.07.31

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

240

2023.08.01

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2847

2023.08.11

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

500

2023.08.11

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

306

2023.08.31

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

417

2023.09.01

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

27

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.1万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号