rsync_nas_backup
Published in:2025-03-11 |
Words: 1.6k | Reading time: 6min | reading:

使用rsync同步备份NAS中的文件到其他NSA服务器

rsync简介

rsync 是一个快速、通用且极其强大的文件复制工具,主要用于 Unix-like 系统(包括 Linux、macOS)。它也可以在 Windows 上通过 Cygwin、WSL 或本地移植版本使用。 rsync 不仅可以进行本地复制,还可以通过网络(通常使用 SSH)进行远程复制。

rsync 的主要优点:

  • 增量传输(Delta Transfer): rsync 最显著的特点是它的增量传输算法。它只复制源文件和目标文件之间不同的部分,而不是复制整个文件。这使得 rsync 在同步大型文件或目录时非常高效,尤其是在网络带宽有限的情况下。
  • 速度快: 由于只传输差异部分,rsync 通常比其他复制工具(如 scp)快得多,尤其是在进行重复同步时。
  • 灵活: rsync 提供了大量的选项,可以对复制过程进行精细控制。例如,你可以:
    • 保留文件权限、所有者、组、时间戳等属性。
    • 排除/包含特定文件或目录。
    • 限制带宽使用。
    • 删除目标目录中存在但源目录中不存在的文件(同步删除)。
    • 创建备份(保留已删除或修改文件的旧版本)。
    • 使用 SSH 进行加密传输。
  • 可靠: rsync 经过了广泛的测试,非常稳定。它还支持断点续传,可以在传输中断后继续。
  • 用途广泛: rsync 不仅可以用于备份,还可以用于:
    • 网站镜像。
    • 文件同步。
    • 软件部署。
    • 系统迁移。

rsync 的基本语法:

1
rsync [options] source destination
  • options rsync 的选项(例如 -a-v-z--delete 等)。
  • source 源文件或目录。
  • destination 目标文件或目录。

常用选项:

  • -a:归档模式,等效于 -rlptgoD,保留文件的各种属性。
  • -v:详细模式,显示传输的文件名。
  • -z:压缩传输的数据。
  • -h:以人类可读的格式显示数字(例如,1K、234M、2G)。
  • --progress:显示传输进度。
  • --delete:删除目标目录中存在但源目录中不存在的文件(谨慎使用!)。
  • -e ssh:使用 SSH 进行加密传输。
  • --exclude=PATTERN:排除匹配 PATTERN 的文件或目录。
  • --include=PATTERN:包含匹配 PATTERN 的文件或目录(通常与 --exclude='*' 一起使用)。
  • --bwlimit=RATE:限制带宽使用(速率单位为 KB/s)。
  • --partial : 保留部分传输文件, 用于断点续传。
  • --dry-run-n:模拟运行,不实际传输文件。

本地复制示例:

1
rsync -avzh --progress /path/to/source/ /path/to/destination/

远程复制示例 (使用 SSH):

1
2
3
rsync -avz --progress -e ssh user@remote_host:/path/to/source/ /path/to/destination/
# 或者
rsync -avz --progress -e ssh /path/to/source/ user@remote_host:/path/to/destination/

2. 使用 rsync 备份数据到另一 NAS 服务器实现步骤

假设:

  • 源 NAS 的 IP 地址是 192.168.1.10,用户名是 admin
  • 目标 NAS 的 IP 地址是 192.168.1.20,用户名是 backupuser
  • 要备份的源目录是 /volume1/data
  • 目标目录是 /volume1/backups/data_backup
  • 你已经在源 NAS 或目标 NAS 上(或任何可以访问这两个 NAS 的机器上)安装了 rsync
  • 你已经配置好了 SSH 免密登录.

步骤:

  1. (强烈建议)设置 SSH 免密码登录:

    为了避免每次运行 rsync 都需要输入密码,建议设置 SSH 密钥认证。这样可以实现自动化备份,而无需人工干预。

    • 在要运行 rsync 命令的机器上(例如,你的源 NAS)生成 SSH 密钥对:
      1
      2
      ssh-keygen -t rsa -b 4096  # 生成 4096 位 RSA 密钥对
      # 一路回车,使用默认设置即可。
    • 将公钥复制到目标 NAS:
      1
      2
      ssh-copy-id backupuser@192.168.1.20
      # 输入目标 NAS 上 backupuser 的密码
      如果ssh-copy-id命令不存在, 可以手动复制
    1
    cat ~/.ssh/id_rsa.pub | ssh backupuser@192.168.1.20 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
    • 测试免密码登录:
      1
      ssh backupuser@192.168.1.20
      如果能直接登录到目标 NAS,而无需输入密码,则说明配置成功。
  2. 测试 rsync 命令 (使用 --dry-run):

    在实际运行 rsync 之前,强烈建议使用 --dry-run(或 -n)选项进行测试,以确保命令按预期工作,并且不会意外删除文件。

    1
    2
    3
    rsync -avzhn --progress -e ssh \
    admin@192.168.1.10:/volume1/data/ \
    backupuser@192.168.1.20:/volume1/backups/data_backup/

    仔细检查输出,看看哪些文件将被传输(或删除,如果你使用了 --delete)。

  3. 运行 rsync 命令 (进行实际备份):

    一旦你确信 --dry-run 的输出是正确的,就可以去掉 -n 选项,进行实际的备份:

    1
    2
    3
    rsync -avz --progress -e ssh \
    admin@192.168.1.10:/volume1/data/ \
    backupuser@192.168.1.20:/volume1/backups/data_backup/

或者, 保留删除的文件 (推荐)

1
2
3
rsync -avz --progress --delete -e ssh \
admin@192.168.1.10:/volume1/data/ \
backupuser@192.168.1.20:/volume1/backups/data_backup/

  1. 检查备份
    在目标NAS检查备份文件是否存在, 数据是否完整

3. 编写备份脚本

为了方便起见,可以将 rsync 命令放入一个脚本中,并使用 cron 定时运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

# --- Configuration ---
timeout=60
source_user="nas"
source_ip="192.168.10.96"
source_dir="/volume1/shared/"
dest_user="nas"
dest_ip="192.168.10.97"
dest_dir="/volume1/shared/backup/"
# --- DO NOT STORE PASSWORDS LIKE THIS! ---
source_password="111" # TERRIBLE! DO NOT DO THIS!
dest_password="111" # TERRIBLE! DO NOT DO THIS!
# --- ----------------------------------------
log_file="/var/log/rsync_backup.log"

# --- Functions ---
log_message() {
now=$(date +"%Y-%m-%d %H:%M:%S")
echo "$now - $1" >> "$log_file"
}

# --- The rsync command ---
rsync_cmd="rsync -avz --progress --delete -e ssh"

# --- Main Script ---
log_message "Backup started."

# Run rsync with sshpass, using passwords on the command line. VERY INSECURE!
if ! sshpass -p "$source_password" sh -c 'sshpass -p "'"$dest_password"'" '"$rsync_cmd"' '"$source_user@$source_ip:$source_dir"' '"$dest_user@$dest_ip:$dest_dir" 2>&1 | tee -a "$log_file" ; then
log_message "Backup failed (ssh or rsync error)!"
exit 1
fi

log_message "Backup successful." # Only reached if the previous command succeeds
exit 0

使用脚本:

  1. 保存脚本: 将上述脚本保存为一个文件,例如 backup.sh
  2. 赋予执行权限:
    1
    chmod +x backup.sh
  3. 测试脚本: 手动运行脚本,确保它能正常工作:
    1
    ./backup.sh
  4. 设置定时任务 (使用 cron):
    • 运行 crontab -e 命令来编辑 crontab 文件。
    • 添加一行来指定何时运行你的脚本。 例如,每天凌晨 2 点运行:
      1
      0 2 * * * /path/to/your/backup.sh
    • 保存并关闭 crontab 文件。

安装第三方库

1
2
sudo apt update
sudo apt install expect

其他

  • rdiff-backup:
  • Bacula:
  • Amanda:
  • Duplicity:
  • BorgBackup (Borg):
  • Restic:

about me 个人微信

img

wechat offical 微信公众号

img

Next:
Samba (Linux) + Syslog + Logstash + Elasticsearch 转发smb日志