第2章:Singularity安装——从系统准备到版本校验

说到在Linux上装Singularity,我早期踩过的坑真不少。最典型的,你以为是网络问题,结果发现是内核版本太老,老老实实升级内核后才跑通。这一章,咱们就把系统要求、安装过程和版本验证这三步一次性搞定。

安装流程一览

下面这张图概括了本章的核心逻辑,建议你先扫一眼,再逐节深挖。

Singularity安装流程 系统要求检查 内核≥3.10 / OverlayFS 方式A:直接安装 rpm/deb/pkg 方式B:源码编译 Git + golang 版本验证 singularity version 环境测试 💡 避坑提示 直接安装可能缺少最新特性。 生产环境建议源码编译。

2.1 系统要求

Singularity对Linux系统的要求其实不算高,但有几个硬门槛。我在项目中遇到过有人直接下源码编译,结果make到一半报错,一查内核版本才3.8。说白了,内核版本必须≥3.10,否则OverlayFS支持不了。

  • 内核版本:建议 ≥3.10,推荐4.x以上
  • 容器支持:OverlayFS(默认)或AUFS/其他
  • 架构:x86_64, ARM64(aarch64)
  • 依赖:golang(编译时)、squashfs-tools、libseccomp
经验之谈:我记得团队里有人直接用了CentOS 6.x的老版本,结果光升级内核就折腾了半天。如果是新机器,推荐Ubuntu 20.04+或Rocky Linux 8.x起步。内核不够的话,先跑 uname -r 看一眼,别急着装。

2.2 安装方式对比

Singularity的安装方法主要有两种:直接装和从源码编译。我自己习惯编译安装,这样版本和特性都能自己掌控。下面这个表格可以帮你快速决策。

方法 优点 缺点 适用场景
直接安装(rpm/deb) 快速、接口统一 版本滞后、缺少编译开关 快速验证、个人学习
源码编译 定制化强、获取最新特性 耗时稍长、需安装golang 生产环境、集群部署

2.3 直接安装(以Ubuntu为例)

直接安装是最快的,但有个前提——你得确认你的包管理器里有Singularity。不过我得提个醒,直接安装虽然省事,但容易遇到版本太老的问题。下面是基本的操作。

# 更新包索引
sudo apt update

# 安装Singularity(如果仓库里有)
sudo apt install singularity-container

装完之后可以马上跑一下版本校验。如果仓库里没有,你可以自己添加源,不过我个人不建议这么做——添加第三方的源往往还要解决额外的依赖问题,不如直接编译。

注意:直接安装的版本可能比较旧。如果老版本搭配Visium的SIF镜像,容易在文件挂载时报错。我曾经吃过这个亏,后来统一改成编译安装了。

2.4 从源代码编译安装

这才是正经的生产环境玩法。Singularity是用Go语言写的,所以你得先装好Go环境。我个人习惯把版本控制在官方推荐的范围内,避免不必要的编译错误。

第一步:安装依赖

# Ubuntu/Debian
sudo apt install -y build-essential libssl-dev uuid-dev libgpgme-dev squashfs-tools libseccomp-dev wget pkg-config git cryptsetup

# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y golang libseccomp-devel squashfs-tools git wget

第二步:下载并编译

# 克隆代码仓库
git clone https://github.com/sylabs/singularity.git
cd singularity

# 切换到稳定版本(比如v4.0.1)
git checkout v4.0.1

# 配置并编译(我习惯把安装目录放到/usr/local)
./mconfig --prefix=/usr/local
make -C ./builddir
sudo make -C ./builddir install

编译的时候注意观察终端输出,特别是golang的版本。如果机器上golang太老,会直接报版本不兼容。我记得有一次编译花了将近十分钟,结果因为Go版本不对,白编译了——从那之后我每次都先跑 go version 检查一下。

2.5 版本验证

装完之后第一件事就是看有没有正确安装。命令很简单:

singularity version

如果输出类似于 4.0.1,恭喜,你装对了。但如果出现 command not found,别急,可能是环境变量没设置好。可以检查一下:

which singularity  # 看看是不是在PATH里
echo $PATH         # 检查/usr/local/bin有没有在PATH中

我建议在安装前提前确认你的PATH包含 /usr/local/bin,不然编译装进去了但调不了,白费劲。

还有一个容易忽略的点:版本验证时,Singularity会输出自身的版本号和构建信息。你最好拿输出的版本号和官方GitHub上的标签核对一下,防止包校验和不对。我在生产环境里遇到过两次二进制不完整的情况,后来就养成了校验GPG签名或比对外部托管的checksum的习惯。

2.6 常见问题与避坑

  • 内核不支持OverlayFS:Singularity默认用OverlayFS来做容器分层。如果内核太老,可以用 --overlay 参数切换成其他后端,但我建议直接升级内核。
  • Go版本不满足条件:Singularity要求Go ≥1.16。如果系统自带的老版本,可以考虑用 g 或者 snap 安装新版Go。
  • 用户权限不够:Singularity在编译时需要用root权限来安装二进制文件和squashfs工具。如果你是普通用户,建议用 sudo 或者在root环境下操作。
个人建议:如果你是第一次装Singularity,不妨两种方式都试试——先直接安装快速验证,再编译安装用于生产。我记得我第一次用直接安装跑了一个简单的Nginx镜像,结果发现挂载目录有问题,换上编译版就正常了。嗯,这也是个成长的过程。

2.7 安装方式总结

方式 命令/步骤 快速确认
直接安装 apt install singularity-container singularity version
源码编译 ./mconfig && make -C builddir && sudo make install singularity version

好了,到这里Singularity的安装和版本验证就完成了。你手头应该已经有了一个可用的Singularity环境。下一阶段就可以开始制作容器了,不过在那之前,你想想看,是不是还有个很重要的东西没配?对,就是用户权限和缓存目录的设置,这些细节会在后面的章节细讲。

重要提醒:如果你是在共享集群上安装,安装路径建议选在共享存储上(比如 /opt/singularity),这样多节点可以直接调用。离开这一步,后面的Visium环境配置可能会卡在路径不一致上。我曾在多个集群上部署,踩够了路径不一致的坑,后来就统一用环境模块(environment modules)来管理了。