Centos系统备份

2026-06-29 07:35:25 资源战场

本文介绍如何在 CentOS 上完成目录级文件备份,并通过强大的开源工具 rclone 将备份包上传至 Google 云盘、阿里云盘等对象存储中。通过 Systemd 定时任务,实现重要文件的每日快照备份,便于在新机器或 VM 虚拟机中快速还原环境。

1. 部署 Rclone1.1 安装与初始化 首先安装 Rclone 工具,并进入配置向导:

# 一键安装

curl [https://rclone.org/install.sh](https://rclone.org/install.sh) | bash

# 开始配置

rclone config1.2 配置 Google Drive 在配置向导中,请按照以下步骤操作(以 Google Drive 为例):

新建配置:输入 n (New remote)。命名:输入 gdrive(或者你喜欢的名字,需与脚本中保持一致)。存储类型:输入 20 (Google Drive)。Client ID/Secret:建议使用自己的 API 凭据以获得更好的稳定性。获取方法参考官方文档 Making your own client_id。如果留空则使用 Rclone 公共凭据(高峰期易限流)。权限范围:输入 1 (Full access to all files)。Service Account:按 Enter 跳过(默认不使用)。高级配置:输入 n (No)。Web 验证:

如果是 VPS(无浏览器),输入 n。Rclone 会生成一段命令,请在本地有浏览器的电脑(Windows/Mac)上下载 Rclone 并执行该命令。浏览器授权后,会获得一串 config_token,复制并粘贴回 VPS 的终端。共享云端硬盘:输入 n (不配置 Team Drive)。保存配置:输入 y。 配置完成后,测试连接是否成功:

rclone lsd gdrive:/

# 如果列出了网盘根目录的文件夹,说明配置成功2. 编写备份脚本 创建备份脚本 /usr/local/bin/system-backup.sh,保存以下内容,并赋予执行权限 chmod +x /usr/local/bin/system-backup.sh。

优化说明:此版本脚本增加了 --drive-use-trash=false 参数,防止删除的旧备份进入 Google Drive 回收站导致空间爆满。

#!/bin/bash

# 取消 set -e,防止 tar 在打包 socket 文件时报 warning 导致脚本意外中断

# set -e

# 配置项

DATE=$(date +%F)

BACKUP_DIR="/backup"

BACKUP_FILE="$BACKUP_DIR/system-backup-$DATE.tar.gz"

LOG_FILE="/var/log/backup.log"

MAX_RETRY=3

# 日志输出

mkdir -p "$(dirname "$LOG_FILE")"

exec > >(tee -a "$LOG_FILE") 2>&1

echo "[*] $(date '+%F %T') 开始备份任务"

# 创建备份目录

mkdir -p "$BACKUP_DIR"

# 使用 tar 备份根目录

# --exclude: 排除虚拟目录、挂载点和备份目录自身

# --warning=no-file-changed: 忽略文件在读取时发生变化的警告

for ((i=1; i<=MAX_RETRY; i++)); do

echo "[*] 第 $i 次尝试打包备份..."

if tar --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/mnt --exclude=/media --exclude=/lost+found --exclude="$BACKUP_DIR" --warning=no-file-changed -czpf "$BACKUP_FILE" /; then

echo "[✓] 备份成功:$BACKUP_FILE"

break

else

echo "[!] 第 $i 次备份失败,600 秒后重试..."

sleep 600

fi

done

# 检查是否生成了备份文件

if [ ! -f "$BACKUP_FILE" ]; then

echo "[✗] 所有尝试均失败,未生成备份文件,终止脚本"

exit 1

fi

# 上传到 Google Drive

echo "[*] 上传至 Google Drive..."

if rclone copy "$BACKUP_FILE" gdrive:/backup/; then

echo "[✓] 上传成功"

else

echo "[✗] 上传失败"

# 上传失败是否继续清理旧备份?通常建议保留旧备份以防万一

# exit 1

fi

# 删除本地 7 天前的旧备份

echo "[*] 清理本地 7 天前的备份..."

find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +7 -delete

# 删除 Google Drive 中 14 天前的旧备份

# --drive-use-trash=false: 强制永久删除,不进回收站,防止空间占满

echo "[*] 清理 Google Drive 中 14 天前的旧备份..."

rclone delete --min-age 14d gdrive:/backup/ --include "*.tar.gz" --drive-use-trash=false

echo "[✓] 任务完成:$(date '+%F %T')"3. 配置定时任务 为了管理方便和日志记录,我们使用 Systemd Timer 来替代 Crontab。

创建服务单元 /etc/systemd/system/backup.service:

[Unit]

Description=System Backup Service

[Service]

Type=oneshot

ExecStart=/usr/local/bin/system-backup.sh创建定时器 /etc/systemd/system/backup.timer:

[Unit]

Description=Run backup daily

[Timer]

# 每天凌晨 3 点执行

OnCalendar=*-*-* 03:00:00

# 任务如果错过(关机),开机后立即执行

Persistent=true

[Install]

WantedBy=timers.target启用并启动定时任务:

sudo systemctl daemon-reload

sudo systemctl enable --now backup.timer4. 还原文件 当需要恢复数据时,首先从网盘下载备份包到本地。

[!WARNING] 警告 切勿在运行中的系统上直接解压覆盖根目录 (/)! 这会导致系统配置文件(如 fstab, shadow, network)被覆盖,极大概率导致系统崩溃无法启动。 正确的还原姿势:

提取特定文件:解压到临时目录,手动提取需要恢复的配置或数据文件。

mkdir /tmp/restore

tar -xzp -C /tmp/restore -f system-backup-xxxx.tar.gz

# 然后从 /tmp/restore 中拷贝你需要的文件全量还原:请使用 Live CD (救援模式) 启动机器,挂载目标磁盘,然后解压备份包到挂载点。

最新发表
友情链接