工程实践 2026年6月14日 10 分钟阅读 2127 字

Linux 容器实验环境的数据持久化迁移

记录在 Linux 容器实验环境中,将 /home 下的项目、数据集、环境和输出迁移到持久化目录 /data,并通过软链接保持原路径可用的方法。

Linux 容器实验环境的数据持久化迁移 封面图

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 容器和需要长期保存实验结果的深度学习项目。

相关文章

评论

#

评论正在加载。如果这里一直没有内容,请检查手机网络是否能访问 GitHub Discussions 和 giscus.app。