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 。 这个问题很奇妙
- 我的最开始go的版本太低,直接重新安装高版本不行,还得将低版本的删掉以后再安装。
- 同时切换sam和root用户都安装了一下
- 每次安装删掉 singularity的解压文件
- 赋予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 文件。
5. 创建和修改
// 创建可以更改的singularity
singularity build --sandbox test test.sif
//进入更改singularity
singularity shell --writable test
//重新打包singularity
singularity build --sandbox test.sif test
三、报错
报错1
[sam@c01 fil]$ singularity shell -B /data4 /data4/n11
FATAL: container creation failed: mount /etc/localtime->/etc/localtime error: while mounting /etc/localtime: could not mount /etc/localtime: operation not supported
尝试了 https://epcced.github.io/2021-07-29_Singularity_Online/07-singularity-images-building/index.html, 但感觉更多是权限问题。
其他用户建的filteO, 有用户冲突问题。 重新拷贝一份,然后 chown 富裕新用户权限就解决了。
参考资料
- https://blog.51cto.com/u_15668923/6317069
- https://blog.csdn.net/weixin_48778546/article/details/108955789
- https://cloud.tencent.com/developer/article/1817541
- https://blog.csdn.net/qq_53666171/article/details/126593726
- http://www.xtaohub.com/Container-Tech/Singularity-in-nutshell.html
- https://singularity-tutorial.github.io/05-bind-mounts/
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn