EQQ.jp

Index


Singularity

Singularity (https://sylabs.io/) は、コンテナ技術を使った仮想環境ツールです。

仮想計算機とコンテナとの違いがよく問われます。仮想計算機では、仮想環境毎にカーネルが動作します。コンテナでは、仮想環境もホスト計算機のカーネルを利用します。カーネルの起動時間やメモリなどのリソースの分、コンテナの方が有利だと言われています。
コンテナ用に用意された多くの仮想環境のイメージが、すぐに簡単に利用できるのも魅力です。

コンテナプラットフォームとしては、Docker が有名ですが、Singularity の方が以下の点で優れています。

また、Docker 向けの仮想環境イメージを利用することもできます。

 

インストール

インストールは、ドキュメント (https://sylabs.io/guides/3.5/user-guide/index.html) にあるように、ソースコードからインストールすることもできますが、CentOS 7 の場合、yum でインストールできます。

EPEL (Extra Packages for Enterprise Linux) がインストールされてない場合、EPEL をインストールします。

$ sudo yum install epel-release

 

Singularity をインストールします。

$ sudo yum install singularity

 

動作を確認します。

$ singularity

 

仮想環境用のイメージファイルの作成

Docker Hub (https://hub.docker.com/) などからベースとなるイメージをダウンロードして書き込み可能なサンドボックスを作ります。
以下の場合、Docker Hub から CentOS のバージョン7(centos:7) をダウンロードし、centos7 というディレクトリ名のサンドボックスを作ります。

$ sudo singularity build --fix-perms --sandbox centos7 docker://centos:7
$ ls centos7/
anaconda-post.log  dev          etc   lib    media  opt   root  sbin         srv  tmp  var
bin                environment  home  lib64  mnt    proc  run   singularity  sys  usr

 

作成したサンドボックス環境に書き換え可能でログインします。

$ sudo singularity shell --writable centos7

 

yum などで必要なパッケージをインストールします。
以下の場合、SDL ライブラリをインストールしています。

Singularity> yum install -y SDL

 

終了します。
Singularity> exit

 

必要ならファイルを sandbox 内にコピーします。

$ sudo cp a.out centos7/opt/

 

書き換え不可でログインします。

$ singularity shell centos7

 

動作を確認します。

Singularity> /opt/a.out

 

設定が完了したサンドボックスをイメージファイル(sif) へ変換します。

$ sudo singularity build centos7.sif centos7/

 

イメージファイルからの起動を確認します。

$ singularity shell centos7.sif 
Singularity> /opt/a.out

singularity を起動すると、ホストのホームディレクトリもマウントされます。
なので、ホームディレクトリへの読み書きは実行できます。

一時的にイメージファイルに書き込みをしたいときは、--writable-tmpfs オプションを付けて起動します。
これは、実際にはイメージファイルに書き込みは実行されません。再実行すると元に戻ります。

$ singularity shell --writable-tmpfs centos7.sif 
Singularity> /opt/a.out

 

 

定義ファイルから仮想環境用イメージファイルの作成

上述した手順は、以下の様な定義ファイル(https://sylabs.io/guides/3.5/user-guide/definition_files.html)を用意すれば、手順に従ってイメージファイルの構築が行えます。

$ cat receipt.def 
Bootstrap: docker
From: centos:7

%post
	yum -y install SDL

%files
	a.out /opt/

 

Singularity定義ファイルから、イメージファイルを作成します。

$ sudo singularity build test.sif receipt.def

 

作成したイメージファイルへログインして、動作を確認します。

$ singularity shell test.sif
Singularity> /opt/a.out

 

仮想環境用イメージファイルのリモート作成

上述した例では、管理権限でイメージファイルに手を加えてました。
リモートで実行すれば、ユーザ権限で、作成できます。
リモートビルダーの実行には、Sylabs Cloud (https://cloud.sylabs.io/builder) のアカウントが必要で、トークンを作り、設定する必要があります。

$ singularity remote login

 

例えば、Alpine ディストリビューション用の定義ファイル

$ cat alpine.def 
Bootstrap: docker
From: alpine

%post
	apk update
	apk upgrade

リモートビルダーの実行

$ singularity build --remote alpine.sif alpine.def

 

キャッシュファイルのクリーンアップ

Singularity を使っていると、~/.singularity/cache 以下にキャッシュファイルが作成されます。
これをクリーンアップしたい場合、以下の様にします。

$ singularity cache clean

 

閑話 - 簡易コンテナ体験

コンテナは、ファイルシステムやデバイス、ネットワークなどを閉じた環境で実現するのですが、簡易的にファイルシステムを閉じた環境にするには、chroot コマンドで実現できます。

chroot コマンドは、ファイルシステムのルートを指定したディレクトリに変更するコマンドです。

変更するには、変更後の環境で bin/bash が実行できる必要があります。
そのためには、以下のコマンドで表示されるライブラリも必要です。

$ ldd /bin/bash

あるディレクトリに、/bin/bash と上述したライブラリをコピーし、chroot コマンドでそのディレクトリにファイルシステムのルートを変更すると、その環境で動作します。

$ sudo chroot あるディレクトリ
# exit	で終了します

/bin/bash しかコピーしてないので、ほとんど何もできませんが、ls など他のコマンドをコピーすればそれらのコマンドが動作する環境が出来上がります。