第一章: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 本章知识体系速览
为了让你有个整体印象,我画了一张结构图。它把本章的核心知识点串起来了:
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容器里完成。所以这一章的内容不是看过就行,而是真的要在机器上跑通。
如果你在安装过程中遇到了问题,可以回头看看前面的安装方式对比,选一个适合你系统环境的路径。别怕麻烦,配置好环境是成功的一半。