不备份整个 Linux 系统,如何完成开发环境的迁移?——三步法精简备份到 NAS 一条脚本完成

Ubuntu 24 降级 22:250GB 深度学习环境全量备份到 NAS,一条脚本搞定

场景:一台跑了三个月的 Ubuntu 24 深度学习服务器,装了 AnomalyGPT、ComfyUI、Stable Diffusion 等环境,总共约 250GB 用户文件。现在要降级到 Ubuntu 22.04,本地只剩 8GB 空间。怎么完整备份?
答案:分类识别"必保/可重建/可丢弃"三类文件,NAS 网络盘当目标,一条 shell 脚本全自动完成。

一、问题分析

当前状态

bash 复制代码
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  457G  426G  8.0G  99% /

$ du -sh ~/* 2>/dev/null | sort -rh | head -10
160G    /home/agent/wjp          # AnomalyGPT + IAD-R1 项目(源码+模型+数据集+checkpoint)
55G     /home/agent/ComfyUI      # ComfyUI + 49GB SD 模型
22G     /home/agent/openclaw-cn  # 其他项目
6.5G    /home/agent/sd-webui     # Stable Diffusion WebUI
5.1G    /home/agent/cuda_*.run   # CUDA 安装包

矛盾:250GB 的用户数据 vs 8GB 的磁盘空余。本地备份不可能。

解决思路

三步走:

  1. 分类------哪些必须备份?哪些可从网上下载?哪些是系统缓存可丢弃?
  2. 选目标------NAS 网络盘(局域网 //192.168.6.197
  3. 自动化------一条脚本完成清理→挂载→备份→验证全流程

二、分类策略:什么该备份、什么该丢弃

这是最重要的设计------删对了省空间,删错了丢成果。

规则很简单:问自己"这个文件没了,我能不能通过一条命令恢复?"

文件/目录 大小 能命令恢复? 备份? 理由
wjp/(项目源码+模型+训练checkpoint) 160GB ❌ 训练了70小时的模型不可恢复 核心成果
ComfyUI/models/(Stable Diffusion模型) 49GB ✅ 可从 HuggingFace/CivitAI 重下 下载太慢,备份更省时间
ComfyUI/(本体) 6GB git clone 即可 跟着 models 一起走
openclaw-cn/ 22GB ❌ 自己安装配置的项目
sd-webui/ 6.5GB git clone
cuda_*.run 5.1GB ✅ NVIDIA 官网随时下载 删,省空间
cudnn-*.deb 1.5GB ✅ NVIDIA 官网
stable-diffusion-webui-master.zip 1.9GB ✅ GitHub
.cache/ __pycache__/ *.pyc ~2GB 自动生成
~/.xsession-errors.old 308MB 系统自动

核心原则

复制代码
能一行命令重装的 → 删(省空间)
训练出来的权重/checkpoint → 保(不可恢复)
下载很慢的大模型文件 → 保(虽然能重下,但浪费时间)

三、完整备份脚本

bash 复制代码
#!/bin/bash
# ============================================================
#  Ubuntu 24 深度学习环境全量备份脚本
#  功能:清理→挂载NAS→打包备份→验证→卸载
#  目标://192.168.6.197/wjp/ubuntu24.04(局域网NAS)
#  用量:du -sh /mnt/backup/backup_myfiles_*.tar.gz 查看结果
# ============================================================
set -e

BACKUP_DATE=$(date +%Y%m%d)
NAS_PATH="//192.168.6.197/wjp/ubuntu24.04"
MOUNT_POINT="/mnt/backup"
BACKUP_FILE="${MOUNT_POINT}/backup_myfiles_${BACKUP_DATE}.tar.gz"

echo "=========================================="
echo "  Ubuntu 24 深度学习环境备份"
echo "  日期: $BACKUP_DATE"
echo "  目标: $NAS_PATH"
echo "=========================================="

# ============================================================
# 第1步:清理可重新下载的文件(释放本地空间,加快压缩)
# ============================================================
echo ""
echo "[1/6] 清理可恢复文件..."

# NVIDIA 安装包(随时可从官网下载)
rm -f ~/cuda_*.run
rm -f ~/cudnn-*.deb
rm -f ~/cuda-keyring_*.deb*

# GitHub 项目压缩包
rm -f ~/stable-diffusion-webui-master.zip
rm -f ~/wjp/LandPPT-master.zip 2>/dev/null

# 系统日志(自动生成)
rm -f ~/.xsession-errors.old
rm -f ~/get-docker.sh

# apt 缓存
sudo apt clean

# Python 缓存(运行时自动生成)
find ~/wjp ~/ComfyUI ~/sd-webui -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null
find ~/wjp ~/ComfyUI ~/sd-webui -name "*.pyc" -delete 2>/dev/null
rm -rf ~/.cache/pip 2>/dev/null

echo "[OK] 清理完成,当前磁盘空间:"
df -h / | tail -1

# ============================================================
# 第2步:安装 SMB 客户端并挂载 NAS
# ============================================================
echo ""
echo "[2/6] 挂载 NAS 网络盘..."

# 安装 cifs-utils(如果还没装)
if ! command -v mount.cifs &> /dev/null; then
    sudo apt install cifs-utils -y
fi

# 创建挂载点
sudo mkdir -p "$MOUNT_POINT"

# 如果已经挂载了,先卸载
if mount | grep -q "$MOUNT_POINT"; then
    sudo umount "$MOUNT_POINT"
fi

# 挂载 NAS(替换 username 和 password 为你的 NAS 凭据)
sudo mount -t cifs "$NAS_PATH" "$MOUNT_POINT" \
    -o username=YOUR_USERNAME,password=YOUR_PASSWORD,dir_mode=0777,file_mode=0777

# 验证挂载
if mount | grep -q "$MOUNT_POINT"; then
    echo "[OK] NAS 挂载成功"
    ls "$MOUNT_POINT" | head -5
else
    echo "[FAIL] NAS 挂载失败,请检查:"
    echo "  1. NAS 是否开机"
    echo "  2. IP 地址是否正确: $NAS_PATH"
    echo "  3. 用户名密码是否正确"
    exit 1
fi

# ============================================================
# 第3步:打包备份(核心步骤)
# ============================================================
echo ""
echo "[3/6] 开始打包备份(可能需要 1-2 小时)..."
echo "  备份中,请耐心等待..."

cd ~

# 注意:这里列出的是需要备份的目录和文件
# 如果你的环境不同,修改这里的列表即可
tar -czvf "$BACKUP_FILE" \
    wjp/ \                      # AnomalyGPT + IAD-R1(源码+模型+checkpoint+数据集)
    ComfyUI/ \                  # ComfyUI 完整环境
    openclaw-cn/ \              # openclaw 项目
    sd-webui/ \                 # Stable Diffusion WebUI
    modelscope/ \               # ModelScope 模型缓存
    ppt/ \                      # PPT 文件
    skills/ \                   # 自定义技能
    Documents/ \                # 文档
    Downloads/ \                # 下载文件
    Desktop/ \                  # 桌面文件
    .bashrc .bash_history .zshrc \   # shell 配置和历史
    .npmrc \                    # npm 配置
    .ssh/ \                     # SSH 密钥(重要!)
    claw-config.json \          # 项目配置
    create_ppt.py create_ppt.py.bak \
    final_ppt_creator.py final_ppt_creator.py.bak \
    generate_images_comfyui.py generate_images_comfyui.py.bak \
    generate_images.py generate_images.py.bak \
    generate_ppt.py generate_ppt.py.bak \
    prompt_generator.py prompt_generator.py.bak \
    replace.py.bak

# ============================================================
# 第4步:验证备份完整性
# ============================================================
echo ""
echo "[4/6] 验证备份文件..."

# 显示文件大小
FILE_SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
echo "  文件大小: $FILE_SIZE"

# 测试 tar 包是否完整(列出前20个文件)
if tar -tzf "$BACKUP_FILE" > /dev/null 2>&1; then
    FILE_COUNT=$(tar -tzf "$BACKUP_FILE" | wc -l)
    echo "  包含文件数: $FILE_COUNT"
    echo "  前20个文件:"
    tar -tzf "$BACKUP_FILE" | head -20
    echo "[OK] 备份文件完整性验证通过"
else
    echo "[FAIL] 备份文件可能损坏!请检查 NAS 空间和网络连接"
    exit 1
fi

# ============================================================
# 第5步:保存 Python 包列表(重装后恢复环境用)
# ============================================================
echo ""
echo "[5/6] 保存 Python 环境信息..."

pip freeze > ~/pip_packages.txt

# 也复制一份到 NAS
cp ~/pip_packages.txt "${MOUNT_POINT}/pip_packages_${BACKUP_DATE}.txt"
echo "[OK] Python 包列表已保存"

# ============================================================
# 第6步:卸载 NAS
# ============================================================
echo ""
echo "[6/6] 卸载 NAS..."
sudo umount "$MOUNT_POINT"
echo "[OK] NAS 已安全卸载"

# ============================================================
# 完成
# ============================================================
echo ""
echo "=========================================="
echo "  备份完成!"
echo "  文件: $BACKUP_FILE"
echo "  大小: $FILE_SIZE"
echo "=========================================="
echo ""
echo "后续操作指南:"
echo ""
echo "  1. 制作 Ubuntu 22.04 启动盘(用 Rufus 或 balenaEtcher)"
echo "  2. 从 U 盘启动 → 安装 Ubuntu 22.04"
echo "  3. 安装完成后,恢复文件:"
echo ""
echo "     # 挂载 NAS"
echo "     sudo mkdir -p /mnt/backup"
echo "     sudo mount -t cifs $NAS_PATH /mnt/backup \\"
echo "       -o username=YOUR_USERNAME,password=YOUR_PASSWORD"
echo ""
echo "     # 解压到 home 目录"
echo "     tar -xzvf $BACKUP_FILE -C ~/"
echo ""
echo "     # 恢复 Python 环境"
echo "     python3.10 -m venv ~/wjp/AnomalyGPT-main/venv"
echo "     source ~/wjp/AnomalyGPT-main/venv/bin/activate"
echo "     pip install -r /mnt/backup/pip_packages_${BACKUP_DATE}.txt"
echo ""
echo "  4. 重装 NVIDIA 驱动和 CUDA(从官网下载)"
echo "     https://developer.nvidia.com/cuda-downloads"
echo ""

四、使用方法

bash 复制代码
# 1. 把脚本里的 YOUR_USERNAME 和 YOUR_PASSWORD 换成你的 NAS 凭据
vim backup.sh

# 2. 运行
chmod +x backup.sh
bash backup.sh

运行过程中你会看到

复制代码
[1/6] 清理可恢复文件...
[OK] 清理完成,当前磁盘空间:
/dev/nvme0n1p2  457G  410G  24G  95% /

[2/6] 挂载 NAS 网络盘...
[OK] NAS 挂载成功

[3/6] 开始打包备份(可能需要 1-2 小时)...
wjp/
wjp/AnomalyGPT-main/
wjp/AnomalyGPT-main/code/
...
(大量文件列表滚动...)

[4/6] 验证备份文件...
  文件大小: 191G
  包含文件数: 152347
  [OK] 备份文件完整性验证通过

[5/6] 保存 Python 环境信息...
[OK] Python 包列表已保存

[6/6] 卸载 NAS...
[OK] NAS 已安全卸载

==========================================
  备份完成!
  文件: /mnt/backup/backup_myfiles_20260624.tar.gz
  大小: 191G
==========================================

五、核心思路总结

这个备份方案的精华不在于脚本本身,而在于分类决策框架

三类文件的判定规则

复制代码
┌──────────────────────────────────────────────────┐
│                                                  │
│  文件能通过"一条命令"恢复吗?                      │
│                                                  │
│  YES ──→ 删除,省空间                            │
│  NO  ──→ 必须备份                                │
│  YES 但太慢 ──→ 也备份(时间也是成本)             │
│                                                  │
└──────────────────────────────────────────────────┘

实际应用

场景 例子 判定 操作
训练出来的模型权重 step_420000.pt 花了 51 小时才训练出来,无法恢复 ✅ 备份
Stable Diffusion 模型 v1-5-pruned.safetensors 能重新下载但需 30 分钟 ✅ 备份
CUDA 安装包 cuda_12.8.run NVIDIA 官网 2 分钟下载 ❌ 删除
Python 缓存 __pycache__/ 运行 python xx.py 自动生成 ❌ 删除
项目源码 AnomalyGPT/ git clone 能恢复 ✅ 备份(含自己的改动)
SSH 密钥 .ssh/id_rsa 无法恢复,丢了要重新配所有服务器 ✅ 备份
shell 历史 .bash_history 记录了所有操作命令 ✅ 备份

关键决策点:大模型文件备份 vs 重下载

复制代码
ComfyUI 的 SD 模型(49GB):
  方案A:不备份,重装后花2小时重新下载
  方案B:备份,多占49GB压缩空间

  我选B。因为:
  - NAS 有几百 GB 空余 → 空间不是瓶颈
  - HuggingFace 下载速度不稳定(国内可能限速)
  - 2 小时能省下来做别的事

网络盘 vs 移动硬盘

NAS 移动硬盘
速度 千兆局域网 ~100MB/s USB 3.0 ~100MB/s
额外设备 不需要 要插拔
故障风险 低(RAID) 摔一下就坏
适合 长期备份 临时拷贝

六、常见问题

Q1:tar 包 191GB,NAS 能放下吗?

先确认 NAS 剩余空间。Windows 共享文件夹右键 → 属性就能看。我的 NAS 有 1TB 空余,完全够。

Q2:挂载报 Permission denied

两个原因:

  1. 用户名密码不对 → 这是最常见的原因。Windows 共享如果用的是 Microsoft 账户登录,用户名是邮箱格式
  2. 目录权限 → 加上 dir_mode=0777,file_mode=0777 参数
bash 复制代码
# 如果是 Microsoft 账户
sudo mount -t cifs //192.168.6.197/wjp/ubuntu24.04 /mnt/backup \
    -o username=your@email.com,password=xxx,dir_mode=0777,file_mode=0777

Q3:备份到一半断了怎么办?

tar 不会断点续传。保险做法是分段打包:

bash 复制代码
# 把大文件分几个小包
tar -czvf /mnt/backup/backup_part1.tar.gz wjp/ComfyUI/
tar -czvf /mnt/backup/backup_part2.tar.gz wjp/AnomalyGPT-main/
# ...

Q4:恢复后 ComfyUI 跑不起来怎么办?

大概率是 Python 虚拟环境路径变了。重建 venv 即可:

bash 复制代码
python3.10 -m venv ~/ComfyUI/venv
source ~/ComfyUI/venv/bin/activate
pip install -r ~/ComfyUI/requirements.txt

备份的本质不是"复制文件",而是"识别不可恢复的投入"。模型权重是电费+时间换来的,一行脚本是思路的沉淀------这些才是真正该保护的东西。