第一章:Singularity介绍与安装

各位,咱们开始这门课的第一个台阶——先把Singularity这个家伙搞清楚到底是个什么东西,然后装到你的机器上,最后跑几个命令验证一下。我一向认为,工具选对了,后面的事能省一半力气。

为什么这一章就讲安装?很简单,后面所有关于Visium聚类部署的事,全在Singularity容器里跑。你装不好它,后面就没法玩。所以这一章,我建议你跟着敲一遍,别跳过。

1.1 什么是Singularity?为什么是它?

Singularity嘛,说白了就是专门给高性能计算(HPC)和科学计算场景设计的容器技术。你想想看,我们在生物信息学里天天面对什么?老旧的集群环境、古怪的操作系统版本、复杂的依赖关系。这时候你拿Docker去跑,权限问题就够你喝一壶的。

我个人习惯在集群上用Singularity,原因有三:

  • 不需要root权限——普通用户就能创建和运行容器
  • 原生支持HPC——能直接调用GPU、InfiniBand、MPI这些硬件资源
  • 交互式运行方便——可以像执行普通程序一样跑容器,不搞花里胡哨

我在项目中遇到过好几次这样的情况:一个用Docker写好的Visium分析流程,拿到集群上一跑,权限报错,挂载失败,折腾了半天。换成Singularity之后,半小时搞定。所以这次课我们直接用Singularity来做Visium聚类部署。

1.2 核心概念:镜像 vs 容器

嗯,这里要区分两个东西。搞清楚了,后面就不容易搞混。

概念 说明
镜像(Image) 一个只读的模板,包含操作系统、软件、依赖和环境
容器(Container) 镜像的实例化运行环境,可读写文件,用完可丢弃

你可以把镜像想象成一个压缩包,容器就是这个压缩包解压后正在使用的那个文件夹。我们在课程里会先构建镜像,再基于它运行容器来执行Visium聚类分析。

1.3 安装Singularity——三种主流方式

安装Singularity其实不复杂,但版本和系统不一样,方法也有差别。我曾经在新配的服务器上因为系统版本太新,踩过不少坑。下面给你三种方式,你挑一个适合你的。

方式一:从源码编译安装

这是最推荐的方式。虽然多敲几行命令,但你能控制安装路径和编译选项。我个人在集群上基本都是这么干的。

先确认你的系统有这些依赖:

# Ubuntu/Debian
sudo apt-get update && sudo apt-get install -y \
    build-essential \
    libssl-dev \
    uuid-dev \
    libgpgme11-dev \
    squashfs-tools \
    libseccomp-dev \
    wget \
    pkg-config \
    git \
    cryptsetup-bin

然后下载Go语言环境和Singularity源码:

export VERSION=1.19.0
wget https://go.dev/dl/go${VERSION}.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go${VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

git clone https://github.com/sylabs/singularity.git
cd singularity
git checkout v3.11.4

./mconfig
make -C builddir
sudo make -C builddir install

编译完记得验证一下:

singularity version

如果看到类似3.11.4的输出,说明安装成功。

方式二:通过包管理器安装

假如你不想编译,直接用系统包管理器装也是可以的。不过版本可能会滞后一点:

# Ubuntu 20.04+
sudo apt-get install -y singularity-container

# CentOS/RHEL 7+
sudo yum install -y singularity-container

# EPEL源
sudo yum install -y epel-release
sudo yum install -y singularity-container

小提示:包管理器安装的通常不是最新版。如果你后面要跑Visium相关的镜像,建议至少用Singularity 3.8以上版本。

方式三:使用Singularity容器镜像

听起来有点绕对吧?但确实可以在一台已经装了Docker的机器上,用Docker跑Singularity:

docker run -it --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    sylabsio/singularity:3.11.4

这种方式适合快速测试,不推荐用于生产环境。

1.4 基础命令——先跑起来看看

装好之后,别急着学高级用法。先敲几个基础命令,感受一下Singularity是怎么工作的。

我建议你从拉取一个简单镜像开始:

# 从Docker Hub拉取一个Ubuntu镜像
singularity pull docker://ubuntu:22.04

# 查看镜像是否下载成功
ls -lh ubuntu_22.04.sif

你会看到一个.sif文件,这就是Singularity镜像文件格式的产物。后面我们构建Visium分析环境也会生成这个后缀的文件。

接下来,试试交互式启动容器:

singularity shell ubuntu_22.04.sif

# 进入容器后,你可以正常使用Shell
cat /etc/os-release
exit

还有一种更常用的方式是直接运行命令:

singularity exec ubuntu_22.04.sif echo "Hello from Singularity!"

是不是很简单?不需要daemon,不需要sudo,跟执行普通程序一模一样。

1.5 本章知识体系速览

为了让你有个整体印象,我画了一张结构图。它把本章的核心知识点串起来了:

Singularity容器技术 核心概念 安装方式 基本命令 镜像(Image) 容器(Container) 源码编译 包管理器 容器镜像 pull / push shell / exec build 📌 说明 本章从核心概念出发,覆盖三种安装方式与四项基础命令,为Visium聚类部署打好容器基础。

1.6 验证安装——做个快速检查

装完如果不检查一下,心里总觉得不踏实。我用下面这套命令来验证环境是否正常:

# 1. 检查版本
singularity --version

# 2. 检查配置
singularity config global

# 3. 拉一个tiny的测试镜像
singularity pull docker://alpine:latest

# 4. 运行一个命令
singularity exec alpine_latest.sif cat /etc/alpine-release

如果每一步都通过,说明你环境没问题了。

注意:如果你在集群上安装,注意不要与已安装的模块冲突。我曾经遇到过一个情况,系统自带的Singularity版本太旧,编译工具链不兼容,最后只能单独编译安装到用户目录下才解决。

1.7 避坑指南

说几个我踩过的坑,你绕开走:

  • go版本太老——Singularity 3.11需要Go 1.17以上,否则编译报错
  • squashfs-tools没装——虽然不致命,但会影响镜像构建性能
  • 用root装完用普通用户跑——这通常是ok的,但要注意/usr/local/bin的路径
  • 在旧内核上跑新版本——比如CentOS 7默认内核3.10,Singularity的一些高级特性可能不支持

1.8 小结

这一章我们走完了Singularity的入门三部曲:了解概念、完成安装、验证命令。记得,我们后面所有的Visium聚类部署工作都将在Singularity容器里完成。所以这一章的内容不是看过就行,而是真的要在机器上跑通。

如果你在安装过程中遇到了问题,可以回头看看前面的安装方式对比,选一个适合你系统环境的路径。别怕麻烦,配置好环境是成功的一半。