升级前备份清单
系统升级存在一定风险,充分的备份是安全升级的前提。以下清单帮助你在升级前做好完整准备。
备份优先级
| 优先级 | 内容 | 原因 |
|---|---|---|
| 最高 | 用户数据和数据库 | 不可重建 |
| 高 | 系统配置文件 | 手动定制的配置 |
| 中 | 软件包列表和服务状态 | 便于恢复环境 |
| 低 | 完整系统快照 | 快速回滚 |
1. 用户数据备份
个人文件
# 备份整个 home 目录
sudo rsync -avzP /home/ /backup/home/
# 或使用 tar 打包
sudo tar czf /backup/home-backup-$(date +%Y%m%d).tar.gz /home/
# 仅备份指定用户
sudo rsync -avzP /home/username/ /backup/home-username/数据库备份
# MySQL / MariaDB
mysqldump -u root -p --all-databases > /backup/mysql-all-$(date +%Y%m%d).sql
# 单个数据库
mysqldump -u root -p mydb > /backup/mysql-mydb-$(date +%Y%m%d).sql
# PostgreSQL
sudo -u postgres pg_dumpall > /backup/postgres-all-$(date +%Y%m%d).sql
# 单个数据库
sudo -u postgres pg_dump mydb > /backup/postgres-mydb-$(date +%Y%m%d).sql
# Redis
redis-cli BGSAVE
sudo cp /var/lib/redis/dump.rdb /backup/redis-$(date +%Y%m%d).rdb
# MongoDB
mongodump --out /backup/mongodb-$(date +%Y%m%d)/
# SQLite
cp /path/to/database.db /backup/sqlite-$(date +%Y%m%d).db网站和应用数据
# Web 根目录
sudo tar czf /backup/www-$(date +%Y%m%d).tar.gz /var/www/
# Docker 数据卷
docker volume ls
for vol in $(docker volume ls -q); do
docker run --rm -v ${vol}:/data -v /backup:/backup ubuntu \
tar czf /backup/docker-vol-${vol}-$(date +%Y%m%d).tar.gz -C /data .
done
# Docker Compose 项目
cd /path/to/project && docker compose down
tar czf /backup/docker-project-$(date +%Y%m%d).tar.gz /path/to/project/2. 系统配置备份
关键配置文件
# 打包整个 /etc 目录
sudo tar czf /backup/etc-$(date +%Y%m%d).tar.gz /etc/
# 单独备份关键配置
sudo cp -a /etc/ssh/ /backup/ssh-config/
sudo cp -a /etc/nginx/ /backup/nginx-config/
sudo cp -a /etc/apache2/ /backup/apache2-config/
sudo cp -a /etc/netplan/ /backup/netplan-config/
sudo cp -a /etc/samba/ /backup/samba-config/
sudo cp -a /etc/fstab /backup/fstab
sudo cp -a /etc/hosts /backup/hosts
sudo cp -a /etc/crontab /backup/crontabCron 任务
# 系统 cron
sudo cp -a /etc/cron.d/ /backup/cron.d/
sudo cp -a /etc/crontab /backup/crontab
# 用户 cron
crontab -l > /backup/crontab-$(whoami)-$(date +%Y%m%d).txt
# 所有用户的 cron
for user in $(cut -d: -f1 /etc/passwd); do
cron=$(sudo crontab -u $user -l 2>/dev/null)
if [ -n "$cron" ]; then
echo "=== $user ===" >> /backup/crontabs-all.txt
echo "$cron" >> /backup/crontabs-all.txt
fi
donesystemd 自定义服务
# 备份自定义的 systemd 服务文件
sudo tar czf /backup/systemd-custom-$(date +%Y%m%d).tar.gz \
/etc/systemd/system/*.service \
/etc/systemd/system/*.timer \
/etc/systemd/system/*.mount \
2>/dev/null防火墙规则
# UFW 规则
sudo ufw status numbered > /backup/ufw-rules.txt
sudo cp -a /etc/ufw/ /backup/ufw-config/
# iptables 规则
sudo iptables-save > /backup/iptables-$(date +%Y%m%d).rules
sudo ip6tables-save > /backup/ip6tables-$(date +%Y%m%d).rules3. 系统状态记录
已安装软件包
# 完整包列表
dpkg --get-selections > /backup/packages-selections-$(date +%Y%m%d).txt
# 手动安装的包(不含自动依赖)
apt-mark showmanual > /backup/packages-manual-$(date +%Y%m%d).txt
# 包含版本号
dpkg -l > /backup/packages-versions-$(date +%Y%m%d).txt
# Snap 包
snap list > /backup/snap-packages-$(date +%Y%m%d).txt
# Flatpak 包(如有)
flatpak list > /backup/flatpak-packages-$(date +%Y%m%d).txt 2>/dev/null
# pip 包
pip3 list > /backup/pip-packages-$(date +%Y%m%d).txt 2>/dev/nullAPT 源配置
# DEB822 格式源
sudo cp -a /etc/apt/sources.list.d/ /backup/apt-sources.list.d/
# APT 密钥
sudo cp -a /etc/apt/keyrings/ /backup/apt-keyrings/ 2>/dev/null
sudo cp -a /usr/share/keyrings/ /backup/usr-keyrings/ 2>/dev/null
# APT 首选项
sudo cp /etc/apt/preferences.d/* /backup/apt-preferences/ 2>/dev/null网络配置
# 网络状态
ip addr > /backup/ip-addr-$(date +%Y%m%d).txt
ip route > /backup/ip-route-$(date +%Y%m%d).txt
cat /etc/resolv.conf > /backup/resolv-conf-$(date +%Y%m%d).txt
ss -tlnp > /backup/listening-ports-$(date +%Y%m%d).txt运行中的服务
systemctl list-units --type=service --state=running > /backup/services-running-$(date +%Y%m%d).txt
systemctl list-unit-files --state=enabled > /backup/services-enabled-$(date +%Y%m%d).txt内核和引导信息
uname -a > /backup/kernel-$(date +%Y%m%d).txt
cat /proc/cmdline > /backup/cmdline-$(date +%Y%m%d).txt
dpkg --list | grep linux-image > /backup/kernel-packages-$(date +%Y%m%d).txt4. 完整系统备份
使用 Timeshift
# 安装 Timeshift
sudo apt install timeshift -y
# 创建系统快照(RSYNC 模式)
sudo timeshift --create --comments "升级前备份 $(date +%Y%m%d)" --tags D
# 列出快照
sudo timeshift --list使用 rsync 全盘备份
# 全盘备份到外部磁盘
sudo rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/backup/*"} / /mnt/backup/full-system/使用 dd 磁盘镜像
# 创建完整磁盘镜像(需从 Live USB 执行)
sudo dd if=/dev/sda of=/mnt/external/disk-image-$(date +%Y%m%d).img bs=4M status=progress
# 压缩镜像
sudo dd if=/dev/sda bs=4M status=progress | gzip > /mnt/external/disk-image-$(date +%Y%m%d).img.gzLVM 快照
# 如果使用 LVM,创建逻辑卷快照
sudo lvcreate -L 10G -s -n root-snap /dev/vg0/root
# 升级失败后可以从快照恢复
sudo lvconvert --merge /dev/vg0/root-snap虚拟机快照
# KVM/libvirt 虚拟机
virsh snapshot-create-as vm-name pre-upgrade-$(date +%Y%m%d)
# VirtualBox
VBoxManage snapshot "VM Name" take "pre-upgrade"
# 云服务器
# 在云控制台创建系统盘快照5. 一键备份脚本
将以上步骤整合成脚本:
#!/bin/bash
# pre-upgrade-backup.sh
set -euo pipefail
BACKUP_DIR="/backup/pre-upgrade-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
echo "=== 开始升级前备份 ==="
echo "备份目录: $BACKUP_DIR"
# 系统信息
echo ">> 记录系统状态..."
lsb_release -a > "$BACKUP_DIR/lsb-release.txt" 2>&1
uname -a > "$BACKUP_DIR/kernel.txt"
dpkg --get-selections > "$BACKUP_DIR/packages-selections.txt"
apt-mark showmanual > "$BACKUP_DIR/packages-manual.txt"
systemctl list-units --type=service --state=running > "$BACKUP_DIR/services-running.txt"
ip addr > "$BACKUP_DIR/ip-addr.txt"
ss -tlnp > "$BACKUP_DIR/listening-ports.txt"
# 配置文件
echo ">> 备份配置文件..."
sudo tar czf "$BACKUP_DIR/etc.tar.gz" /etc/ 2>/dev/null
# Cron
echo ">> 备份 cron 任务..."
crontab -l > "$BACKUP_DIR/crontab-user.txt" 2>/dev/null || true
# 防火墙
echo ">> 备份防火墙规则..."
sudo ufw status numbered > "$BACKUP_DIR/ufw-rules.txt" 2>/dev/null || true
sudo iptables-save > "$BACKUP_DIR/iptables.rules" 2>/dev/null || true
# 包源
echo ">> 备份 APT 源..."
cp -a /etc/apt/sources.list.d/ "$BACKUP_DIR/sources.list.d/" 2>/dev/null || true
echo "=== 备份完成 ==="
echo "备份文件列表:"
ls -lh "$BACKUP_DIR/"
echo ""
echo "请额外手动备份:"
echo " - 数据库(MySQL/PostgreSQL 等)"
echo " - 用户数据(/home)"
echo " - Web 数据(/var/www)"
echo " - Docker 数据卷"
du -sh "$BACKUP_DIR"# 使用脚本
chmod +x pre-upgrade-backup.sh
sudo ./pre-upgrade-backup.sh备份验证
备份完成后,务必验证备份的完整性:
# 验证 tar 包完整性
tar tzf /backup/etc-*.tar.gz > /dev/null && echo "etc 备份正常"
# 验证数据库备份
# 警告:全库 dump 通常含 CREATE DATABASE / USE 语句,
# 切勿直接 SOURCE 到生产实例,否则会覆盖现有库!
# 安全做法 1:仅检查转储文件完整性
gunzip -t /backup/mysql-all-*.sql.gz && echo "数据库备份压缩完整"
# 若为未压缩 .sql,可检查结尾是否包含 dump 完成标记
tail -n1 /backup/mysql-all-20260324.sql | grep -q "Dump completed" && echo "dump 完整"
# 安全做法 2:在隔离的临时实例(如独立容器/端口)中恢复验证,不要连生产库
# 验证文件数量
echo "原始文件数: $(find /etc -type f | wc -l)"
echo "备份文件数: $(tar tzf /backup/etc-*.tar.gz | wc -l)"
# 确认备份磁盘有足够空间
df -h /backup/检查清单总结
- 用户 home 目录已备份
- 所有数据库已导出
- /etc 配置目录已备份
- cron 任务已记录
- 防火墙规则已保存
- 已安装软件包列表已导出
- APT 源配置已备份
- 网络配置已记录
- 服务列表已记录
- 系统快照已创建(如使用 LVM/Timeshift)
- 备份文件已验证完整性
- 备份存储在不同于系统盘的位置
Last updated on