後方乱気流

シミュレータとOSSのメモ

軽量コンテナsystemd-nspawnによるOpenFOAM-v1912導入

目的と趣旨

OpenFOAM-v1912をXubuntu20.04上に導入します。
今回はXubuntuに採用されているシステム管理デーモンsystemd配下の、systemd-nspawnを使用してUbuntu18.04コンテナを作成し、OpenFOAMのインストールを試みます。
ParaViewは ホスト側(Xubuntu20.04)のXサーバに接続して描画できないか挑戦してみました。

なぜsystemd-nspawn?

  • 動作が軽い。
  • ホスト/コンテナ両方でsystemd-networkdが起動していると、自動でホスト-コンテナ通信を確立してくれる。
  • Xubuntuにはsystemdが標準でインストールされているので、セットアップが楽。
  • OpenFOAMのコンパイルにしか使わないライブラリとか諸々をホスト側から隔離しておきたい。
  • ミスってもコンテナごと消し飛ばせばOK!
  • 将来的にはAnsibleなどのサーバー自動設定ツールでゴニョゴニョできるかも...?

なぜDockerを使わない?

  • 筆者のスキル不足が主要因です。
  • Linux上で使い捨てコンテナが作れれば何でも良かったのです。
  • ParaViewなどopenGL周りでトラブルが多発し、嫌気が差したのも理由の一つです。

今回の環境

導入したいもの

  • OpenFOAM-v1912
  • ParaView v5.6.3 (OpenFOAM-v1912 に付属)

注意

  • 筆者のための作業履歴 兼 備忘録です。手順は最適化されていません。
  • root権限で作業する場面が多々あります。コマンドの動作可否、結果について筆者は何ら保証しません。
  • 本記事通りに作業しても、OpenFOAM等が動作する保証もありません。
  • 特にParaview周りは鬼門だと思います。

作業

コンテナ作成

まずはsystemd-nspawnのためのコンテナを作成します。
UbuntuDebian系なのでdebootstrapで環境構築が可能です。

### systemd-nspawnに必要なソフトウェアをインストール
sudo apt install systemd-container
sudo apt install debootstrap

### コンテナのルートディレクトリを作成
### Ubuntu18.04を導入する。
mkdir container && cd container
mkdir Ubuntu1804
sudo debootstrap --arch=amd64 bionic Ubuntu1804 http://archive.ubuntu.com/ubuntu

### コンテナを起動してrootパスワードを設定し、ユーザー(user_nameは任意の文字列)を作成する。
### user_nameをsudoerに任命し終了する。
sudo systemd-nspawn -D ~/container/Ubuntu1804
passwd
adduser user_name
gpasswd -a user_name sudo
### ここまでできたら、ctrl + ] x3回でコンテナにkillシグナルを送り、終了する。

X11の整備

コンテナを起動して x window system環境を整えます。

### bオプションを付けてコンテナを起動する。
### bind-roオプションでコンテナ内のX11アプリケーションをホストの画面に出力させる。(ソケット通信)
### 先程作成したユーザー名とパスワードでログインする。
sudo systemd-nspawn -b -D ~/container/Ubuntu1804 --bind-ro /tmp/.X11-unix:/tmp/.X11-unix

### ダウンローダとテキストエディタをインストール
sudo apt install wget vim

### X11アプリケーションをホストの画面に出力させる。
### DISPLAY変数が設定されていないので、.profileに追記する。
vim ~/.profile
'''~/.profile
(前略)
export DISPLAY=:0.0
'''

### x window systemを整備する。
sudo apt install x11-utils x11-apps

### 設定がうまく行っているかxeyesでテストしてみる。
### 表示されないときはホスト側に戻り、xauth, xhostコマンドでlocalhostからの接続を許可する。
xeyes

目玉が表示されればグラフィック周りはひとまず大丈夫です。

OpenFOAM-v1912の導入の前準備

### リポジトリが"http://archive.ubuntu.com/ubuntu bionic main"しか登録されていない。
### /etc/apt/sources.list を開いて適宜追加する(要root権限)。今回は以下の様に追加した。
sudoedit /etc/apt/sources.list
''' sources.list
deb http://archive.ubuntu.com/ubuntu bionic main universe
deb http://archive.ubuntu.com/ubuntu bionic-security main universe
deb http://archive.ubuntu.com/ubuntu bionic-updates main universe
deb-src http://archive.ubuntu.com/ubuntu bionic main universe
deb-src http://archive.ubuntu.com/ubuntu bionic-security main universe
deb-src http://archive.ubuntu.com/ubuntu bionic-updates main universe
'''
### OpenFOAMソースファイルとThird Partyライブラリ群のダウンロード&解凍する。
mkdir ~/OpenFOAM && cd ~/OpenFOAM
wget https://sourceforge.net/projects/openfoam/files/v1912/OpenFOAM-v1912.tgz
wget https://sourceforge.net/projects/openfoam/files/v1912/ThirdParty-v1912.tgz
tar -xzf OpenFOAM-v1912.tgz && tar -xzf ThirdParty-v1912.tgz

### コンパイルに必要なライブラリやツールをインストールする。
### (参考) https://openfoamwiki.net/index.php/Installation/Linux/OpenFOAM-v1806/Ubuntu
sudo apt install build-essential flex bison cmake zlib1g-dev libboost-system-dev libboost-thread-dev
sudo apt install libopenmpi-dev openmpi-bin gnuplot libreadline-dev libncurses-dev libxt-dev
sudo apt install qt5-default libqt5x11extras5-dev libqt5help5 qtdeclarative5-dev qttools5-dev
sudo apt install libqtwebkit-dev freeglut3-dev libqt5opengl5-dev texinfo
sudo apt install libscotch-dev libcgal-dev python python-dev

apt install でxxxxx is not foundエラーが出るときは /etc/apt/sources.listを再確認してください。
"http://jp.archive.ubuntu.com/ubuntu/"の方がDL速いかもしれません。

OpenFOAMをコンパイル

ようやくコンパイルです。コア数の指定を忘れずに...(1敗)

### OpenFOAMをコンパイル
source ~/OpenFOAM/OpenFOAM-v1912/etc/bashrc
foam
./Allwmake > log.Allwmake 2>&1 &

### マシンのCPUコア数とRAMに余力がある方は、jオプションによる並列処理も可能です。
### ./Allwmake -j 8 > log.Allwmake 2>&1 &
tail +F log.Allwmake

で進行状況を確認できます。
1スレッドコンパイルで最大メモリ使用量は約2.5 GBでした。

ParaViewのコンパイル準備

気持ちが先走ってOpenFOAMを既にコンパイルしてしまいました。
本来はParaViewのコンパイルが先のようです。

cd ~/OpenFOAM/ThirdParty-v1912

### ubuntu18.04の/bin/shはdashのシンボリックリンクになっており、
### そのままではmakeParaViewがうまく動作しない。
### 修正方法は以下の通り(shebangの変更か/bin/shのリンク修正のどちらかで対応する。)
### makeParaView1行目を#/bin/bashに変更する。
vim makeParaView
'''$WM_THIRD_PARTY_DIR/makeParaView
#!/bin/bash
(後略)
'''
### /bin/shのシンボリックリンクをdashからbashに変更
### 選択肢はNoを選ぶ。
sudo dpkg-reconfigure dash

ようやくParaViewコンパイル

### 勝手にマルチスレッド処理してくれるようです。
./makeParaView > log.makePV 2>&1 &
less +F log.makePV

ParaViewプラグインコンパイル

### ParaviewをOpenFOAMより後にコンパイルしたせいかPVReader系がうまく動かない。
### エラー文に従って対処する。
cd $WM_PROJECT_DIR/applications/utilities/postProcessing/graphics/PVReaders
./Allwclean
./Allwmake
wmRefresh

On-Screen Mesa化

openGL周りのエラーに嫌気が差していたので、この際mesaに頼ることにしました。
結果的にParaViewが動くようになりましたが、他のホスト環境(AMDNVIDIA GPU)でどうなるかは不明です。
(あとはレンダリングの負荷がどうなるか...)

### (参考) https://openfoamwiki.net/index.php/Installation/On-Screen_Mesa/Ubuntu#Ubuntu_18.04
sudo apt install mesa-utils libglu1-mesa-dev scons llvm-dev python-pip libyaml-dev
pip install prettytable Mako pyaml dateutils --upgrade
sudo apt build-dep mesa

cd $WM_THIRD_PARTY_DIR
sudo apt source mesa
### mesaソースディレクトリのオーナーがrootになっていたので、
### ログイン中のユーザーに所有権を移した。(user_name, group_nameは自分のコンテナ環境に合わせて変更する。)
cd mesa-19.2.8 && sudo chown -hR user_name:group_name .
scons build=release texture_float=yes libgl-xlib > log.makeMesa 2>&1
cp -vr build/linux-x86_64/gallium/targets/libgl-xlib/* $ParaView_DIR/lib/

ここはノートラブルでした。
ダメな場合はlog.makeMesaの末尾を読んで対処してください。

動作チェック

適当にチュートリアルを実行して、完走するか確かめてみてください。

mkdir ~/Documents/openFoam/ && cd ~/Documents/openFoam/
tut
cp -r ./incompressible/simpleFoam/pitzDaily ~/Documents/openFoam/
cd - 
cd pitzDaily
blockMesh > log.blockMesh 2>&1
simpleFoam > log.simpleFoam 2>&1
paraFoam

筆者の環境では、OpenFOAM/ParaViewどちらも問題なく動きました。
追々、decomposeParやsnappyHexMeshの動作チェックもしていきたいです。

参考

systemd-nspawn - ArchWiki

OpenCFD Release OpenFOAM® v1912

Installation/On-Screen Mesa/Ubuntu - OpenFOAMWiki