添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
文章讲述了在管理服务器中遇到的conda环境权限问题。由于不允许使用root账户,但需要sudo权限的用户组,当尝试将所有用户的conda环境放在同一目录下时,出现了权限冲突。作者通过查看conda源码,发现conda在创建环境时通过创建一个测试文件检查目录权限,这个文件的权限限制导致了其他用户无法创建环境。通过修改相关文件的权限,最终解决了问题。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

老师让我管理服务器,我想着让大家的conda环境都放在同一个目录下,即可以节省空间,也可以快速访问别人的项目,但是在配置的过程中发现有权限冲突。
首先,我们的前提是,普通用户是不允许使用root账户的,但是为了方便使用还是给了一个sudo权限的用户组。而我配置conda的时候使用的是root账户。
在全局的conda配置完成之后发现,当第一个用户创建完虚拟环境之后,其他用户的默认环境都放到了自己的home目录下,这一点让我感到莫名奇妙。
我当即检查了可用的虚拟环境存放地址。

conda info 

其中三个分别是我通过CONDA_ENVS_PATH环境变量指定的目录/opt/conda_envs,miniconda的全局envs目录,用户home目录,也就是说conda默认把虚拟环境放到了优先级最低的目录下。
那么,为什么conda既不能访问到我指定的conda_ens目录,也不能访问到miniconda的全局目录呢?
我首先是查看了网上的相关资料,很好,没找到。然后我翻阅了官方文档。同样没有,然后我查找了conda 的issue,也没有。最后我查看了conda的源码,看出了一些端倪。
此时我对conda 有了一些简单的了解,例如,我知道```

conda create -p /path/to/envs

可以在有访问权限的情况下在指定目录下创建虚拟环境,我知道了

conda create -n test -vv

其中v一个是版本,两个是调试,三个是最全面的创建过程追踪。
在两个vv的时候我发现:

DEBUG conda.gateways.logging:set_verbosity(217): verbosity set to 2
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.base.context:root_writable(653): [Errno 13] Permission denied: '/opt/miniconda3/conda-meta/history'
DEBUG conda.core.solve:solve_final_state(296): solving prefix /home/name/.conda/envs/test

它提示我要通过-n的方式创建虚拟环境需要访问这个目录下的history文件,而这个文件因为是root安装的conda,所以普通用户无权写入。
所以我直接给这个目录下的所有文件改成高权限用户组有读写权利

sudo chown :sudo /opt/miniconda3/*
sudo chmod g+w -R /opt/miniconda3/* 

其中第二个sudo是我的ubuntu版本中高权限用户组的名字。
然后我就发现,可以在/opt/miniconda3/envs下创建虚拟环境了,不过这还不够。所以我又

conda create -n test -vvv

在进一步的检查中,他给了我这样的报错:

DEBUG conda.gateways.logging:set_verbosity(217): verbosity set to 3
TRACE conda.base.context:trace(222): Tried envs_dir but not writable: /opt/conda_envs
TRACE conda.base.context:trace(222): Tried envs_dir but not writable: /opt/conda_envs
TRACE conda.base.context:trace(222): Tried envs_dir but not writable: /opt/conda_envs

这个其实就是我觉得最扯淡的地方,因为我已经给了从头到脚的所有文件夹的访问权限,好在我读过源码,我直接拿这个报错去源码里搜索,最后找到这样一段代码:

 envs_dir_magic_file = join(envs_dir, ".conda_envs_dir_test")
 if isfile(envs_dir_magic_file):
         open(envs_dir_magic_file, "a").close()
         return envs_dir
     except OSError:
         log.trace("Tried envs_dir but not writable: %s", envs_dir)

这段代码就是我的报错代码的位置,原来conda在创建环境的时候是通过创建一个测试文件来测试文件夹的读写权限的。而我最开始说了,第一个用户创建之后,其他用户都无法创建了,原因就是这个了,第一个用户创建虚拟环境时这段代码会默认创建并测试这个文件的读写性,这是没有问题的,但是当第二个用户创建虚拟环境时,问题出现了,这个由conda代码生产的文件,他的访问权限是仅限创建者读写,所以其他用户无权写入,conda也就认为这个文件夹是不可读的。
所以我还是直接上管理员权限,

sudo chmod g+w ./.conda_envs_dir_test

然后就好了。

自从安装了LINUX(我的是CentOS 5.7)以后,每当按退格键(BackSpace)删除输入的字符,如果没有字符还按键,电脑就会发出嘟嘟声,用vi、less和man编辑的时候,按方向键,如果到了该方向的末端还继续按方向键,也会发出该报警声。我 深受其害,后终于找到解决的方法。 网上有介绍:vi /etc/inputrc,然后去掉set bell-style none前的注释,修改完,你需要退出当前的shell,再次登录才能生效。这个时候,你可以用按下crtl-g来测试一下。但这样的 做法只能只能命令行