不备份整个 Linux 系统,如何完成开发环境的迁移?——三步法精简备份到 NAS 一条脚本完成
Ubuntu 24 降级 22:250GB 深度学习环境全量备份到 NAS,一条脚本搞定
场景:一台跑了三个月的 Ubuntu 24 深度学习服务器,装了 AnomalyGPT、ComfyUI、Stable Diffusion 等环境,总共约 250GB 用户文件。现在要降级到 Ubuntu 22.04,本地只剩 8GB 空间。怎么完整备份?
答案:分类识别"必保/可重建/可丢弃"三类文件,NAS 网络盘当目标,一条 shell 脚本全自动完成。
一、问题分析
当前状态
$df-h/ Filesystem Size Used Avail Use% Mounted on /dev/nvme0n1p2 457G 426G8.0G99% / $du-sh~/*2>/dev/null|sort-rh|head-10160G /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 WebUI5.1G /home/agent/cuda_*.run# CUDA 安装包矛盾:250GB 的用户数据 vs 8GB 的磁盘空余。本地备份不可能。
解决思路
三步走:
- 分类——哪些必须备份?哪些可从网上下载?哪些是系统缓存可丢弃?
- 选目标——NAS 网络盘(局域网 //192.168.6.197)
- 自动化——一条脚本完成清理→挂载→备份→验证全流程
二、分类策略:什么该备份、什么该丢弃
这是最重要的设计——删对了省空间,删错了丢成果。
规则很简单:问自己"这个文件没了,我能不能通过一条命令恢复?"
| 文件/目录 | 大小 | 能命令恢复? | 备份? | 理由 |
|---|---|---|---|---|
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 → 保(不可恢复) 下载很慢的大模型文件 → 保(虽然能重下,但浪费时间)三、完整备份脚本
#!/bin/bash# ============================================================# Ubuntu 24 深度学习环境全量备份脚本# 功能:清理→挂载NAS→打包备份→验证→卸载# 目标://192.168.6.197/wjp/ubuntu24.04(局域网NAS)# 用量:du -sh /mnt/backup/backup_myfiles_*.tar.gz 查看结果# ============================================================set-eBACKUP_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_*.runrm-f~/cudnn-*.debrm-f~/cuda-keyring_*.deb*# GitHub 项目压缩包rm-f~/stable-diffusion-webui-master.ziprm-f~/wjp/LandPPT-master.zip2>/dev/null# 系统日志(自动生成)rm-f~/.xsession-errors.oldrm-f~/get-docker.sh# apt 缓存sudoaptclean# Python 缓存(运行时自动生成)find~/wjp ~/ComfyUI ~/sd-webui-name"__pycache__"-typed-execrm-rf{}+2>/dev/nullfind~/wjp ~/ComfyUI ~/sd-webui-name"*.pyc"-delete2>/dev/nullrm-rf~/.cache/pip2>/dev/nullecho"[OK] 清理完成,当前磁盘空间:"df-h/|tail-1# ============================================================# 第2步:安装 SMB 客户端并挂载 NAS# ============================================================echo""echo"[2/6] 挂载 NAS 网络盘..."# 安装 cifs-utils(如果还没装)if!command-vmount.cifs&>/dev/null;thensudoaptinstallcifs-utils-yfi# 创建挂载点sudomkdir-p"$MOUNT_POINT"# 如果已经挂载了,先卸载ifmount|grep-q"$MOUNT_POINT";thensudoumount"$MOUNT_POINT"fi# 挂载 NAS(替换 username 和 password 为你的 NAS 凭据)sudomount-tcifs"$NAS_PATH""$MOUNT_POINT"\-ousername=YOUR_USERNAME,password=YOUR_PASSWORD,dir_mode=0777,file_mode=0777# 验证挂载ifmount|grep-q"$MOUNT_POINT";thenecho"[OK] NAS 挂载成功"ls"$MOUNT_POINT"|head-5elseecho"[FAIL] NAS 挂载失败,请检查:"echo" 1. NAS 是否开机"echo" 2. IP 地址是否正确:$NAS_PATH"echo" 3. 用户名密码是否正确"exit1fi# ============================================================# 第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 WebUImodelscope/\# 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个文件)iftar-tzf"$BACKUP_FILE">/dev/null2>&1;thenFILE_COUNT=$(tar-tzf"$BACKUP_FILE"|wc-l)echo" 包含文件数:$FILE_COUNT"echo" 前20个文件:"tar-tzf"$BACKUP_FILE"|head-20echo"[OK] 备份文件完整性验证通过"elseecho"[FAIL] 备份文件可能损坏!请检查 NAS 空间和网络连接"exit1fi# ============================================================# 第5步:保存 Python 包列表(重装后恢复环境用)# ============================================================echo""echo"[5/6] 保存 Python 环境信息..."pip freeze>~/pip_packages.txt# 也复制一份到 NAScp~/pip_packages.txt"${MOUNT_POINT}/pip_packages_${BACKUP_DATE}.txt"echo"[OK] Python 包列表已保存"# ============================================================# 第6步:卸载 NAS# ============================================================echo""echo"[6/6] 卸载 NAS..."sudoumount"$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""四、使用方法
# 1. 把脚本里的 YOUR_USERNAME 和 YOUR_PASSWORD 换成你的 NAS 凭据vimbackup.sh# 2. 运行chmod+x backup.shbashbackup.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?
两个原因:
- 用户名密码不对→ 这是最常见的原因。Windows 共享如果用的是 Microsoft 账户登录,用户名是邮箱格式
- 目录权限→ 加上
dir_mode=0777,file_mode=0777参数
# 如果是 Microsoft 账户sudomount-tcifs //192.168.6.197/wjp/ubuntu24.04 /mnt/backup\-ousername=your@email.com,password=xxx,dir_mode=0777,file_mode=0777Q3:备份到一半断了怎么办?
tar不会断点续传。保险做法是分段打包:
# 把大文件分几个小包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 即可:
python3.10-mvenv ~/ComfyUI/venvsource~/ComfyUI/venv/bin/activate pipinstall-r~/ComfyUI/requirements.txt备份的本质不是"复制文件",而是"识别不可恢复的投入"。模型权重是电费+时间换来的,一行脚本是思路的沉淀——这些才是真正该保护的东西。
