Linux Mint 工作站搭建:SSH 加固、Conda/Docker/uv 共享环境

2026年3月17日 | Ruichen Zhou | 约 15 分钟阅读

这篇记录一台实验室多人共用 Linux 工作站的搭建过程,覆盖系统选型、SSH 加固、用户权限、共享 Python 环境(Conda + uv)、Docker GPU 配置和远程安全升级策略。

硬件:Dell Precision 7920 Tower,双路 Xeon,128GB 内存,NVIDIA RTX 4090 系统:Linux Mint 22.1 (Xia),基于 Ubuntu 24.04 (Noble) 驱动:NVIDIA 570.153.02,CUDA 12.8 远程接入:通过 Tailscale(内网 IP 100.100.1.5)从德国宿舍 SSH 维护


为什么选 Linux Mint 而不是 Ubuntu Server

选 Mint 而不是 Ubuntu Server 的理由:

  • 偶尔需要本地桌面调试 MATLAB、ParaView 等 GUI 程序,Server 版后装桌面坑多
  • Mint 基于 Ubuntu 24.04,包管理完全兼容,桌面开箱即用
  • 自带 Timeshift 做系统快照,远程维护时可快速回滚

重要坑:Mint codename ≠ Ubuntu codename。 配 Ubuntu 镜像源时,必须用 Ubuntu 的 noble,不能用 Mint 的 xia。典型症状是 sudo apt update 报一屏 404。检查 /etc/apt/sources.list 会看到类似这样的错误配置:

deb https://mirrors.aliyun.com/ubuntu/ xia main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ xia-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ xia-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ xia-security main restricted universe multiverse

xia 是 Linux Mint 22.1 的 codename,不是 Ubuntu 的。Mint 22.1 基于 Ubuntu 24.04,对应 codename 是 noble。修正方法:

sudoedit /etc/apt/sources.list
deb https://mirrors.aliyun.com/ubuntu/ noble main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ noble-security main restricted universe multiverse

远程操作时,直接用编辑器改四行比用 sed 批量替换更可靠,出错概率更低。


SSH 加固

多人共用工作站,SSH 首先要收紧:改为非标准端口,禁用 root 登录和密码登录,只允许公钥认证。目的是收掉最常见、最低成本的攻击面。

sshd_config 关键配置:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
UsePAM yes

新用户接入规则写进登录横幅(MOTD),同时显示机器状态摘要,方便远程快速判断:

=================================================================
[SECURITY NOTICE] Password login is disabled on this server.
                  Please use SSH key authentication.
[FOR NEW USERS]   To gain access, please send your public key
                  (e.g., id_ed25519.pub) to the administrator.
=================================================================

--- Welcome to Precision-7920-Tower ---
Uptime            : 12 weeks, 5 days, 16 hours, 25 minutes
Logged-in Users   : ruichen
CPU Load Average  : 0.28, 0.42, 0.89
NVIDIA GPU Status : GPU 0: NVIDIA GeForce RTX 4090 | Util: 0% | Mem: 55 / 49140 MiB

登录后第一眼能看到 uptime、在线用户、负载和 GPU 状态,减少手动查询。Tailscale 将入口收进私有网络,避免工作站直接暴露在公网。


用户管理

每人单独开账号,家目录权限收紧到 700,确保操作可追溯、环境互不干扰。

sudo adduser alice
sudo chmod 700 /home/alice

docker 组不默认分配,因为 docker 组本质上接近 root 权限。按需添加:

sudo usermod -aG docker alice

sudo 同理,默认不给。需要时在 /etc/sudoers.d/ 里按动作白名单授权,而非直接给管理员权限。例如只允许某用户重启 Docker:

sudo visudo -f /etc/sudoers.d/alice-docker
alice ALL=(root) NOPASSWD: /usr/bin/systemctl restart docker

这样做维护成本稍高,但避免了”所有人都能改一点,最后无法追溯变更来源”的问题。


Conda:装在公共路径,环境各自管

多人共用场景下,Conda 安装在 /opt/miniconda3 而非任何用户的 home 目录,避免因人员变动导致整机环境失效。

安装步骤:

curl -LO https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
sudo bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3
echo 'source /opt/miniconda3/etc/profile.d/conda.sh' | sudo tee /etc/profile.d/conda.sh
sudo /opt/miniconda3/bin/conda config --system --set auto_activate_base false

公共 base 只放高概率共用的框架(PyTorch、TensorFlow 等)。项目依赖由各用户在自己的 home 目录下建环境管理:

source /etc/profile.d/conda.sh
conda config --add envs_dirs ~/.conda/envs
conda create -n myproj python=3.11
conda activate myproj

分工原则:管理员维护公共基础层,用户维护各自的项目环境。某个用户的 env 出问题,删掉重建即可,不影响其他人。

多用户隔离细节

默认情况下,conda create 会把环境建到 /opt/miniconda3/envs/ 下面,所有用户共享同一个目录。这在多人场景下会导致权限冲突和命名碰撞。解决方法是让每个用户把 envs_dirspkgs_dirs 都指向自己的 home 目录:

# 每个用户执行一次
conda config --add envs_dirs ~/.conda/envs
conda config --add pkgs_dirs ~/.conda/pkgs

这样用户 A 的 conda create -n exp1 会建在 ~A/.conda/envs/exp1,用户 B 的同名环境建在 ~B/.conda/envs/exp1,互不干扰。公共 base 环境仍然在 /opt/miniconda3 下由管理员统一管理。

另一个注意点是 shell 初始化。Conda 默认通过 conda init 修改用户的 .bashrc,但如果用户用的是 zsh,需要改为:

conda init zsh

或者直接在 /etc/profile.d/conda.sh 里统一处理,避免每个用户手动初始化。


Docker 和 GPU

安装 Docker 和 NVIDIA Container Toolkit,让容器内可以使用 GPU。同时限制日志大小,防止日志写满系统盘。

sudo apt install docker.io nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl enable --now docker
sudo systemctl restart docker

/etc/docker/daemon.json 配置日志限制:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

RTX 4090 + 驱动 570.153.02 + CUDA 12.8。有了容器后,CUDA 用户态环境不需要每人在宿主机上单独安装,实验直接进容器做。docker 组权限仍按需分配,不默认全员开放。


uv:比 pip 快得多的替代

uv 用于替代 pip,在共享工作站上提供更快的安装速度和更好的可重复性。全局安装后,各用户在自己的 Conda 环境里使用:

curl -LsSf https://astral.sh/uv/install.sh | sudo env UV_INSTALL_DIR=/usr/local/bin sh

分工原则:Conda 负责 CUDA、编译链等系统级依赖,uv 负责纯 Python 包。

conda create -n vision python=3.11
conda activate vision
uv pip install numpy pandas jupyterlab transformers

这套组合在多人环境中的优势:Conda 提供清晰的环境边界,uv 提供快速安装,出问题时容易定位是系统依赖、CUDA 还是 Python 包本身。

uv 的多用户注意事项

uv 安装到 /usr/local/bin 后所有用户都可以直接使用,不需要额外配置。但需要注意的是,uv 的缓存默认在 ~/.cache/uv,每个用户各自独立,不会冲突。

如果某个用户想锁定项目依赖的精确版本,可以使用 uv pip compile

uv pip compile requirements.in -o requirements.txt
uv pip sync requirements.txt

这样即使不同用户在同一台机器上开发同一个项目,也能保证依赖版本一致。相比 pip freeze 生成的平铺列表,uv pip compile 能区分直接依赖和传递依赖,更新时更干净。


远程维护:分批更新策略

修正镜像源后,这台机器累积了 384 个待更新包,其中 226 个安全更新。涉及 linux-generic(内核从 6.8.0-63 到 6.8.0-106)、openssh-servernetwork-managerdocker.io(27 到 28)、systemd,系统提示 *** System restart required ***

由于是从德国宿舍通过 Tailscale SSH 远程操作,一次性 apt full-upgrade && reboot 风险过高——如果网络、SSH 或内核启动出问题,无法物理介入。远程维护的原则是保证机器可达性,而非追求最新。

策略:hold 高风险包,优先完成不需要重启、不影响远程连通性的更新,剩余部分等下次物理到场时处理。

sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic \
  openssh-server network-manager docker.io systemd systemd-sysv \
  libnss-systemd libpam-systemd
sudo apt update
sudo apt upgrade
apt-mark showhold

内核、SSH、NetworkManager 等组件一旦更新失败,影响的是整台共享机器的可达性。机器已连续运行 12 周未重启,分批处理比远程赌一次全量升级更稳妥。

评论