4. 使用包管理器安装 Singularity

包管理器安装,是部署 Singularity 最省心的路径。你不需要操心依赖树,不用自己编译,出问题了还能一键回滚。个人习惯是:开发环境首选 apt (Debian/Ubuntu) 或 yum/dnf (RHEL/CentOS),生产环境也推荐这么做——除非你要定制底层。

这一章我们就来走一遍完整的包管理器安装流程。我会把常见的坑、版本选择的经验、还有验证步骤都放在里面。你跟着跑一遍,基本不会有意外。

4.1 为什么选包管理器?

说白了就是省事。Singularity 依赖的 Go 版本、libuuid、squashfs-tools,包管理器都会帮你搞定。我曾经在 CentOS 7 上手动编译,结果 Go 版本太老,折腾了两天。后来切回 yum 安装,十分钟完事。

包管理器安装的优势:

  • 依赖自动解决:Go、libuuid、squashfs-tools 一键拉齐
  • 版本锁定:可以固定到某个小版本,避免意外升级
  • 卸载干净:apt remove 或 yum remove 一键清理
  • 安全更新:发行版安全通告会覆盖 Singularity 包
  • 少踩坑:编译环境不一致导致的段错误、链接错误都消失了

4.2 主流包管理器对比

目前社区支持的包管理器集中在 apt 和 yum/dnf 两大阵营。下面这张表能帮你快速选择:

发行版 包管理器 默认仓库版本 官方仓库覆盖
Ubuntu 20.04/22.04 apt 3.7.x ~ 3.9.x ✅ universe 仓库
Debian 11/12 apt 3.7.x ~ 3.10.x ✅ main 仓库
CentOS 7 yum 3.5.x ⚠️ EPEL 额外仓库
RHEL 8/9 dnf 3.8.x ~ 3.10.x ✅ EPEL + 官方
Rocky Linux 8/9 dnf 3.8.x ~ 3.10.x ✅ EPEL + 官方
一个小建议:如果不确定选哪个版本,直接用你发行版默认仓库里的版本。它们都经过 QA 测试,稳定性有保障。除非你需要最新特性,否则不要追新。

4.3 apt 安装(Debian/Ubuntu)

这是最常用的路径。Ubuntu 20.04/22.04 和 Debian 11/12 我都跑过,流程几乎一样。

4.3.1 更新仓库索引

sudo apt update

4.3.2 安装 Singularity

sudo apt install -y singularity-container

注意包名是 singularity-container,不是 singularity。我曾经在 Ubuntu 上打 apt install singularity,结果装了一个毫不相关的科学计算工具。

安装成功标志:singularity version 能正常输出版本号。

4.3.3 验证安装

singularity version
singularity help

一般来说,输出类似 3.9.5 或 3.10.2 就对了。如果你看到报错说命令找不到,检查一下是否 sudo 成功了,或者是否装到了非 root 用户的空间里。

4.3.4 如果默认版本太旧?

Ubuntu 20.04 默认仓库可能只提供 3.7.x。如果你想用更新版本,可以添加 Sylabs 官方仓库:

# 添加 Sylabs 的 GPG 密钥
curl -s https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x06B9363851C3CEB4 | sudo apt-key add -

# 添加 Sylabs 仓库(以 Ubuntu 22.04 为例)
echo "deb https://ppa.launchpadcontent.net/singularityware/singularity-container/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/singularity.list

sudo apt update
sudo apt install -y singularity-container
注意:添加第三方仓库后,apt upgrade 可能会自动升级 Singularity。如果你在生产环境,记得用 apt-mark hold singularity-container 锁定版本。

4.4 yum/dnf 安装(RHEL/CentOS/Rocky)

RHEL 系的安装稍微复杂一点,因为默认仓库里没有 Singularity,需要启用 EPEL 仓库。

4.4.1 启用 EPEL 仓库

# CentOS/Rocky
sudo yum install -y epel-release

# RHEL 需要先订阅 EPEL
sudo subscription-manager repos --enable codeready-builder-for-rhel-9-x86_64-rpms
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

4.4.2 安装 Singularity

sudo yum install -y singularity-container

或者用 dnf:

sudo dnf install -y singularity-container

包名和 apt 一样,都是 singularity-container。

4.4.3 验证安装

singularity version
singularity run help

在 CentOS 7 上,默认版本可能是 3.5.x。这个版本依然可用,但如果你需要 OCI 支持或新的 --compat 标志,建议升级到 3.8+。

4.4.4 安装特定版本(可选)

如果你想安装指定版本,可以从 Sylabs 官网下载 RPM:

# 以 CentOS 7 安装 3.10.2 为例
sudo yum install -y https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce-3.10.2-1.el7.x86_64.rpm
个人经验:用 RPM 直接安装时,记得先确认系统上有没有冲突的包。我见过一次旧版本 singularity 和新版本 singularity-ce 冲突,导致 `rpm` 报错。清理干净再装最稳妥。

4.5 安装后的必要检查

装好了别急着用,先跑一遍基本测试,确认环境没问题。

  1. 检查版本:singularity version
  2. 检查可执行文件路径:which singularity
  3. 测试最基本操作:singularity exec docker://alpine echo "Hello Singularity"
  4. 查看帮助:singularity --help

如果第三步报错说"docker://" 协议不支持,说明你装的是旧版本(3.5.x 或更早),需要添加 --disable-cache 或者升级。

4.6 避坑指南

  • 我曾经在 Ubuntu 18.04 上直接 apt install singularity-container,结果版本是 3.1.x。那个版本存在已知的 squashfs 兼容性问题。后来我手动添加到 Sylabs 仓库才解决。
  • 我曾经在 CentOS 7 上安装后,运行容器报错 "failed to mount squashfs"。原因是系统缺少 squashfs-tools。执行 sudo yum install -y squashfs-tools 后正常。
  • 包冲突:如果系统里之前手动编译过 Singularity,卸干净再装包管理器版。sudo apt remove singularity-container 不会自动删除手动编译的文件,需要手动 rm -rf /usr/local/libexec/singularity 等目录。

4.7 本章知识结构图

下面这张 SVG 图总结了包管理器安装的核心脉络:

包管理器安装 Singularity —— 核心流程与节点 选择包管理器 apt (Debian/Ubuntu) yum/dnf (RHEL/CentOS/Rocky) sudo apt update sudo apt install singularity-container 启用 EPEL 仓库 sudo yum install singularity-container 验证安装 singularity version & run test 避坑提醒 版本锁定 依赖完整性 清理旧版本

4.8 总结

用包管理器安装 Singularity,核心就三步:选择对应发行版的包管理器 → 确认仓库源(必要时启用 EPEL 或 Sylabs 仓库)→ 安装并验证。我个人推荐优先用系统默认仓库,避免版本冲突和生产环境不稳定。如果非要追新,再考虑添加第三方仓库或 RPM 直装。

这里再提一句:安装完成后,别急着跑大任务。先跑一条 singularity exec docker://alpine echo hello,确认网络和镜像拉取都通。这一步能排除 90% 的装后问题。