ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux服务器创建新用户并安装Miniconda完整指南

Linux服务器创建新用户并安装Miniconda完整指南 上个月给实验室新来的师弟配了一台 GPU 服务器任务清单里排在最前面的就是“Linux 创建新用户并安装 Miniconda”。本来以为是很常规的操作结果他还是折腾到了半夜——不是 Linux 本身有多难而是他一开始就用 root 登录直接往系统 Python 里装包后面一开项目就报依赖冲突。我后来干脆把整套流程重新顺了一遍用一个独立的系统用户给 Ta 建好家目录、配好 sudo 权限再单独安装一份 Miniconda以后 Python 包随便折腾都不会污染系统环境。这篇就是我当时的操作笔记适合刚接触 Linux 服务器的同学、实验室管理员以及任何需要在多人服务器上维护独立开发环境的开发者。1. 先理清楚为什么是“新用户 安装 Miniconda”1.1 这套组合拳解决的实际问题很多人拿到一台 Linux 服务器第一反应是“root 什么都能干直接在 root 下面装 Python 不就行了”。短期看确实方便但长期看就是在给自己埋雷。root 用户权限太大一个pip install写错路径或者误删了/usr/lib/python3下面的文件轻则某个服务起不来重则整个系统需要重新修复。更重要的是一台生产服务器往往不止一个人在用。实验室服务器、公司开发机、云主机通常会有多个开发人员共同登录。如果没有独立的用户账号所有人都在同一个家目录里操作文件互相覆盖、环境互相踩踏最后谁也说不清楚自己的代码跑在哪个 Python 版本上。创建新用户的目的就是把每个人的工作空间彻底隔离开。Miniconda 在这里又补上了第二层隔离。系统自带的 Python 通常只有一个版本而且很多 Linux 发行版的底层工具都依赖它你没法随意升级、替换。Miniconda 则可以安装在用户自己的目录下每个项目能用conda create建出独立的虚拟环境Python 版本可以指定到 3.9、3.11 甚至 3.12。内核环境保持干净项目环境自由切换两边互不干扰。1.2 适用场景与前置条件这套流程最典型的场景是一台 Linux 服务器需要多人使用每个使用者都要有一套独立的 Python 开发环境。无论你是做后端开发、深度学习训练还是数据分析基本都会走到这一步。也有的公司喜欢给每个项目单独开一台虚拟机在虚拟机里用普通用户安装 Miniconda思路完全一样。动手之前确认几件事你必须有 root 权限或者 sudo 权限否则无法创建新用户。服务器能正常联网因为 Miniconda 安装包需要下载。知道自己的 Linux 发行版。Ubuntu、Debian 和 CentOS、Rocky Linux 在用户管理细节上有差异下面我会标出来。明确要安装 Miniconda 的用户是哪个。这篇笔记里我会用一个叫dev的用户来演示你换成自己的账号名即可。我写这篇笔记时的环境是 Ubuntu 22.04Shell 是 bash。如果你用 zsh或者 CentOS 系列我会在对应步骤做出说明。2. 创建 Linux 新用户先管好权限再做环境2.1 useradd 与 adduser到底该用哪个刚接触 Linux 的人第一次搜“创建用户”多半会看到两个命令useradd和adduser。这两个名字很像实际上容易混淆。先说结论交互式使用推荐adduser批量脚本或者自动化部署用useradd。useradd是一个底层工具参数非常灵活但它默认很“抠门”。如果你直接执行sudo useradd dev系统只会创建一个账号记录不会创建家目录不会复制 Shell 配置文件也不会主动询问密码。很多新手在 CentOS 上跑完useradd dev然后发现/home/dev根本不存在其实就是漏了参数。adduser实际上是useradd的一个友好封装脚本。在 Debian、Ubuntu 系发行版上它会一步步询问密码、全名等自动创建家目录、初始化 Shell 环境对新手极其友好。但在 CentOS、RHEL 系列里adduser又只是useradd的符号链接不会帮你做那些交互操作。所以要看你所处的发行版来定。对比项useraddadduser默认创建家目录不会需要加-mUbuntu/Debian 会自动创建交互提示无纯参数控制会询问密码和用户信息适用场景脚本批量创建手动少量创建CentOS 上的表现原始终端工具等价于 useradd无封装2.2 用 adduser 完整创建一个用户在 Ubuntu 上创建新用户直接执行sudo adduser dev系统会开始交互大概长这样正在添加用户dev... 正在添加新组dev (1002)... 正在添加新用户dev (1002) 到组dev... 创建主目录/home/dev... 正在从/etc/skel复制文件... 新的密码密码输入两次之后还会问一堆全名、房间电话之类的信息这些可以直接按回车跳过。完成后可以验证一下id dev输出会显示用户的 UID、GID 以及所属组。如果你在 CentOS 或 Rocky Linux 上adduser不会走交互流程那就用显式参数创建sudo useradd -m -s /bin/bash dev sudo passwd dev-m表示创建家目录-s /bin/bash表示把默认 Shell 设置为 Bash。用户创建成功后密码用passwd单独设置。2.3 授权 sudo 的正确姿势新用户默认没有 sudo 权限但这并不意味着你必须给每个人开这个权限。但要完成后续安装、配置系统级依赖sudo 还是挺常用的。我的建议是在受控的团队环境里可以先给普通开发者加入 sudo 组但明确告知“sudo 只是为了装系统软件不要用它来装 Python 包”。Ubuntu / Debian 上把用户加入 sudo 组sudo usermod -aG sudo dev这里的-aG值得单独说一下。-G是用来设置附加组的但它默认会“覆盖”用户原有的附加组列表直接把用户替换成你指定的组。加一个-a表示 append也就是在原有附加组基础上追加。所以修改用户组时尽量用sudo usermod -aG 组名 用户名别漏了-a否则可能把用户从某些关键组里悄悄踢出去。CentOS / Rocky Linux 上对应的是 wheel 组sudo usermod -aG wheel dev执行完之后需要确认一下dev用户是不是能正常使用 sudo。最简单的方法su - dev sudo whoami如果输出root说明 sudo 配置生效。2.4 远程登录与公钥配置如果这台服务器需要从外部 SSH 登录新用户还要配置远程登录权限。很多服务器默认禁止 root 远程登录但其他用户仍然可以通过密码登录。出于安全和方便考虑我更推荐给新用户配置 SSH 公钥替代密码登录。先用刚才的权限切到dev用户su - dev mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys然后把你的公钥内容追加到authorized_keys文件里。这里最容易被忽略的是目录权限.ssh目录必须是 700authorized_keys文件必须是 600否则 SSH 服务端会拒绝使用这个公钥直接回退到密码登录。另外如果/home/dev目录本身对“其他人”权限过宽SSH 也会拒绝加载公钥。我习惯把家目录权限设置成chmod 700 /home/dev保证只有用户自己可以访问。3. 下载并安装 Miniconda3.1 官网下载与镜像源下载怎么选Miniconda 的下载方式主要取决于你的网络环境。网络顺畅时直接从 Miniconda 官网下载即可wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh如果你的机器是 ARM 架构比如部分云服务器、树莓派、国产芯片机器要把链接里的x86_64换成aarch64wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh不确定架构的话先跑一下uname -m输出是x86_64就选第一个aarch64就选第二个。网络不好、下载经常超时的话我会优先使用清华开源软件镜像站的 Miniconda 目录。镜像站提供了同样的安装脚本文件名保持一致可以在对应目录里选择版本。镜像下载速度通常比境外直连稳定得多而且用于个人学习和开发非常方便。3.2 安装脚本的完整执行过程下载完成后别急着执行。先做一个校验防止文件不完整或者被篡改sha256sum Miniconda3-latest-Linux-x86_64.sh把这个输出的哈希值和官方页面公布的哈希值对比一下。如果一致再继续安装。接下来是最关键的一步一定要用普通用户身份安装不要用 sudo。切换用户su - dev然后执行bash Miniconda3-latest-Linux-x86_64.sh -b -p ~/miniconda3这里的-b表示 batch 模式跳过交互提问和许可协议阅读适合无人值守安装。-p指定安装路径安装到当前用户的家目录下的miniconda3目录。如果不加这两个参数安装脚本会问你是否接受许可协议、安装到哪个目录、是否初始化 conda那也完全可以只是要多按几次回车。为了一点经验我特别想说千万不要手滑写成sudo bash Miniconda3-latest-Linux-x86_64.sh。一旦加了 sudo安装目录就可能变成/root/miniconda3所有文件的所有者也变成 root后续dev用户根本无法正常创建环境。如果真装错了最直接的解决方案是删掉重装别图省事去一股脑chown环境不干净后面问题更多。3.3 conda init 与 PATH 配置安装脚本执行完MinConda 目录已经生成了。但此时在终端直接敲conda大概率会提示command not found。原因很简单安装程序不会自动把conda命令加入当前 Shell 的 PATH。正确做法是执行一次初始化~/miniconda3/bin/conda init bash如果你用 zsh把最后一个参数换成zsh即可。这个命令会往~/.bashrc末尾写入一坨初始化代码内容包括多个 conda 函数定义、PATH 路径调整等。很多人会手动往.bashrc里写一行export PATH~/miniconda3/bin:$PATH但我不建议这样代替conda init。因为conda init不只是改 PATH它还注册了 Shell 函数让conda activate、conda deactivate这些交互命令工作得更自然。只用一行 export很多时候会出现“conda 命令找得到但 activate 切换环境却报错”的情况。初始化之后重新加载配置source ~/.bashrc或者干脆退出终端重新登录。之后在终端输入conda应该就能正常识别了。3.4 安装后的验证清单环境配置好之后别急着开始装包先做一轮快速验证which conda conda --version which python python --version正常情况下which conda应该指向/home/dev/miniconda3/bin/condawhich python应该指向/home/dev/miniconda3/bin/python。python --version显示的是 Miniconda 自带的 Python 版本。这里要特别注意此时你运行的python已经不是系统自带的/usr/bin/python3了。这是 Miniconda 的 base 环境。以后安装包默认都打到这个 base 环境里。我强烈建议不要在 base 环境里装太多东西而是为每个项目单独创建环境后面会说为什么。4. 让 conda 真正好用镜像源与虚拟环境4.1 配置 conda 镜像源安装好 Miniconda 之后很多同学遇到的第一件烦心事就是“conda 下载包特别慢”尤其是访问较慢的网络环境。解决办法是配置镜像源也就是把默认的软件源地址替换成更快的服务器。在用户家目录下找到或创建.condarc文件vi ~/.condarc里面可以写入类似这样的配置channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud配置完成后执行一下确认conda config --show channels如果看到输出里有镜像站地址说明配置生效。后续conda install下载包的速度通常会明显提升。这里有个技巧不要把conda-forge直接加到默认 channels 的第一位。除非你的包在官方源里确实找不到。因为conda-forge里的包更新极快如果把它的优先级设太高很容易让同一个包在多个 channel 之间产生依赖解析冲突。先把官方镜像源用起来遇到缺包再单独指定-c conda-forge才是稳妥的做法。4.2 为项目创建独立 Python 环境现在可以给实际项目建环境了。比如项目想用 Python 3.11conda create -n py311 python3.11 -y-n后面是环境名称python3.11是指定解释器版本-y表示自动回答确认。创建完成后conda activate py311 python --version此时你会看到版本号变成了 3.11which python的路径变成了/home/dev/miniconda3/envs/py311/bin/python。这说明你当前的活动环境已经和 base 分离了。后续想在环境里安装包conda install numpy pandas matplotlib如果某个包在 conda 源里没有再使用 pippip install requests在激活的环境里执行 pip会把包安装到这个环境自己的site-packages目录中不会污染其他环境。一个值得坚持的习惯是为每个项目单独建环境并且用environment.yml文件记录依赖。比如在项目根目录写一个文件name: py311 channels: - defaults dependencies: - python3.11 - numpy - pandas - pip - pip: - requests换一台机器或者有新人加入时只需要conda env create -f environment.yml就能瞬间还原出一模一样的开发环境免去一行行手动安装的烦恼。4.3 conda 与 pip 并用时的注意点conda 和 pip 混用几乎是每个使用 Miniconda 的人的日常但这里有几个雷区需要提前躲开。第一不要在 base 环境里随便用 pip 装包。base 是 conda 自己的运行基础包装多了很容易出现依赖混乱。我一般只会在创建好的项目环境里用 pip而且尽量优先用 conda install。第二不要在激活 conda 环境的同时使用sudo pip install。sudo 会把安装目标地址变成系统 Python 的 site-packages与你当前的 conda 环境一点关系都没有。最后的结果就是环境里读不到包系统 Python 却被塞了一堆东西而且很难清理。第三如果需要在脚本或定时任务里使用 conda 环境不要直接在脚本里写conda activate因为非交互 Shell 经常加载不到 conda 函数。更稳妥的写法是source /home/dev/miniconda3/etc/profile.d/conda.sh conda activate py311 python run.py或者直接用 conda 提供的非交互运行方式conda run -n py311 python run.py这种方式适合 cron 任务、CI 工具省心很多。4.4 conda 常用命令速查表把平时频率最高的操作整理成一张速查表贴在自己笔记里前期可以少翻很多文档操作目的命令创建环境conda create -n env名 python3.11 -y激活环境conda activate env名退出环境conda deactivate查看所有环境conda env list安装包conda install 包名列出当前环境已装包conda list删除环境conda env remove -n env名导出环境配置conda env export environment.yml通过文件创建环境conda env create -f environment.yml更新 conda 自身conda update conda这些命令覆盖了 80% 的日常需求。剩下 20% 基本都能通过conda help或者查文档解决。5. 实录常见问题与排查5.1 conda: command not found这是装机之后最常遇到的问题。排查顺序很简单先确认安装目录是否存在ls -ld ~/miniconda3如果目录不存在回去看安装脚本有没有真正执行完。存在的话再检查当前 Shell 是不是加载了 conda 初始化代码grep -n conda initialize ~/.bashrc没有输出就说明conda init没跑到或者 init 的是别的 Shell。此时直接用绝对路径执行一次~/miniconda3/bin/conda init bash source ~/.bashrc如果你是远程登录重新连一下服务器往往也能解决。很多同学在这个问题上卡半天其实就卡在“改完配置没重新登录”。5.2 安装后提示 Permission denied如果你遇到了Permission denied先别急着重装。看看目录归属ls -ld ~/miniconda3正常情况下所有者应该是当前用户。如果显示root root说明刚才安装时用了 sudo 或者意外切换了身份。最省事的修复方案是删掉重装。如果你确实不想重装也可以临时修复所有者sudo chown -R dev:dev ~/miniconda3但我个人只把它当应急处理。因为一旦涉及 base 环境里的 conda 元文件、日志文件权限不对之后还会出现各种诡异问题。一次重装十分钟排错可能两小时建议直接重来。5.3 下载超时、校验失败安装包下载到一半断掉、或者 sha256 校验不过通常是网络不稳定导致的。解决办法有几个一是改用镜像站下载速度通常更快。二是用 curl 加重试参数下载curl -fSL --retry 5 -o Miniconda3-latest-Linux-x86_64.sh https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh--retry 5表示失败后自动重试 5 次-f会让 HTTP 错误以非零状态退出避免下载到错误页面还以为成功了。校验失败还有一种可能你下载的源版本与实际文件名不对应。下载完先核对哈希再决定是否继续安装。不要抱着“应该没事吧”的心理直接跑。5.4 系统 Python 与 conda Python 混用很多新手在激活 conda 环境后输入python发现还是系统旧版本或者反过来不激活环境时发现pip指到了 conda 目录。这些都是 PATH 顺序问题。检查一下当前环境变量echo $PATH激活 conda 环境时/home/dev/miniconda3/envs/py311/bin会排在系统目录前面。没排前面多半是.bashrc里的 PATH 写重复了、或者 conda init 被之后执行的 export 覆盖了。还有一个容易忽视的情况在 crontab、systemd 等服务场景中环境变量并不是登录 Shell 的环境conda 不会自动激活。遇到这种情况就使用前面提到的conda run -n env名 命令或者显式sourceconda 的 profile 脚本保证万无一失。6. 多用户服务器环境的一点心得6.1 给新手使用者的建议配置好账号和环境之后新用户最容易犯的错就是拿到一台服务器就迫不及待地pip install。这里我总结几条踩过坑以后觉得很有用的习惯第一日常使用永远不要登录 root。需要管理权限时用sudo平时都用自己的普通用户。第二每个项目单独建 conda 环境并且把导出的environment.yml提交到代码仓库。这样哪怕环境彻底乱了删除重建最多几分钟。第三装包优先用 condaconda 没有再用 pip并且记住永远不要sudo pip。服务器不是个人电脑里面的环境是公共资源。每个人都有责任不让自己的操作影响其他人。6.2 更合理的多用户部署思路如果要给很多用户统一提供 Miniconda我的建议是把 Miniconda 安装到系统公共目录比如/opt/miniconda3然后创建一个公共用户组把所有需要使用的开发者加入这个组并给/opt/miniconda3设置合理的组写权限。这样配置成本比每个人各自装一份更低也方便统一维护。安装好后可以通过/etc/profile.d/里写一个脚本让所有用户登录时都能自动加载 conda 环境。需要写# /etc/profile.d/miniconda.sh export PATH/opt/miniconda3/bin:$PATH个人用户再通过conda init初始化自己的 Shell 配置。这个方案适合团队成员比较多的场景比每个人独立安装更省事维护起来也清晰。不过这套方案有一个前提必须有人承担环境管理员角色负责升级 conda、维护镜像源、处理依赖冲突。否则所有用户都有写权限反而容易出现“某个人把公共环境搞坏了”的局面。最后再说一个我自己吃了不少亏才养成的习惯每次拿到新服务器第一次登录时不急着装环境先把用户、目录权限和磁盘分区理一遍确认完再安装 Miniconda。十个环境问题里有七个其实是权限和路径的问题跟 Python 本身没关系。先把流程走通再慢慢折腾环境后面会顺手很多。
返回列表