Linux 容器实验环境的数据持久化迁移
记录在 Linux 容器实验环境中,将 /home 下的项目、数据集、环境和输出迁移到持久化目录 /data,并通过软链接保持原路径可用的方法。
Linux 容器实验环境的数据持久化迁移
在使用 Linux 服务器或者云端容器做深度学习实验时,经常会遇到一个问题:项目代码、数据集、虚拟环境和训练输出都放在了 /home 目录下,但真正持久化保存的目录却是 /data。一旦容器重启、重建或者被清理,/home 下的数据可能会丢失,而 /data 目录中的数据仍然保留。
因此,实验环境中一个很重要的习惯就是:把真正重要的数据放到持久化目录 /data,再通过软链接让原来的路径继续可用。
本文记录一次将 /home 下实验目录整体迁移到 /data 的过程。
一、问题背景
我的实验目录原本放在 /home 下,大致包括四类内容:
/home/projects
/home/datasets
/home/envs
/home/outputs
它们分别表示:
projects # 项目代码
datasets # 数据集
envs # Python / Conda 环境
outputs # 训练输出、日志、模型权重
但是服务器真正的持久化目录是:
/data
也就是说,容器重启后,/home 下的数据可能会消失,而 /data 下的数据会继续保留。
所以目标是把它们迁移成:
/home/projects -> /data/projects
/home/datasets -> /data/datasets
/home/envs -> /data/envs
/home/outputs -> /data/outputs
最终效果是:我仍然可以像以前一样访问 /home/projects,但真实数据已经保存在 /data/projects 中。
二、为什么不直接继续用 /home
在普通 Linux 服务器中,/home 通常是用户目录,适合存放个人文件。但在很多云服务器、实验平台或者容器环境中,/home 并不一定是持久化目录,一旦重启,数据就会消失。
如果实验代码、环境、输出都放在 /home,可能会出现这些问题:
容器重启后项目丢失
训练好的模型权重丢失
Conda 环境丢失
日志和实验结果丢失
数据集需要重新下载
对于深度学习实验来说,这些代价都很高。尤其是模型权重、训练日志和配置文件,一旦丢失,很难完整复现实验。
所以更稳妥的做法是:
真正的数据放在 /data
/home 中只保留软链接
三、软链接的原理
Linux 中的软链接可以理解为 Windows 里的快捷方式。
例如执行:
ln -s /data/projects /home/projects
意思是在 /home 目录下创建一个名为 projects 的链接,它指向真实目录:
/data/projects
之后访问:
cd /home/projects
实际上就是在访问:
/data/projects
也就是说:
/home/projects 只是入口
/data/projects 才是真正的数据位置
如果在 /home/projects 里创建文件:
touch /home/projects/test.txt
真实文件会出现在:
/data/projects/test.txt
所以数据并不会真正保存在 /home,而是保存在持久化目录 /data 中。
四、推荐迁移方案
迁移时不建议直接使用 mv,因为如果中间出错,可能不好恢复。更稳妥的方法是:
先用 rsync 复制
检查数据是否完整
把原目录改名备份
创建软链接
确认无误后再删除旧目录
这样即使迁移过程中出问题,也可以从原目录恢复。
五、创建目标目录
首先在 /data 下创建对应目录:
mkdir -p /data/datasets /data/envs /data/outputs /data/projects
这四个目录分别用于保存:
/data/projects # 项目代码
/data/datasets # 数据集
/data/envs # 实验环境
/data/outputs # 训练输出
六、复制数据到 /data
使用 rsync 复制数据:
rsync -avh --partial --progress /home/datasets/ /data/datasets/
rsync -avh --partial --progress /home/envs/ /data/envs/
rsync -avh --partial --progress /home/outputs/ /data/outputs/
rsync -avh --partial --progress /home/projects/ /data/projects/
这里需要注意路径后面的 /。
例如:
/home/projects/
表示复制 /home/projects 目录里面的内容到 /data/projects。
参数含义:
-a 保留文件权限、时间等信息
-v 显示详细过程
-h 以更易读的方式显示文件大小
--partial 中断后保留已复制部分,方便继续
--progress 显示复制进度
如果数据很多,中间断开也没关系,重新执行同样的命令即可继续同步。
七、检查迁移结果
复制完成后,先检查目录大小:
du -sh /home/datasets /data/datasets
du -sh /home/envs /data/envs
du -sh /home/outputs /data/outputs
du -sh /home/projects /data/projects
再检查文件数量:
find /home/datasets -type f | wc -l
find /data/datasets -type f | wc -l
find /home/envs -type f | wc -l
find /data/envs -type f | wc -l
find /home/outputs -type f | wc -l
find /data/outputs -type f | wc -l
find /home/projects -type f | wc -l
find /data/projects -type f | wc -l
如果大小和文件数量基本一致,说明迁移大概率成功。
八、备份原目录
确认数据已经复制到 /data 后,不要立刻删除 /home 下的原目录,而是先改名备份:
mv /home/datasets /home/datasets_old
mv /home/envs /home/envs_old
mv /home/outputs /home/outputs_old
mv /home/projects /home/projects_old
这样原数据还保留着,后面如果发现有问题,还可以恢复。
九、创建软链接
接着创建软链接:
ln -s /data/datasets /home/datasets
ln -s /data/envs /home/envs
ln -s /data/outputs /home/outputs
ln -s /data/projects /home/projects
创建完成后,/home 下的这四个目录就不再是真实目录,而是指向 /data 的链接。
可以使用下面的命令检查:
ls -l /home
正常情况下,会看到类似结果:
datasets -> /data/datasets
envs -> /data/envs
outputs -> /data/outputs
projects -> /data/projects
这表示软链接已经创建成功。
十、验证真实路径
进入项目目录:
cd /home/projects
查看当前路径:
pwd
可能会显示:
/home/projects
但如果查看真实物理路径:
pwd -P
应该会显示:
/data/projects
这说明虽然表面上访问的是 /home/projects,但真实读写位置已经变成了 /data/projects。
十一、确认无误后删除旧目录
在确认项目、数据集、环境和训练输出都可以正常使用后,再删除旧目录:
rm -rf /home/datasets_old
rm -rf /home/envs_old
rm -rf /home/outputs_old
rm -rf /home/projects_old
这一步不要急着执行,建议至少确认能正常运行一次实验后再删除。
十二、完整命令汇总
下面是完整迁移命令:
mkdir -p /data/datasets /data/envs /data/outputs /data/projects
rsync -avh --partial --progress /home/datasets/ /data/datasets/
rsync -avh --partial --progress /home/envs/ /data/envs/
rsync -avh --partial --progress /home/outputs/ /data/outputs/
rsync -avh --partial --progress /home/projects/ /data/projects/
du -sh /home/datasets /data/datasets
du -sh /home/envs /data/envs
du -sh /home/outputs /data/outputs
du -sh /home/projects /data/projects
mv /home/datasets /home/datasets_old
mv /home/envs /home/envs_old
mv /home/outputs /home/outputs_old
mv /home/projects /home/projects_old
ln -s /data/datasets /home/datasets
ln -s /data/envs /home/envs
ln -s /data/outputs /home/outputs
ln -s /data/projects /home/projects
ls -l /home
十三、后续实验习惯
迁移完成后,后续实验可以继续使用原路径:
cd /home/projects
但真实数据已经保存在:
/data/projects
以后新项目可以直接克隆到:
/data/projects
或者仍然通过软链接路径进入:
/home/projects
两者本质上访问的是同一个地方。
训练输出也建议统一放到:
/data/outputs
例如:
/data/outputs/ccreid/exp01
/data/outputs/ccreid/exp02
这样每次实验的日志、模型权重和配置文件都能被持久化保存。
十四、总结
在容器环境中做实验时,不要默认认为 /home 是安全的。更稳妥的方案是:
代码放 /data/projects
数据集放 /data/datasets
环境放 /data/envs
输出放 /data/outputs
/home 下通过软链接指向 /data
这样既能保持原来的使用习惯,又能保证数据真正保存在持久化目录中。
这种方式非常适合云服务器、实验平台、Docker 容器和需要长期保存实验结果的深度学习项目。
相关文章
项目迁移到持久化目录后Git显示所有文件Modified
记录一次项目迁移到持久化目录后,Git将大量文件标记为modified的问题排查过程。
PPU显卡环境配置
PPU 显卡服务器深度学习环境配置指南,介绍如何继承系统 PPU 版 PyTorch、创建虚拟环境、安装安全依赖,并处理 torch 不可用和依赖冲突等常见问题。
服务器访问外网:Clash + SSH 反向代理 + 自动重连
本地Windows电脑开启 Clash 代理,然后通过SSH反向隧道,让服务器访问本地Clash代理,从而实现服务器访问外网。
评论
#评论正在加载。如果这里一直没有内容,请检查手机网络是否能访问 GitHub Discussions 和 giscus.app。