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 など他のコマンドをコピーすればそれらのコマンドが動作する環境が出来上がります。