Skip to Content
文档运维升级与迁移升级前备份清单

升级前备份清单

系统升级存在一定风险,充分的备份是安全升级的前提。以下清单帮助你在升级前做好完整准备。

备份优先级

优先级内容原因
最高用户数据和数据库不可重建
高系统配置文件手动定制的配置
中软件包列表和服务状态便于恢复环境
低完整系统快照快速回滚

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/crontab

Cron 任务

# 系统 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 done

systemd 自定义服务

# 备份自定义的 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).rules

3. 系统状态记录

已安装软件包

# 完整包列表 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/null

APT 源配置

# 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).txt

4. 完整系统备份

使用 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.gz

LVM 快照

# 如果使用 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