Singularity on Windows 10
Singularity (https://sylabs.io/) は、コンテナ技術を使った仮想環境ツールです。
Windows 10 では、WSL (Windows Subsystem for Linux) を利用して、Linux のプログラムを実行することが出来ます。
WSL 1 では、システムコールの変換で対応していましたが、WSL 2 では、完全な Linux カーネルがサポートされます。
WSL 2 の Linux カーネルは、Hyper-v または、仮想マシンプラットホームで動作します。
WSLが動作すれば、Ubuntu ディストリビューションを動かすことができます。
Ubuntu が動作すれば、Singularity を動かすことができます。
ここでは、Windows 10 に、仮想マシンプラットホームと WSL 2 を設定し、Ubuntu をインストールし、Singularity を導入します。
仮想マシンプラットホームと WSL 2 の設定
Windows 10 バージョン 2004 以上であれば、WSL 2 を動かすことができます。
Windows 10 用 Windows Subsystem for Linux のインストール ガイド
https://docs.microsoft.com/ja-jp/windows/wsl/install-win10
公開情報に従い、管理者として PowerShell を開き(スタートメニューから PowerShell を右クリックし、管理者として実行する)、以下を実行します。
Linux 用 Windows サブシステム オプション機能を有効にします。
PS > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
仮想マシン プラットフォーム のオプション コンポーネントを有効にします。
PS > dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
ここで、Windowsを再起動して、インストールを完了させます。
管理者として PowerShell を開き、既定の WSL のバージョンを1ではなく、2にします。
PS > wsl --set-default-version 2
この際にエラー等が表示されることがあります。
その際には、以下の情報に従って、最新の WSL 2 用の Linux カーネル更新プログラムパッケージをインストールして下さい。
再度、WSL 2 への変更コマンドを実行すると、表示されなくなります。
WSL 2 Linux カーネルの更新
https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel
Ubuntu のインストール
WSL 用の Linux ディストリビューションをインストールします。
Microsoft Store から、"WSL" で検索し、Ubuntu 20.04 LTS をダウンロードし、インストールします。
新しい Linux ディストリビューションを起動し、ユーザー アカウントとパスワードを作成します。
この再入力したパスワードは、管理権限を利用する際(sudo コマンドなど)に必要となります。
Ubuntu からは、exit で抜け出せます。
$ exit
コマンドプロンプトや PowerShell で、インストールされたディストリビューションと動作する wsl のバージョンを見てみましょう。
> wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Stopped 2
コマンドプロンプトや PowerShellから、wsl または、bash と入力すると、Linux ディストリビューションが起動します。
> bash
$ ls /
bin dev home lib lib64 lost+found mnt proc run snap sys usr
boot etc init lib32 libx32 media opt root sbin srv tmp var
$
Ubuntu を最新版にアップデートするには、以下の様にします。
$ sudo apt update
$ sudo apt upgrade
$ exit
全てのディストリビューションを直ちに終了するには、Windows から以下の様に操作します。
> wsl --shutdown
Singularity のインストール
Ubuntu の apt を使って singularity をインストールすることができます。
但し、これでインストールされるのはゲームであって、コンテナ基盤ではありません。
Singularity をインストールするには、ソースコードからインストールする必要がありそうです。
Quick Installation Steps
https://sylabs.io/guides/3.6/user-guide/quick_start.html
必要なパッケージをインストールします。
$ sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools \
libseccomp-dev \
wget \
pkg-config \
git \
cryptsetup
続いて、Go をインストールします。
$ export VERSION=1.13 OS=linux ARCH=amd64 && \ # Replace the values as needed
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \ # Downloads the required Go package
sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \ # Extracts the archive
rm go$VERSION.$OS-$ARCH.tar.gz # Deletes the ``tar`` file
環境変数を設定し、Go にコマンドパスを通します。
$ echo 'export PATH=/usr/local/go/bin:$PATH' >> ~/.bashrc && \
source ~/.bashrc
Go は、apt でもインストールできます。この場合、コマンドパスを通す必要はありません。
$ sudo apt install golang
Singularity をダウンロードし展開します。
$ export VERSION=3.6.0 && # adjust this as necessary \
wget https://github.com/sylabs/singularity/releases/download/v${VERSION}/singularity-${VERSION}.tar.gz && \
tar -xzf singularity-${VERSION}.tar.gz && \
cd singularity
Singularity をコンパイルしインストールします。
$ ./mconfig && \
make -C builddir && \
sudo make -C builddir install
mconfig でバージョン関係のエラーが出る場合、以下のように VERSION ファイルにダウンロードしたバージョン番号を記述して、実行してみてください。
$ vi VERSION
3.7.4
Singularity の起動を確認してみます。
$ singularity
Docker Hub から alpine ディストリビューションをダウンロードしてみます。
$ singularity build test.sif docker://alpine
Singularity から alpine を動かして見ます。
$ singularity shell test.sif
Singularity> ls /
bin etc media proc sbin sys var
dev home mnt root singularity tmp
environment lib opt run srv usr
Singularity> exit
Singularity のインストールに利用した、カレントディレクトリにあるファイルは不要なので削除しても大丈夫です。
また、Singularity が利用したキャッシュも不要であれば以下の様に削除できます。
$ singularity cache clean
WSL の Ubuntu ディストリビューションについて
WSL 2 の Linux カーネルは、マイクロソフトが提供おり、Ubuntu の起動メッセージも以下の様に表示されるなど、Ubuntu と Windows は連携が取れています。
Welcome to Ubuntu 20.04.1 LTS (GNU/Linux 4.19.104-microsoft-standard x86_64)
Ubuntu 環境では、/mnt 以下に Windows のドライブがマウントされていて、Windows ファイルにアクセスできます。
コマンドパスを見るとわかるように、Windows のコマンドにもパスが通っています。
$ echo $PATH
Ubuntu の環境から GUI の Windows アプリも起動できます(.exe まで付ける必要があります)。
$ notepad.exe
Linux ディストリビューション イメージファイルの圧縮
WSL 2 では、ext4 形式のディスクイメージファイルを利用しているようです。
これは、以下の場所にあります。
C:\Users\ユーザ名\AppData\Local\Packages\ディストリビューション名\LocalState\ext4.vhdx
ディストリビューション名は、Ubuntu なら CanonicalGroupLimited で始まり、Debian なら TheDebianProject で始まります。
ディスクイメージは利用していると、不要な領域が発生するので、それらを除いてコンパクト化できます。
-
ご注意
-
ディスク圧縮は自己責任でお願いします。
コマンドプロンプトを開き、ディストリビューションを停止させ、DISKPART を起動します。
> wsl --shutdown
> diskpart
以下の様に、仮想ディスクファイルを選択(select vdisk file="仮想ディスクファイル")し、圧縮(compact vdisk)します。
DISKPART> select vdisk file="C:\Users\ユーザ名\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_???????????\LocalState\ext4.vhdx"
DiskPart により、仮想ディスク ファイルが選択されました。
DISKPART> compact vdisk
100% 完了しました
DiskPart により、仮想ディスク ファイルは正常に圧縮されました。
DISKPART> exit
X-Window アプリケーションの実行
WSL 2 では、IP アドレスが振られるため、設定をしないと、X ウィンドウのアプリケーションが起動しないようです。
Windows 10 で起動させる X サーバを、VcXsrv とした場合、起動時に "Disable access control" をチェックし、異なる IP アドレスからの接続を許可するようにします。
WSL 2 で、Ubuntu を起動したら、/etc/resolv.conf の nameserver に書かれている IP アドレスで、DISPLAY 環境変数を設定します。
$ export DISPLAY=IPアドレス:0.0
この設定を自動化するには、~/.profile などに例えば以下の様に付け加えます。
export DISPLAY=$(tail -1 /etc/resolv.conf | cut -d' ' -f2):0
Ubuntu に X11 のアプリケーションをインストールし、xeyes を起動してみます。
$ sudo apt install x11-apps
$ xeyes
これで、Ubuntu から Windows への X アプリの起動が確認できれば、Ubuntu 上の singularity で動作するインスタンスからも X11 アプリが起動できるはずです。
例えば、alpine の場合は、xeyes をインストールすれば、必要なライブラリもインストールされ、X11 アプリが起動します。
Singularity> apk add xeyes
Singularity> xeyes
OpenGL アプリケーションのビルド
まず、WSL の Ubuntu で開発環境をインストールします。
$ sudo apt install build-essential
$ sudo apt install xorg-dev
$ sudo apt install libopengl-dev
$ sudo apt install freeglut3-dev
以下のようにして、ライブラリをリンクしてビルドします。
$ gcc life3g.c -lglut -lGL -lGLU
実行します。
$ export LIBGL_ALWAYS_INDIRECT=1
$ ./a.out