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"