singularity使用基础

singularity使用

singularity使用


1. singularity简介

singularity与docker功能相似,但是相比与docker需要root权限,或者专门添加用户组,singularity在非root时也可使用,且轻量级,修改方便。singularity镜像有两种格式:sif格式可用于部署;sanbox格式是可写的文件系统,用于开发过程,方便根据需要修改其中的内容。两种格式之间相互转换,即开发完成后转换为sif。具体可参考官网。

2. singularity特性

比如可在本地构建docker镜像,然后上传服务器使用singularity运行,从而避免使用root相关权限;

Singularity镜像 中的文件可以直接在当前系统操作;但是通过shell 启动容器后,容器内是只读的文件系统,如果要在容器内修改,需要root 权限,且指定 -writable;

可直接在sandbox容器内创建环境,安装软件等;

因为 Docker 在安全、权限、高速网络支持、MPI并行支持等各方面天生且无法修补的缺陷,导致 Docker 在超算上不适合使用,为了适应超算特有的平台环境,出现了一些专门为超算环境开发的容器软件,在目前适合于超算的容器软件里,Singularity 的兼容性最好,对超算特性支持最完整,运行性能也是最好的。

一、使用镜像库

现在有很多计算软件已经将容器镜像制作好了,存储在一些云平台上,用户只需要直接下载使用即可。在需要使用容器的时候,用户可以先在云平台上搜索是否已经有制作好的镜像,如果没有,再考虑自行制作容器镜像。

Singularity 支持很多云平台,用户可以在云平台上搜索,并下载所需镜像

Sylabs Cloud

singularity pull ubuntu.sif library://library/default/ubuntu:21.04

Docker Hub 是 Docker 的镜像云平台,singularity 程序会将 docker 格式转换为 singularity 使用的 .sif 格式

singularity pull rnaseqv2.0.sif docker://omicsclass/rnaseq:latest

Singularity Hub

singularity pull singularity-images.sif shub://vsoch/singularity-images

支持 ORAS 的 OCI 镜像云平台

singularity pull image.sif oras://registry/namespace/image:tag

以library:// 开头的URI,表示是从Container Library构建

以docker:// 开头的URI,表示是从Docker Hub构建

以shub:// 开头的URI,表示是从Singularity Hub构建

以docker-archive://开头的 ,表示是从 docker镜像的输出文件构建


利用docker本地镜像文件制作镜像

singularity 下载docker 上的镜像有时候下载太慢,可以用本地保存的docker镜像文件转换成sif文件:

#下载docker镜像到本地:
docker pull omicsclass/pop-evol-gwas:v1.2
#保存镜像文件
docker save omicsclass/pop-evol-gwas:v1.2  > pop-evol-gwas.tar
#上传tar文件到服务器,转换成沙箱,可以进一步编辑
singularity build --sandbox pop-evol-gwas docker-archive://pop-evol-gwas.tar #沙箱 #或者 直接转换成sif文件使用
singularity build pop-evol-gwas.sif docker-archive://pop-evol-gwas.tar #sif 文件


二、自行制作镜像

当镜像库平台没有找到适用的现成镜像,用户可以在本地将软件打包成镜像 。

1、安装singularity(本地计算机)

    首先需要在本地主机root权限安装singularity,以下为安装步骤。

# 安装依赖
yum install -y gcc libuuid-devel squashfs-tools openssl-devel

# 安装go
export VERSION=1.13 OS=linux ARCH=amd64   
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz 
tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz
rm -f go$VERSION.$OS-$ARCH.tar.gz 
echo 'export PATH=/usr/local/go/bin:$PATH' >> /etc/profile
source /etc/profile

# 安装singularity,这里的安装版本为3.2.0 
export VERSION=3.2.0 
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz 
tar -xzf singularity-${VERSION}.tar.gz
cd singularity
./mconfig
cd builddir/
make && make install
cd ../..
rm -rf singularity*

2、制作镜像(本地计算机)

# 创建sandbox;
# 这里将创建的sandbox命名为ubuntu20_lammps,并使用docker hub上现有的容器 ubuntu:20.04 作为基础镜像。
singularity build --sandbox ./ubuntu20_lammps docker://ubuntu:20.04

# 进入创建好的sandbox,并进行修改;
# 其中-w表示可写。进入后singularity会自动挂载的HOME目录,如果是用root用户进入,则会挂载/root目录
singularity shell -w ./ubuntu20_lammps

# Ubuntu下安装LAMMPS并行版需要安装必要的依赖包
apt update && apt upgrade -y
apt install openmpi-bin openmpi-doc libopenmpi-dev -y
apt install gcc g++ gfortran make wget vim -y

# 安装fftw
wget http://www.fftw.org/fftw-3.3.9.tar.gz
tar zxvf fftw-3.3.9.tar.gz
cd fftw-3.3.9
./configure --prefix=/opt/software/fftw_3.3.9 --enable-shared --enable-static --enable-fma
make -j && make install

# 设置临时fftw环境变量
export PATH=/opt/software/fftw_3.3.9/bin:$PATH
export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH

# 安装lammps
wget https://lammps.sandia.gov/tars/lammps-10Feb21.tar.gz
tar zxvf lammps-10Feb21.tar.gz
cd lammps-10Feb21
cd src
vim MAKE/OPTIONS/Makefile.g++_openmpi # 修改如下行
  FFT_INC = -DFFT_FFTW -I/opt/software/fftw_3.3.9/include
  FFT_PATH = -L/opt/software/fftw_3.3.9/lib
  FFT_LIB = -lfftw3

make yes-std
make no-lib
make -j g++_openmpi

mkdir /opt/software/lammps
cp ./lmp_g++_openmpi /opt/software/lammps/

# 设置临时lammps环境变量
export PATH=/opt/software/lammps:$PATH

# 验证(容器内)
cd /root
cp /opt/lammps-10Feb21/bench/in.lj .
mpirun --allow-run-as-root -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj


# 退出容器,设置永久环境变量(宿主机)
vim ./ubuntu20_lammps/environment
# 加入下面两行
export PATH=/opt/software/fftw_3.3.9/bin:/opt/software/lammps:$PATH
export LD_LIBRARY_PATH=/opt/software/fftw_3.3.9/lib:$LD_LIBRARY_PATH

# 验证(宿主机)
singularity exec ./ubuntu20_lammps mpirun --allow-run-as-root -np 2 --mca btl ^openib lmp_g++_openmpi -in in.lj

# 把修改好的sandbox打包成sif格式;
# 删除不必要的安装包, 如 fftw-3.3.9.tar.gz lammps-10Feb21.tar.gz
# 使用前面创建的sandbox目录生成singularity image file格式镜像。
singularity build ubuntu20_lammps.sif ./ubuntu20_lammps


三、singularity 常用命令及参数


主要有四种操作:run、exec、shell和test(test不常用)。可以在命令行中通过--help参数查看各个指令的文档,比如singularity run --help,可以查看run指令的操作文档。



目录映射 [ --bind 或 -B ]

/test 是宿主机目录,/test1 是容器内部目录,容器内部目录不需要提前创建。

  singularity shell -B /test:/test1 ./myimage.sif


1.将本地SIF文件,转成sandbox

sudo singularity build --sandbox ./tmp/ your.sif
sudo singularity shell --writable ./tmp/


交互模式运行

$ singularity shell ubuntu.sif
Singularity: Invoking an interactive shell within container...

Singularity ubuntu.sif:~> pwd
/home/admin
Singularity ubuntu.sif:~> id
uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
复制

执行一个命令并退出

$ singularity exec ubuntu.sif bash -c  "pwd && id"
/home/admin
uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
复制

运行一个容器

$ singularity run ubuntu.sif
admin@bdmaster:~$ pwd
/home/admin
admin@bdmaster:~$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin),10(wheel)
复制

后台运行容器实例

启动实例

$ singularity instance.start ubuntu.sif test1
$ singularity instance.start ubuntu.sif test2
复制

查看实例

$ singularity instance.list
DAEMON NAME      PID      CONTAINER IMAGE
test1            14172    /home/admin/ubuntu.simg
test2            14239    /home/admin/ubuntu.simg
复制

操作实例

可以通过 shell, exec, run 命令来连到容器中运行命令

使用 shell 命令连入容器

$ singularity shell instance://test1
Singularity ubuntu.sif:~> ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
admin      1     0  0 03:14 ?        00:00:00 singularity-instance: admin [test1]
admin      3     0  3 03:14 pts/0    00:00:00 /bin/bash --norc
admin      4     3  0 03:14 pts/0    00:00:00 ps -ef
复制

使用 exec 执行命令

$ singularity exec instance://test1 ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
admin      1     0  0 03:14 ?        00:00:00 singularity-instance: admin [test1]
admin      6     0  0 03:15 pts/0    00:00:00 ps -ef
复制

停止实例

$ singularity instance.stop test1
$ singularity instance.stop test1
复制

绑定目录

在 Singularity 中也可以在 shell, run, instance.start 等命令中通过 "-B" 选项来实现 Docker 中 “-v” 选项提供挂载卷的功能,比如:

$ singularity shell -B /apps:/apps ubuntu.sif
  • 发表于 2022-11-05 20:49
  • 阅读 ( 5315 )
  • 分类:linux

0 条评论

请先 登录 后评论
omicsgene
omicsgene

生物信息

698 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 82 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章