tar备份还原

备份

备份脚本

#!/bin/bash

# 强制必须传参
if [ $# -eq 0 ]; then
  echo "Error: Missing parameter one. Usage: $0 <_BACKUP_DIR>, EXIT"
  exit 1
fi

# 设置备份目录
_BACKUP_DIR=$(realpath "$1")

# 设置输出文件夹(包含末尾斜杠)
DEST_PATH="${_BACKUP_DIR}/$(hostname -I | awk '{print $1}')/"
mkdir -p "$DEST_PATH"

# 设置输出文件基础名
DEST_BASE_FILENAME=$(basename "$0")

set -x

# 检查 pv 命令存在并安装
_CMDNAME=pv
if ! command -v $_CMDNAME &> /dev/null; then
  if command -v apt-get &> /dev/null; then
    apt-get update
    apt-get install -y $_CMDNAME
  else
    echo "Error: $_CMDNAME not found and apt-get can't install."
    exit 1
  fi
fi

# 只保留需要的文件夹
tar -cvp \
  --exclude=/etc/hostname \
  --exclude=/etc/hosts \
  --exclude=/etc/*etwork* \
  --exclude=/etc/netplan \
  --exclude=/etc/dhcp \
  --exclude=/etc/fstab \
  --exclude=/var/cache/apt/archives \
  --exclude=/var/tmp \
  --exclude=/run/network* \
  --exclude=$HOME/.cache \
  --exclude=$HOME/.vscode* \
  --exclude=/root/docker/lib \
  /home /root /etc /var/spool /opt \
  | pv -L 18m | gzip -c | split -a3 -b1G - "${DEST_PATH}${DEST_BASE_FILENAME}_$(date '+%d').tgz"

pv命令:

控制数据传输速率, pv -L 18m限制速率为 18 MB/s,并将输出通过管道传递gzip

gzip参数:

  • -c 表示输出到stdout
  • -d 表示解压缩
  • -1 表示最快压缩
  • -9 表示最好压缩 默认使用的是-6压缩级别。

split参数:

  • -a 选项指定拆分文件名的后缀长度。
  • 3 表示每个拆分文件名的后缀由 3 个字符组成。
  • -b 选项指定每个拆分文件的大小。
  • 1G 表示每个拆分文件的大小为 1 GB。

还原、恢复

!系统对应!:重装系统记得对应——你备份时的系统(Debian、Ubuntu。。。)

cat /etc/issue.net
Debian GNU/Linux 11

cat /etc/issue.net
Ubuntu 22.04.4 LTS

方式一、从Rclone挂载路径

挂载rclone

rclone mount q3: /mnt --daemon

检查:选择要恢复的压缩包

【注意】最新的压缩包应该是你当前的前一天(号数)

  • 例如现在是:7月29日

#ls -lh /q3/test/backup/<IP>/backup-tar_2*

-rw-rw-rw- 1 root root 1.0G May 28 06:54 /q3/test/backup/<IP>/backup-tar_28.tgzaaa
-rw-rw-rw- 1 root root 1.0G May 28 06:57 /q3/test/backup/<IP>/backup-tar_28.tgzaab
-rw-rw-rw- 1 root root 812M May 28 07:00 /q3/test/backup/<IP>/backup-tar_28.tgzaac
-rw-rw-rw- 1 root root 1.0G Apr 29 06:53 /q3/test/backup/<IP>/backup-tar_29.tgzaaa
-rw-rw-rw- 1 root root 1.0G Apr 29 06:56 /q3/test/backup/<IP>/backup-tar_29.tgzaab

——应该选 28结尾(29是上个月的了)


ls -lh /q3/test/backup/<IP>/backup-tar_28.tgzaa
backup-tar_28.tgzaaa  backup-tar_28.tgzaab  backup-tar_28.tgzaac  backup-tar_28.tgzaad

开始还原:全解压 or 只解压部分

cat 星号* 注意历史命令重载:还原 history -r


#全解压:| tar -xzvpf - -C / 

cat /q3/test/backup/<TAB选择>/backup-tar_28.tgzaa* | tar -xzvpf - -C / --overwrite-dir
history -r


#只解压root部分目录:| tar -xzvpf - -C / root home/wdd #根路径/后跟...压缩包内目录
cat /q3/test/backup/<IP>/backup-tar_28.tgzaa* | tar -xzvpf - -C / root --overwrite-dir
history -r

重启


#重启
docker stop $(docker ps -q) && systemctl stop rclone@* && shutdown -r now

测试结果:

history命令不会跟还原之前的合并

  • 解决:还原完成后立即重载
history -r

方式二:挂载SMB共享

Windows下载tar备份文件

使用 mount 命令挂载 SMB 共享
mount -t cifs //server/share /mnt/smb -o username=myuser,password=mypass

#例如
mount -t cifs /192.168.8.150/c /mnt/ -o username=user,password=
  • 该命令会将 //server/share 共享文件夹挂载到 /mnt/smb 目录下。
  • 需要指定 cifs 文件系统类型,并提供访问共享的用户名和密码。

dd 备份还原

注意

大BUG:递归备份!(只适合多分区备份)
无论备份还是恢复,都需要保证 of 指向的文件或磁盘空间要大于 if 指向的内容

语法

dd 选项

选项

  • of=FILE, 将输出定位到FILE,而不是默认的stdout
  • bs=BYTES,每次读取的字节数,默认为512字节
  • count=N, 拷贝N个输入块
  • if=FILE, 从FILE输入,而不是默认的stdin

备份

#!/bin/bash

#强制必须传参: /备份目录
[ $# -eq 0 ] && echo "Error: Parameter not provided. Usage: $0 " && exit 1
	
_BACKUP_DIR=$(realpath "$1")
DEST_PATH="${_BACKUP_DIR}/$(hostname -I | awk '{print $1}')/"

#匹配挂载点是"on / "(根目录)的设备路径
MOUNT_ROOT_DEV_BLOCK=$(mount | grep -e "on /\s" | awk '{print $1}')
# 检查目录是块文件
[ -b "$MOUNT_ROOT_DEV_BLOCK" ] || { echo "Error: Block device not found."; exit 1; }

#检查pv命令存在:dd命令不能用 | pv -L 10m |
command -v pv >/dev/null || { echo "Error: pv command not found."; exit 1; }

# 注意:dd命令后不能\换行
dd if="$MOUNT_ROOT_DEV_BLOCK" conv=sparse bs=64K | gzip -2 -c | pv -L 5m | split -a3 -b2G - "${DEST_PATH}backup-dd_$(date '+%d').img"