TAR 实现 Linux 操作系统文件及目录备份
备份原理:基于目录或者文件的 atime、mtime、ctime 属性是否被修改
- 文件被访问的时间(Accesstime,atime)
- 文件内容被更改的时间(Modified time, mtime)
- 文件写入、权限更新的时间(Change time,ctime)
更改文件内容 mtime 和 ctime 都会改变,但 ctime 可以在 mtime 未发生变化时被更改,例如修改文件权限,文件 mtime 时间不变,而 ctime 时间改变。
-
TAR增量备份案例如下:
(1)/root 下创建 mode 目录,同时新增 2 个文件 mode1.txt mode2.txt
mkdir mode && touch mode/mode1.txt mode/mode2.txst
(2)使用 tar 命令第一次完整备份 mode 目录的内容,-g 指定快照 snapshot 文件,第一次没有文件会自动创建
cd mode # *为要备份的文件名称也可以是绝对路径的目录 tar -g /root/snapshot -czvf /root/2021mode.tar.gz *
(3)使用 tar 命令第一次完整备份 mode 目录后,会生成快照文件/data/backup/snapshot,后期增量备份会以 snapshot 文件为参考,在 mode 目录中新增文件测试增量备份
cd mode && touch mode3.txt tar -g /data/backup/snapshot -czvf /data/backup/2021mode_add1.tar.gz *
增量备份时,需要使用-g 指定第一次完整备份的快照 snapshot 文件,同时增量备份包不能同名,使用 tar -tf 可以查看增量备份包内容.
说明:在进行增量备份过程中同目录下同名文件进行更改(包括但不限制更改文件内容、更改权限等)增量备份会进行最新文件的备份,相当与每次都是每个文件的全量备份
-
自动备份脚本
在配置为定时任务时,需要对脚本交互部分设置默认值即可
#!/usr/bin/env bash
#########################################################################
# File Name: auto_backup_system.sh
# Author: Mode
# mail: 13692247896@163.com
# Created Time: 四 3/18 09:57:20 2021
# Describe: 对目录进行增量备份
#########################################################################
# 获取所有变量为 array
SOURCE_DIR=($*)
TARGET_DIR=/data/backup
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
WEEK=$(date +%u)
FILES=system_backup.tgz
CODE=$?
echo -e "------------------------------\n参数输入的时候注意:如果是绝对路径在备份的时候会进行全路径备份,相对路径备份当前目录即可\n------------------------------"
if [[ -z ${SOURCE_DIR} ]]; then
echo -e "Plaese Enter a File or Directory You Need to Backup:\n-------------------------------------\nExample $0 /boot /etc....."
exit
fi
if [[ ! -d "${TARGET_DIR}/${YEAR}/${MONTH}/${DAY}" ]]; then
mkdir -p "${TARGET_DIR}/${YEAR}/${MONTH}/${DAY}" > /dev/null 2>&1
echo "This ${TARGET_DIR}/${YEAR}/${MONTH}/${DAY} Created Successfully!"
fi
FullBackup(){
# 星期日 进行全量备份
if [[ "${WEEK}" -eq "7" ]]; then
rm -rf "${TARGET_DIR}/snapshot"
cd ${TARGET_DIR}/${YEAR}/${MONTH}/${DAY} || exit
tar -g ${TARGET_DIR}/snapshot -czvf ${FILES} $(echo ${SOURCE_DIR[@]}) > /dev/null 2>&1
[[ "${CODE}" == "0" ]] && echo -e "--------------------\nFullBackup System Files Backup Successfully!"
fi
}
AddBackup(){
# 每天根据当前日期进行增量备份
cd "${TARGET_DIR}/${YEAR}/${MONTH}/${DAY}" || exit
if [[ -f "${TARGET_DIR}/${YEAR}/${MONTH}/${DAY}/${FILES}" ]]; then
read -p "${FILES} Already Exists, overwrite confirmation y or n?:" SURE
if [[ ${SURE} =~ ^[Nn] ]]; then
sellp 1; exit 0
fi
if [[ ${WEEK} -ne "7" ]]; then
cd ${TARGET_DIR}/${YEAR}/${MONTH}/${DAY} || exit
tar -g ${TARGET_DIR}/snapshot -czvf $$_${FILES} $(echo ${SOURCE_DIR[@]}) > /dev/null 2>&1
[[ "${CODE}" == "0" ]] && echo -e "-------------------------\nAddBackup System Files Backup Successfully!"
fi
else
if [[ ${WEEK} -ne "7" ]]; then
cd ${TARGET_DIR}/${YEAR}/${MONTH}/${DAY} || exit
tar -g ${TARGET_DIR}/snapshot -czvf $$_${FILES} $(echo ${SOURCE_DIR[@]}) > /dev/null 2>&1
[[ "${CODE}" == "0" ]] && echo -e "-------------------------\nAddBackup System Files Backup Successfully!"
fi
fi
}
FullBackup; AddBackup