Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux rsync与tar使用

Linux系统备份与恢复之rsync与tar的完整使用教程

作者:我不是呆头

在 Linux 系统管理领域,数据安全与灾难恢复是永恒的核心议题,一套可靠的备份与恢复策略是衡量系统稳定性的关键指标,本文将深入剖析 Linux 环境下两大最核心、最经典的备份工具:rsync 与 tar,需要的朋友可以参考下

摘要

在 Linux 系统管理领域,数据安全与灾难恢复是永恒的核心议题。一套可靠的备份与恢复策略是衡量系统稳定性的关键指标。本文将深入剖析 Linux 环境下两大最核心、最经典的备份工具:rsynctar。我们将从工具的核心设计哲学出发,详细讲解 tar 如何用于创建完整的、可移植的系统归档快照,以及 rsync 如何凭借其卓越的增量同步算法实现高效的日常数据备份与远程镜像。本文不仅包含基础命令,更会深入到权限处理、性能优化、增量备份策略等高级应用场景,最终提供一套完整的、可实战的系统备份与恢复流程,助您构建坚不可摧的数据防线。

 1 引言:为何备份至关重要?

无论是硬件故障、软件错误,还是人为误操作,数据丢失的风险无处不在。对于 Linux 系统管理员而言,定期、可靠的备份不仅是“好习惯”,更是核心职责。一套优秀的备份策略应能让系统在遭遇灾难性故障后,以可接受的时间和成本恢复到正常运行状态。

1.1. 备份策略的核心思想

一个完整的备份策略通常考虑以下几点:

1.2. 工具选择:tar 与 rsync 的定位差异

在众多 Linux 备份工具中,tarrsync 因其功能强大、普遍预装而成为事实上的标准。但它们的设计哲学和适用场景截然不同。

特性tar (Tape Archive)rsync (Remote Sync)
核心功能将多个文件/目录打包成一个单一的归档文件高效地同步两个目录(本地或远程)
输出形态单一文件(如 backup.tar.gz一个与源完全一致的目标目录
备份类型主要用于全量备份天然适合增量备份镜像
传输效率传输整个归档文件,效率较低仅传输文件差异部分,网络效率极高
恢复方式需要先解压整个归档数据直接可用,无需额外步骤

简单来说,tar 用于“制作快照”rsync 用于“保持同步”

2 tar:归档的艺术与全量备份

tar 命令是制作系统级备份快照的绝佳工具,它能将整个文件系统的结构和元数据(权限、所有者、时间戳)完整地封装到一个文件中。

2.1. tar 的基本操作:打包与解包

tar 的核心选项非常直观:

# 创建一个归档,将 /etc 和 /home 目录打包
tar -cvf my_backup.tar /etc /home

# 查看归档文件内容,不解压 (-t, list)
tar -tvf my_backup.tar

# 从归档中提取文件到当前目录
tar -xvf my_backup.tar

# 提取到指定目录 (-C, change directory)
mkdir /tmp/restore
tar -xvf my_backup.tar -C /tmp/restore

2.2. 关键选项详解:压缩、排除与权限保持

为了实用性,我们通常会结合压缩和排除功能。

压缩选项:

--exclude=PATTERN: 在打包时排除匹配模式的文件或目录。

-p (--preserve-permissions): 这是系统备份时必须使用的选项,它会保留文件的所有元数据,包括权限、所有权和时间戳。

2.3. 实战案例:制作一份完整的系统根分区快照

在对根目录 / 进行备份时,必须排除一些动态生成的虚拟文件系统,否则备份将失败或产生一个无用且巨大的文件。

#!/bin/bash

# 备份目标目录
BACKUP_DIR="/mnt/external_drive/backups"
# 备份文件名,包含日期
FILENAME="system_root_backup_$(date +%Y-%m-%d).tar.gz"
# 备份的源目录
SOURCE_DIR="/"
# 需要排除的目录列表
EXCLUDE_LIST=(
    "--exclude=${BACKUP_DIR}/*"
    "--exclude=/proc/*"
    "--exclude=/sys/*"
    "--exclude=/dev/*"
    "--exclude=/tmp/*"
    "--exclude=/run/*"
    "--exclude=/mnt/*"
    "--exclude=/media/*"
    "--exclude=/lost+found"
)

echo "Starting system backup..."
# 使用 -p 保留权限,-C 切换到源目录以打包相对路径
# 注意:直接打包 / 会保存绝对路径,恢复时更直接
tar -czvpf "${BACKUP_DIR}/${FILENAME}" "${EXCLUDE_LIST[@]}" "${SOURCE_DIR}"

if [ $? -eq 0 ]; then
    echo "Backup successful: ${BACKUP_DIR}/${FILENAME}"
else
    echo "Backup failed!"
fi

关键点:

3 rsync:高效同步与增量备份的王者

rsync 的强大之处在于它能以最小的数据传输量完成目录同步,使其成为日常增量备份和远程镜像的首选。

3.1. rsync 的核心魅力:差分算法

rsync 同步一个文件时,它不会盲目地整个复制。它会:

这个过程使得即使一个巨大的日志文件只在末尾增加了几行,rsync 也只需传输这几行的数据,而不是整个文件。

3.2. 基本同步操作:本地与远程

rsync 最常用的选项是 -a (--archive),它是一个选项集合,等同于 -rlptgoD,意为:

# 本地同步,-v 表示 verbose, -h 表示 human-readable
rsync -avh /path/to/source/ /path/to/destination/

# **重要提示:** 源目录末尾的斜杠 `/`
# /source/ : 表示同步 source 目录下的 *内容* 到 destination。
# /source  : 表示将 source 目录 *本身* 放入 destination,结果是 /destination/source/。

# 远程同步到服务器 (推)
# -z 选项启用传输过程中的压缩
rsync -avhz /local/data/ user@remote_server:/remote/backup/

# 从远程服务器同步到本地 (拉)
rsync -avhz user@remote_server:/remote/data/ /local/backup/

3.3. 高级技巧:删除、排除与版本化增量备份

--delete: 使目标目录严格与源目录同步。如果一个文件在源目录被删除,那么在同步时它也会在目标目录被删除。请谨慎使用此选项!

--exclude-from=FILE: 从一个文件中读取排除规则列表,比多个 --exclude 更整洁。

--link-dest=DIR: 这是实现空间高效的版本化备份的神器。它会创建一个新的备份,但对于与上一个版本 (DIR) 相同的文件,它不会复制,而是创建一个硬链接。这意味着只有新增和修改的文件会占用新的磁盘空间。

# 实现每日增量备份的脚本片段
BASE_DIR="/snapshots"
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

SOURCE="/data/important_stuff/"
DEST="${BASE_DIR}/${TODAY}"
LINK_DEST="${BASE_DIR}/${YESTERDAY}"

# 确保今天的备份目录存在
mkdir -p "${DEST}"

# 执行 rsync
rsync -avh --delete \
      --link-dest="${LINK_DEST}" \
      "${SOURCE}" \
      "${DEST}/"

这个简单的脚本每天会创建一个新的备份目录,但占用的空间远小于全量备份。

4 终极实战:完整的系统备份与恢复流程

4.1. 备份阶段:选择合适的工具与策略

4.2. 恢复阶段:从零到一重建系统

假设主硬盘损坏,我们需要在一块新硬盘上恢复系统。

4.2.1. 准备恢复环境

  1. 使用 Linux Live CD/USB (如 Ubuntu, SystemRescueCd) 启动计算机。
  2. 使用 gparted 或 fdisk 等工具对新硬盘进行分区,至少需要一个根分区 (/) 和一个 swap 分区。如果使用 UEFI 启动,还需要一个 EFI 分区。
  3. 格式化新分区,例如:mkfs.ext4 /dev/sda1
  4. 挂载新分区:mount /dev/sda1 /mnt

4.2.2. 数据恢复

# 将备份文件恢复到新分区的挂载点
tar -xzvpf /path/to/system_root_backup.tar.gz -C /mnt

如果使用 rsync 备份:

# 将 rsync 备份目录同步到新分区
rsync -avh /path/to/rsync_backup/ /mnt/

4.2.3. 修复引导与系统配置 (chroot)

数据恢复后,系统还不能启动,因为引导加载程序 (GRUB) 尚未安装到新硬盘的 MBR/EFI 中,且 /etc/fstab 可能指向旧的磁盘 UUID。

挂载必要的虚拟文件系统:

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

chroot 进入新系统环境: chroot 命令可以将当前终端的根目录切换到 /mnt,让你如同在新恢复的系统中操作。

sudo chroot /mnt

修复 GRUB:

# 查找新磁盘的设备名 (例如 /dev/sda)
# 对于 BIOS 系统:
grub-install /dev/sda
# 对于 UEFI 系统,确保 EFI 分区已挂载到 /boot/efi
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

# 更新 GRUB 配置
update-grub

检查 /etc/fstab 使用 blkid 命令查看新分区的 UUID,并更新 /etc/fstab 文件,确保 UUID 匹配。

退出并重启:

exit        # 退出 chroot
# unmount all virtual filesystems if needed
reboot

5 性能与安全考量

5.1. 处理特殊权限:ACLs 与 SELinux

标准的 -a 选项不保留 ACL (Access Control Lists) 和 SELinux 上下文。在需要保留这些属性的系统(如 RHEL/CentOS)上,应添加 -A-X 选项。

rsync -avhAX ...
# -A, --acls: 保留 ACL
# -X, --xattrs: 保留扩展属性,包括 SELinux 上下文

tar 在较新版本中也支持 --acls--selinux 选项。

5.2. 优化传输性能:压缩与带宽限制

# 限制 rsync 带宽为 5000 KB/s (约 5MB/s)
rsync -avhz --bwlimit=5000 ...

6. 总结:构建你的备份矩阵

tarrsync 并非竞争关系,而是互补的。一个成熟的备份策略应当是一个矩阵:

通过结合这两种工具,并将其集成到自动化的 cron 任务中,你可以为你的 Linux 系统构建一个纵深防御、高枕无忧的备份与恢复体系。

以上就是Linux系统备份与恢复之rsync与tar的完整使用教程的详细内容,更多关于Linux rsync与tar使用的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文