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 上碰到
我曾经在 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 就罢工。”
“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 版本低,不支持
推荐从 EPEL 安装新版:
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 到一半报
我在 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 环境验证:三步检查法
装完别急着下一步,先跑三个命令确认环境健康:
- 检查内核命名空间:
unshare -U echo "user namespace OK" - 检查 OverlayFS:
mount -t overlay overlay /tmp/over_test && echo "overlay OK" || echo "overlay NOT supported" - 检查 Go 版本:
go version(如果从源码编译)
我的经验
有一次我在 RHEL 8 上跑
有一次我在 RHEL 8 上跑
unshare -U 直接 segfault。原因?内核没有开启 setpriv 模块。后来升级到 kernel 4.18 小版本补丁就解决了。如果你遇到类似问题,先 uname -r 看内核版本,然后 sudo grubby --update-kernel=ALL --args="user_namespace.enable=1"。
3.7 环境架构总览
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。顺序反了容易踩坑。我都是先跑一遍
先把内核和依赖搞定,再装 Go,最后装 Singularity。顺序反了容易踩坑。我都是先跑一遍
uname -r 确认内核,然后 apt 一把装依赖,最后编译——一条龙不出错。