3 部署环境准备:Linux系统与依赖归纳总结

部署 Singularity 之前,先把坑填平。我见过不少人兴冲冲装完,结果跑 singularity pull 就报错——多半是系统或依赖没配好。这一章,咱们把环境彻底捋一遍。

3.1 支持的 Linux 发行版与内核要求

Singularity 对 Linux 比较挑剔?其实还好。它依赖 Linux 内核的 命名空间(尤其是 user namespace)和 OverlayFS。我个人习惯用 Ubuntu 22.04 LTS,因为软件源新,依赖容易满足。但 CentOS 7、RHEL 8、Debian 11 也都能跑。

发行版 最低内核版本 推荐版本
Ubuntu 3.10 5.4+
CentOS 7 3.10 3.10(需额外配置 overlay)
RHEL 8 / Rocky 8 4.18 4.18+
Debian 11 5.10 5.10+
OpenSUSE Leap 4.12 5.3+
内核警惕点
我曾经在 CentOS 7 上碰到 singularity build 卡死。一查,内核 user namespace 默认关闭。解决方法:grubby --args="namespace.unpriv_enable=1 user_namespace.enable=1" --update-kernel=$(grubby --default-kernel),然后重启。

3.2 核心依赖包一览

Singularity 的依赖不算多,但缺一个就可能编译失败或运行异常。核心依赖分三类:编译工具链、容器运行时库、可选功能库。

快速记忆口诀
“Go 语言、squashfs、libseccomp —— 这三样是铁三角,缺一个 Singularity 就罢工。”

3.3 按发行版安装依赖命令

别去背命令,直接复制跑。但我建议先 sudo apt update 或 sudo yum makecache 确保源最新。

Ubuntu / Debian

sudo apt install -y \
  build-essential \
  libssl-dev \
  uuid-dev \
  libgpgme11-dev \
  squashfs-tools \
  libseccomp-dev \
  wget \
  pkg-config \
  git \
  cryptsetup-bin

CentOS 7 / RHEL 7

sudo yum install -y epel-release
sudo yum install -y \
  gcc gcc-c++ make \
  openssl-devel \
  libuuid-devel \
  libgpgme-devel \
  squashfs-tools \
  libseccomp-devel \
  wget \
  pkgconfig \
  git \
  cryptsetup
CentOS 7 额外一步
CentOS 7 的 squashfs-tools 版本低,不支持 -no-exports 参数。我曾因此编译通过但 build 镜像时崩溃。
推荐从 EPEL 安装新版:sudo yum install -y epel-release,然后 sudo yum update squashfs-tools。

RHEL 8 / Rocky 8 / AlmaLinux 8

sudo dnf install -y epel-release
sudo dnf install -y \
  gcc gcc-c++ make \
  openssl-devel \
  libuuid-devel \
  libgpgme-devel \
  squashfs-tools \
  libseccomp-devel \
  wget \
  pkgconfig \
  git \
  cryptsetup

OpenSUSE Leap

sudo zypper install -y \
  gcc gcc-c++ make \
  libopenssl-devel \
  libuuid-devel \
  libgpgme-devel \
  squashfs \
  libseccomp-devel \
  wget \
  pkg-config \
  git \
  cryptsetup

3.4 Go 语言环境安装(关键!)

Singularity 本身是 Go 写的。从源码编译时,需要 Go 1.17 以上版本(官方建议 1.21+)。说说我的习惯——我不用发行版自带的 Go,版本太老。直接用 Go 官方二进制包:

wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
source ~/.bashrc
go version

检查输出:go version go1.22.2 linux/amd64,干净利落。

别用 yum/dnf 自带的 Go
我在 CentOS 7 上吃过亏:系统自带的 Go 1.15,编译 Singularity 到一半报 undefined: os.UserHomeDir。老老实实装官方的。

3.5 可选但建议安装的组件

  • cryptsetup:用于加密容器镜像,默认已包含在依赖里。
  • fuse-overlayfs:非 root 用户运行容器时加速,建议装:sudo apt install fuse-overlayfs 或 sudo yum install fuse-overlayfs。
  • singularity-ce 预编译包:如果你不想编译,直接下载二进制:sudo apt install singularity-ce 或下载 .rpm。

3.6 环境验证:三步检查法

装完别急着下一步,先跑三个命令确认环境健康:

  1. 检查内核命名空间:unshare -U echo "user namespace OK"
  2. 检查 OverlayFS:mount -t overlay overlay /tmp/over_test && echo "overlay OK" || echo "overlay NOT supported"
  3. 检查 Go 版本:go version(如果从源码编译)
我的经验
有一次我在 RHEL 8 上跑 unshare -U 直接 segfault。原因?内核没有开启 setpriv 模块。后来升级到 kernel 4.18 小版本补丁就解决了。如果你遇到类似问题,先 uname -r 看内核版本,然后 sudo grubby --update-kernel=ALL --args="user_namespace.enable=1"。

3.7 环境架构总览

Singularity 部署环境准备 – 核心依赖与流程 Linux 内核 ≥ 3.10 系统依赖包 Go 编译器 (≥1.21) Singularity 安装 验证 (命名空间/Overlay) 提示:从源码编译时 Go 版本必须符合要求;预编译包可跳过 Go 安装环节

3.8 常见失败场景与排查

现象 原因 解决方案
FATAL: kernel too old 内核 < 3.10 升级内核或换发行版
squashfs: Unable to find 缺少 squashfs-tools 按上文安装
exec format error 二进制不匹配(arm64/amd64) 下载对应架构版本
permission denied user namespace 未开启 重启后启用 user_namespace
一句话总结
先把内核和依赖搞定,再装 Go,最后装 Singularity。顺序反了容易踩坑。我都是先跑一遍 uname -r 确认内核,然后 apt 一把装依赖,最后编译——一条龙不出错。