EQQ.jp

Index


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 アドレスからの接続を許可するようにします。

VcXsrv VcXsrv VcXsrv VcXsrv

 

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