Linux【8】-软件管理-5-Singularity

各种singularity的库: https://depot.galaxyproject.org/singularity/

生信分析流程往往需要消耗数以万计的电脑计算资源。另外,生信分析过程中会用到大量的分析程序以及脚本,还需要对运行环境进行配置与管理。这会导致分析的可重复性变低,导致流程的升级、管理等都会成为问题。

Docker是很适合解决上述的问题。但是生信分析集群,和一般的IT服务器又有很大区别,比如无root权限,分析任务需要进行资源管理(内存,CPU)。这些问题都让Docker技术在HPC环境的应用受限,正因为此我们需要Singularity的诞生

一、背景介绍

虚拟机 vs 容器

首先,先和大家介绍一下基本概念。虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。

容器可以看作是,一种轻量级的虚拟机。由于不包含完整的操作系统,因此容器只需极少的计算资源,并且安装快捷方便。这种效率让容器能够在丛集中进行部署,同时将复杂应用的单一组件压缩到单独的容器当中。将应用组件分别放置在不同的容器当中后,开发人员即可对个别组件进行更新,而无需重复运行整个应用。

Docker的缺点?

Docker是目前最热最成熟的容器,但是它却不是很适合生信分析的 HPC 环境。原因有几点:

  • 计算机资源的限制无法施加到容器中
  • 多用户(非 root 用户)使用时的权限问题
  • Docker 包含了不必要的资源开销

使用Singularity的优点:

首先Singularity拥有容器所包含的大多数优点,例如启动迅速、资源开销小、轻松的迁移和扩展等等。除此之外,相较于Docker,还有一些独特的优点:

  • 容易对分析环境进行打包迁徙:Singularity所依赖的东西都在镜像文件中,不需要再单独打包 / 导入,直接拷贝走镜像即可。没有复杂的缓存机制,并且该镜像已经过压缩,只需占用非常少的磁盘空间。
  • 和现有系统无缝整合:系统用户权限、网络等均直接继承宿主机配置,并且无需进入某个镜像后再执行命令,可以直接在外部调用镜像内的指令,就像执行一个本地安装的指令一样。
  • 无需运行 daemon 进程:Singularity提供的完全是一个运行时的环境,在不使用时不需要单独的进程(资源限制和权限问题也得以解决),不占用任何资源。
  • Singularity还支持多种镜像和容器文件格式,甚至可以直接使用 Docker 提供的镜像,就像从 Docker Hub 去 pull 一个镜像一样简单。
  • Singularity可以轻易的现有的 HPC 系统整合,几乎无需任何额外的开发就能让现有的 HPC 变成一个轻量级的容器云。

二、安装(centos8)

1.1 环境依赖

sudo yum update -y && \
yum groupinstall -y 'Development Tools' && \
yum install -y \
    openssl-devel \
    libuuid-devel \
    libseccomp-devel \
    wget \
    squashfs-tools\
    cryptsetup

如果centos没发使用Yum,可以更换源

sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*

1.2 golang安装

cd /data/software
wget -c https://dl.google.com/go/go1.17.11.linux-amd64.tar.gz
tar -C /usr/local -xzvf go1.17.11.linux-amd64.tar.gz
go version

echo 'export GOPATH=${HOME}/go' >> ~/.bashrc && \
echo 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' >> ~/.bashrc && \
source ~/.bashrc

1.3 Singularity安装

wget -c wget https://github.com/singularityware/singularity/releases/download/v3.5.3/singularity-3.5.3.tar.gz

tar -xzf singularity-3.5.3.tar.gz
cd singularity
./mconfig --prefix=/opt/singularity/ 

sudo ./mconfig && \
make -C ./builddir && \
make -C ./builddir install
echo "export PATH=/opt/singularity/bin:\$PATH" >> ~/.bashrc

其他安装说明:

export VERSION=3.8.5 # adjust this as necessary 
wget https://github.com/hpcng/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz 

tar -xzf singularity-${VERSION}.tar.gz && \
cd singularity
./mconfig --without-suid --prefix=/home/dave/singularity
make -C ./builddir && \
make -C ./builddir install

1.4 报错

直接在默认路径上编译会报错:

checking: host Go compiler (at least version 1.13)... not found!

具体的分析见: https://blog.51cto.com/u_15668923/6317069 。 这个问题很奇妙

  1. 我的最开始go的版本太低,直接重新安装高版本不行,还得将低版本的删掉以后再安装。
  2. 同时切换sam和root用户都安装了一下
  3. 每次安装删掉 singularity的解压文件
  4. 赋予sudo go的权限

1.5 下载预先安装的sigularity软件

https://docs.sylabs.io/guides/3.0/user-guide/quick_start.html#download-pre-built-images

三、使用

常用命令:

singularity -h
singularity build  #构建镜像
singularity run    #容器内启动执行脚本
singularity exec   #镜像内执行命令
singularity shell  #执行一个 shell 脚本

1.下载镜像

可以从 Container Library(https://cloud.sylabs.io/library)or Docker Hub(https://hub.docker.com/ images。

# 从 Container Library 下载 sif 格式镜像
singularity pull library://cenat/default/blast.sif:latest
# 从 DockerHub 下载 sif 格式镜像
singularity pull docker://ncbi/blast

singularity强大之处在与从Docker上下载下来的,直接可以转换成singularity中可用模式,虽然singularity没几个镜像,但是Docker里面可是非常丰富。

2.运行容器

一般运行容器分为交互式运行和直接运行。

# 交互式运行
$ singularity shell blast.sif bash

Singularity> blastp

BLAST query/options error: Either a BLAST database or subject sequence(s) must be specified
Please refer to the BLAST+ user manual.

Singularity>

# 直接运行

$ singularity exec blast.sif blastp

3.文件夹挂载

默认会自动挂载 $HOME, $PWD , /tmp , /proc , /sys , /dev 目录。

# 通过 --bind 挂载文件夹
$ singularity shell --bind /pub/software:/mnt blast.sif

Singularity> ls /mnt/samtools-1.9.tar.bz2
/mnt/samtools-1.9.tar.bz2
Singularity>

# 不写挂载点则和本地目录一致
$ singularity shell --bind /pub/software blast.sif
Singularity> ls /pub/software/samtools-1.9.tar.bz2
/pub/software/samtools-1.9.tar.bz2

Singularity>


#/data后面没有跟文件夹,默认挂载后文件名还是data
$ singularity exec --bind /data lolcow.sif ls -l /data
total 4
-rw-rw-r-- 1 student student 17 Mar  2 00:51 vader.txt


$ singularity shell --bind src1:dest1,src2:dest2,src3:dest3 some.sif
If no colon is present, Singularity assumes the source and destination are identical. To do the same thing with an environment variable, you could do the following:

$ export SINGULARITY_BINDPATH=src1:dest1,src2:dest2,src3:dest3

4.用户和权限

singularity的安全性:Singularity提供了签名机制来验证;另一方面是容器会不会越权对 Host 做一些不该做的事情,这个是需要考虑的singularity 的解决办法是会在容器内动态创建一个用户,该用户与 Host里的用户名、组名、权限等都保持一致。这样你在 Host 中做不了的事情,在容器里也干不了。但是有时候我们需要以 root 权限(–fakeroot)登录容器,这时也不用担心,因为 root 只对容器内有效。需要注意的是,Singularity 默认是绑定 $PWD 和 $HOME 目录的,对这些目录的操作都会修改 Host 文件。

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn