指定可用空间路径创建Conda环境仍报磁盘配额超限问题问询
多文件系统挂载环境下,用户主目录磁盘空间/配额已耗尽,其他挂载路径存在充足可用存储。已通过--prefix参数指定conda环境安装路径、配置CONDA_PKGS_DIRS环境变量修改包缓存路径,执行环境创建命令时仍触发[Errno 122] Disk quota exceeded报错,完整报错栈如下:
Traceback (most recent call last): File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/exceptions.py", line 1079, in __call__ return func(*args, **kwargs) File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/cli/main.py", line 84, in _main exit_code = do_call(args, p) File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/cli/conda_argparse.py", line 83, in do_call return getattr(module, func_name)(args, parser) File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/cli/main_create.py", line 41, in execute install(args, parser, 'create') File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/cli/install.py", line 317, in install handle_txn(unlink_link_transaction, prefix, args, newenv) File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/cli/install.py", line 346, in handle_txn unlink_link_transaction.execute() File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/core/link.py", line 250, in execute self._execute(tuple(concat(interleave(itervalues(self.prefix_action_groups))))) File "/apps/x86_64/software/Anaconda3/2021.05/lib/python3.8/site-packages/conda/core/link.py", line 713, in _execute raise CondaMultiError(tuple(concatv( conda.CondaMultiError: [Errno 122] Disk quota exceeded
已执行的操作命令:
conda create --prefix ./path_where_there_is_space python=3.9 export CONDA_PKGS_DIRS=path_where_there_is_space
核心需求:完成所有必要配置,让conda运行全程不向主目录写入任何文件。
仅修改环境安装路径、包缓存路径无法覆盖conda所有默认写入位置。conda默认会将用户配置、运行临时文件、插件/日志缓存三类数据写入主目录下的~/.conda、~/.cache路径,只要其中任意一个路径所在分区空间不足,就会触发磁盘配额超限报错。另外之前配置时使用相对路径指定缓存目录,conda运行时工作目录变动会导致路径识别失败,自动回退到主目录默认路径。
所有路径必须使用绝对路径,替换示例中的/data/your_username/conda_space为你自己的充足空间路径即可。
- 提前创建好分类存储目录:
mkdir -p /data/your_username/conda_space/{pkgs,envs,config,tmp,cache}
- 执行以下命令配置全量环境变量,覆盖所有conda默认写入主目录的路径:
# 重定向包缓存目录 export CONDA_PKGS_DIRS=/data/your_username/conda_space/pkgs # 重定向conda用户配置目录,替代默认~/.conda export CONDA_HOME=/data/your_username/conda_space/config # 重定向conda环境默认存储路径 export CONDA_ENVS_PATH=/data/your_username/conda_space/envs # 重定向运行时临时文件目录,覆盖事务执行阶段的临时写入需求 export TMPDIR=/data/your_username/conda_space/tmp # 重定向用户缓存目录,替代默认~/.cache下的conda缓存 export XDG_CACHE_HOME=/data/your_username/conda_space/cache
- 校验配置是否生效:
conda config --show envs_dirs pkgs_dirs
确认输出的所有路径均为你指定的新路径,不存在主目录(/home/你的用户名)下的路径。如果主目录下残留旧的.condarc配置文件,直接移动到新的CONDA_HOME目录下或者删除即可,避免conda读取旧配置触发主目录写入。
- 杀掉所有残留的conda进程,避免旧进程加载历史配置:
pkill -f conda
- 重新执行环境创建命令,
--prefix指定的路径放到新建的envs目录下:
conda create --prefix /data/your_username/conda_space/envs/py39 python=3.9
如果需要配置永久生效,把第二步的所有export命令写入shell配置文件即可。主目录完全写满无法编辑配置文件的,可以先清理几KB无用的日志、缓存文件腾空间,或者先在当前shell执行完命令创建好环境再做持久化配置。
- 漏配
TMPDIR是最高发的问题:conda执行包解压、硬链接/软链接创建事务时,会优先往临时目录写入中间文件,系统默认临时目录如果落在满的主目录/根分区,哪怕其他路径都配置正确也会报错。 - 不要用相对路径配置任何conda相关路径:conda执行过程中会切换工作目录,相对路径会解析失败触发默认路径回退。
- 配置完不要立刻复用之前的shell会话:残留的conda进程、环境变量缓存都会导致新配置不生效,杀完进程重新开shell或者重新source环境变量最稳妥。
内容的提问来源于stack exchange,提问作者abinitio

