跳转到内容

rsync命令详解和tar备份实战

课程介绍

rsync和tar是Linux系统中两个最重要的备份工具。rsync用于文件同步和增量备份,tar用于文件打包和压缩。本课程将详细讲解rsync和tar命令的使用方法,包括基本用法、高级用法、实战案例等内容,帮助你掌握备份工具的使用技巧。

1. rsync命令详解

1.1 rsync概述

rsync是Linux系统中用于文件同步的工具。

rsync的特点

特点说明
增量同步只同步变化的文件
高效传输只传输变化的部分
保留属性保留文件属性
远程同步支持远程同步

1.2 rsync安装

rsync通常默认安装,如果没有安装,可以手动安装。

安装rsync

bash
# Debian/Ubuntu系统
apt-get install rsync

# CentOS/RHEL系统
yum install rsync

1.3 rsync基本用法

rsync的基本用法。

命令

bash
# 同步本地文件
rsync -avz /source/ /destination/

# 同步远程文件
rsync -avz /source/ user@remote:/destination/

# 从远程同步文件
rsync -avz user@remote:/source/ /destination/

# 显示同步进度
rsync -avz --progress /source/ /destination/

1.4 rsync常用选项

rsync的常用选项。

常用选项

选项说明
-a归档模式,保留文件属性
-v显示详细信息
-z压缩传输
-r递归同步
-l保留符号链接
-p保留文件权限
-t保留文件时间
-g保留文件组
-o保留文件所有者
-D保留设备文件
--delete删除目标目录中不存在的文件
--exclude排除文件
--include包含文件
--progress显示进度
--stats显示统计信息

2. rsync高级用法

2.1 增量备份

使用rsync进行增量备份。

命令

bash
# 创建全量备份
rsync -avz /data/ /backup/full_backup/

# 创建增量备份(使用--link-dest)
rsync -avz --link-dest=/backup/full_backup/ /data/ /backup/incremental_backup_$(date +%Y%m%d)/

# 创建增量备份(使用--compare-dest)
rsync -avz --compare-dest=/backup/full_backup/ /data/ /backup/differential_backup_$(date +%Y%m%d)/

2.2 排除文件

使用rsync排除文件。

命令

bash
# 排除单个文件
rsync -avz --exclude 'file.txt' /source/ /destination/

# 排除多个文件
rsync -avz --exclude 'file1.txt' --exclude 'file2.txt' /source/ /destination/

# 排除目录
rsync -avz --exclude 'dir/' /source/ /destination/

# 排除匹配模式的文件
rsync -avz --exclude '*.log' /source/ /destination/

# 使用排除文件
rsync -avz --exclude-from='exclude.txt' /source/ /destination/

2.3 远程同步

使用rsync进行远程同步。

命令

bash
# 同步到远程服务器
rsync -avz -e ssh /source/ user@remote:/destination/

# 从远程服务器同步
rsync -avz -e ssh user@remote:/source/ /destination/

# 同步时指定端口
rsync -avz -e 'ssh -p 2222' /source/ user@remote:/destination/

# 同步时指定密钥
rsync -avz -e 'ssh -i /path/to/key' /source/ user@remote:/destination/

2.4 限速同步

使用rsync进行限速同步。

命令

bash
# 限制带宽为1MB/s
rsync -avz --bwlimit=1024 /source/ /destination/

# 限制带宽为100KB/s
rsync -avz --bwlimit=100 /source/ /destination/

3. tar命令详解

3.1 tar概述

tar是Linux系统中用于文件打包和压缩的工具。

tar的特点

特点说明
文件打包将多个文件打包成一个文件
文件压缩支持多种压缩格式
保留属性保留文件属性
增量备份支持增量备份

3.2 tar基本用法

tar的基本用法。

命令

bash
# 创建tar包
tar -cf archive.tar /data

# 创建压缩的tar包
tar -czf archive.tar.gz /data

# 解压tar包
tar -xf archive.tar

# 解压压缩的tar包
tar -xzf archive.tar.gz

# 查看tar包内容
tar -tf archive.tar

# 查看压缩的tar包内容
tar -tzf archive.tar.gz

3.3 tar常用选项

tar的常用选项。

常用选项

选项说明
-c创建tar包
-x解压tar包
-t查看tar包内容
-f指定tar包文件
-z使用gzip压缩
-j使用bzip2压缩
-J使用xz压缩
-v显示详细信息
-p保留文件权限
-C指定解压目录
--exclude排除文件
--exclude-from从文件中排除
--include包含文件
--include-from从文件中包含

4. tar高级用法

4.1 增量备份

使用tar进行增量备份。

命令

bash
# 创建全量备份
tar -czf /backup/full_backup_$(date +%Y%m%d).tar.gz /data

# 创建增量备份(使用-g选项)
tar -czf /backup/incremental_backup_$(date +%Y%m%d).tar.gz -g /backup/snapshot.snar /data

# 创建差异备份(使用-N选项)
tar -czf /backup/differential_backup_$(date +%Y%m%d).tar.gz -N "$(date -d 'last Monday' '+%Y-%m-%d')" /data

4.2 排除文件

使用tar排除文件。

命令

bash
# 排除单个文件
tar -czf archive.tar.gz --exclude 'file.txt' /data

# 排除多个文件
tar -czf archive.tar.gz --exclude 'file1.txt' --exclude 'file2.txt' /data

# 排除目录
tar -czf archive.tar.gz --exclude 'dir/' /data

# 排除匹配模式的文件
tar -czf archive.tar.gz --exclude '*.log' /data

# 使用排除文件
tar -czf archive.tar.gz --exclude-from='exclude.txt' /data

4.3 分卷压缩

使用tar进行分卷压缩。

命令

bash
# 分卷压缩(每卷100MB)
tar -czf - /data | split -b 100M - archive.tar.gz.

# 合并分卷
cat archive.tar.gz.* > archive.tar.gz

# 解压分卷
cat archive.tar.gz.* | tar -xzf -

4.4 远程备份

使用tar进行远程备份。

命令

bash
# 备份到远程服务器
tar -czf - /data | ssh user@remote "cat > /backup/backup.tar.gz"

# 从远程服务器恢复
ssh user@remote "cat /backup/backup.tar.gz" | tar -xzf -

# 备份到远程服务器(使用rsync)
rsync -avz -e ssh /backup/backup.tar.gz user@remote:/backup/

5. 实战案例

案例1:使用rsync进行增量备份

场景:使用rsync进行增量备份。

脚本

bash
#!/bin/bash
# rsync增量备份脚本

# 配置
SOURCE_DIR="/data"
FULL_BACKUP_DIR="/backup/full"
INCREMENTAL_BACKUP_DIR="/backup/incremental"
BACKUP_DATE=$(date +%Y%m%d)

# 创建备份目录
mkdir -p "$FULL_BACKUP_DIR"
mkdir -p "$INCREMENTAL_BACKUP_DIR"

# 执行全量备份
function full_backup {
    echo "开始全量备份:$SOURCE_DIR"
    rsync -avz --delete "$SOURCE_DIR/" "$FULL_BACKUP_DIR/"
    echo "全量备份完成"
}

# 执行增量备份
function incremental_backup {
    echo "开始增量备份:$SOURCE_DIR"
    rsync -avz --link-dest="$FULL_BACKUP_DIR/" "$SOURCE_DIR/" "$INCREMENTAL_BACKUP_DIR/$BACKUP_DATE/"
    echo "增量备份完成"
}

# 根据备份类型执行备份
BACKUP_TYPE="$1"
case "$BACKUP_TYPE" in
    full)
        full_backup
        ;;
    incremental)
        incremental_backup
        ;;
    *)
        echo "使用方法:$0 {full|incremental}"
        exit 1
        ;;
esac

# 删除30天前的增量备份
find "$INCREMENTAL_BACKUP_DIR" -type d -mtime +30 -exec rm -rf {} \;

echo "备份完成"

使用方法

bash
# 赋予执行权限
chmod +x rsync_backup.sh

# 执行全量备份
./rsync_backup.sh full

# 执行增量备份
./rsync_backup.sh incremental

案例2:使用tar进行增量备份

场景:使用tar进行增量备份。

脚本

bash
#!/bin/bash
# tar增量备份脚本

# 配置
SOURCE_DIR="/data"
FULL_BACKUP_DIR="/backup/full"
INCREMENTAL_BACKUP_DIR="/backup/incremental"
DIFFERENTIAL_BACKUP_DIR="/backup/differential"
SNAPSHOT_FILE="/backup/snapshot.snar"
BACKUP_DATE=$(date +%Y%m%d)
BACKUP_TYPE="$1"

# 创建备份目录
mkdir -p "$FULL_BACKUP_DIR"
mkdir -p "$INCREMENTAL_BACKUP_DIR"
mkdir -p "$DIFFERENTIAL_BACKUP_DIR"

# 执行全量备份
function full_backup {
    echo "开始全量备份:$SOURCE_DIR"
    BACKUP_FILE="full_backup_${BACKUP_DATE}.tar.gz"
    tar -czf "${FULL_BACKUP_DIR}/${BACKUP_FILE}" -C "$SOURCE_DIR" .
    echo "备份文件:${FULL_BACKUP_DIR}/${BACKUP_FILE}"
    echo "备份大小:$(du -h "${FULL_BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
    
    # 删除快照文件
    rm -f "$SNAPSHOT_FILE"
}

# 执行增量备份
function incremental_backup {
    echo "开始增量备份:$SOURCE_DIR"
    BACKUP_FILE="incremental_backup_${BACKUP_DATE}.tar.gz"
    
    if [ -f "$SNAPSHOT_FILE" ]; then
        tar -czf "${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}" -g "$SNAPSHOT_FILE" -C "$SOURCE_DIR" .
    else
        echo "快照文件不存在,执行全量备份"
        full_backup
        return
    fi
    
    echo "备份文件:${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}"
    echo "备份大小:$(du -h "${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
}

# 执行差异备份
function differential_backup {
    echo "开始差异备份:$SOURCE_DIR"
    BACKUP_FILE="differential_backup_${BACKUP_DATE}.tar.gz"
    
    # 查找最新的全量备份
    LATEST_FULL_BACKUP=$(find "$FULL_BACKUP_DIR" -name "full_backup_*.tar.gz" -type f -printf '%T@ %p\n' | sort -n | tail -1 | cut -f2- -d" ")
    
    if [ -z "$LATEST_FULL_BACKUP" ]; then
        echo "未找到全量备份,请先执行全量备份"
        exit 1
    fi
    
    # 获取全量备份的时间
    FULL_BACKUP_TIME=$(stat -c %Y "$LATEST_FULL_BACKUP")
    
    # 找出自上次全量备份以来变化的文件
    find "$SOURCE_DIR" -newermt "$(date -d @$FULL_BACKUP_TIME '+%Y-%m-%d %H:%M:%S')" -print0 | tar -czf "${DIFFERENTIAL_BACKUP_DIR}/${BACKUP_FILE}" --null -T -
    
    echo "备份文件:${DIFFERENTIAL_BACKUP_DIR}/${BACKUP_FILE}"
    echo "备份大小:$(du -h "${DIFFERENTIAL_BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
}

# 根据备份类型执行备份
case "$BACKUP_TYPE" in
    full)
        full_backup
        ;;
    incremental)
        incremental_backup
        ;;
    differential)
        differential_backup
        ;;
    *)
        echo "使用方法:$0 {full|incremental|differential}"
        exit 1
        ;;
esac

# 删除30天前的备份
find "$FULL_BACKUP_DIR" -name "full_backup_*.tar.gz" -mtime +30 -delete
find "$INCREMENTAL_BACKUP_DIR" -name "incremental_backup_*.tar.gz" -mtime +30 -delete
find "$DIFFERENTIAL_BACKUP_DIR" -name "differential_backup_*.tar.gz" -mtime +30 -delete

echo "备份完成"

使用方法

bash
# 赋予执行权限
chmod +x tar_backup.sh

# 执行全量备份
./tar_backup.sh full

# 执行增量备份
./tar_backup.sh incremental

# 执行差异备份
./tar_backup.sh differential

案例3:综合备份系统

场景:实现一个综合备份系统。

脚本

bash
#!/bin/bash
# 综合备份系统

# 配置
SOURCE_DIR="/data"
BACKUP_DIR="/backup"
FULL_BACKUP_DIR="$BACKUP_DIR/full"
INCREMENTAL_BACKUP_DIR="$BACKUP_DIR/incremental"
DIFFERENTIAL_BACKUP_DIR="$BACKUP_DIR/differential"
SNAPSHOT_FILE="$BACKUP_DIR/snapshot.snar"
BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_TYPE="$1"

# 创建备份目录
mkdir -p "$FULL_BACKUP_DIR"
mkdir -p "$INCREMENTAL_BACKUP_DIR"
mkdir -p "$DIFFERENTIAL_BACKUP_DIR"

# 使用rsync进行全量备份
function rsync_full_backup {
    echo "开始rsync全量备份:$SOURCE_DIR"
    rsync -avz --delete "$SOURCE_DIR/" "$FULL_BACKUP_DIR/"
    echo "rsync全量备份完成"
}

# 使用rsync进行增量备份
function rsync_incremental_backup {
    echo "开始rsync增量备份:$SOURCE_DIR"
    rsync -avz --link-dest="$FULL_BACKUP_DIR/" "$SOURCE_DIR/" "$INCREMENTAL_BACKUP_DIR/$BACKUP_DATE/"
    echo "rsync增量备份完成"
}

# 使用tar进行全量备份
function tar_full_backup {
    echo "开始tar全量备份:$SOURCE_DIR"
    BACKUP_FILE="full_backup_${BACKUP_DATE}.tar.gz"
    tar -czf "${FULL_BACKUP_DIR}/${BACKUP_FILE}" -C "$SOURCE_DIR" .
    echo "备份文件:${FULL_BACKUP_DIR}/${BACKUP_FILE}"
    echo "备份大小:$(du -h "${FULL_BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
    
    # 删除快照文件
    rm -f "$SNAPSHOT_FILE"
}

# 使用tar进行增量备份
function tar_incremental_backup {
    echo "开始tar增量备份:$SOURCE_DIR"
    BACKUP_FILE="incremental_backup_${BACKUP_DATE}.tar.gz"
    
    if [ -f "$SNAPSHOT_FILE" ]; then
        tar -czf "${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}" -g "$SNAPSHOT_FILE" -C "$SOURCE_DIR" .
    else
        echo "快照文件不存在,执行全量备份"
        tar_full_backup
        return
    fi
    
    echo "备份文件:${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}"
    echo "备份大小:$(du -h "${INCREMENTAL_BACKUP_DIR}/${BACKUP_FILE}" | cut -f1)"
}

# 根据备份类型执行备份
case "$BACKUP_TYPE" in
    rsync-full)
        rsync_full_backup
        ;;
    rsync-incremental)
        rsync_incremental_backup
        ;;
    tar-full)
        tar_full_backup
        ;;
    tar-incremental)
        tar_incremental_backup
        ;;
    *)
        echo "使用方法:$0 {rsync-full|rsync-incremental|tar-full|tar-incremental}"
        exit 1
        ;;
esac

# 删除30天前的备份
find "$FULL_BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete
find "$INCREMENTAL_BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete
find "$DIFFERENTIAL_BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete

echo "备份完成"

使用方法

bash
# 赋予执行权限
chmod +x backup_system.sh

# 执行rsync全量备份
./backup_system.sh rsync-full

# 执行rsync增量备份
./backup_system.sh rsync-incremental

# 执行tar全量备份
./backup_system.sh tar-full

# 执行tar增量备份
./backup_system.sh tar-incremental

6. 常见问题

问题1:rsync同步失败

问题:rsync同步失败。

解决方法

bash
# 检查rsync是否安装
which rsync

# 检查源目录是否存在
ls -l /source

# 检查目标目录是否存在
ls -l /destination

# 检查文件权限
ls -l /source

# 重新执行同步
rsync -avz /source/ /destination/

问题2:tar解压失败

问题:tar解压失败。

解决方法

bash
# 检查tar包是否完整
tar -tzf archive.tar.gz

# 检查磁盘空间
df -h

# 检查文件权限
ls -l archive.tar.gz

# 重新执行解压
tar -xzf archive.tar.gz

问题3:备份空间不足

问题:备份空间不足。

解决方法

bash
# 检查磁盘空间
df -h

# 清理旧的备份
find /backup -name "*.tar.gz" -mtime +30 -delete

# 增加存储空间
# 增加硬盘容量

课程总结

这节课我们学习了rsync命令详解和tar备份实战。

核心内容:

  • rsync命令详解(概述、安装、基本用法、常用选项)
  • rsync高级用法(增量备份、排除文件、远程同步、限速同步)
  • tar命令详解(概述、基本用法、常用选项)
  • tar高级用法(增量备份、排除文件、分卷压缩、远程备份)
  • 实战案例(使用rsync进行增量备份、使用tar进行增量备份、综合备份系统)
  • 常见问题

重要命令:

  • rsync:文件同步
  • tar:文件打包和压缩
  • split:分卷压缩
  • find:查找文件

rsync和tar是Linux系统中两个最重要的备份工具,掌握这些知识后,我们将在后续课程中学习数据恢复方法、灾难恢复演练等内容。

课后练习

练习1(基础)

使用rsync命令同步文件。

练习2(进阶)

使用tar命令创建压缩的tar包。

练习3(拓展)

使用rsync和tar进行增量备份。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径