wiki:epics/wsl

WSL (Windows Subsystem for Linux) に EPICS をインストール

Windows Subsystem for Linux (WSL) の上で EPICS を動かす。 過去に書いている VM + CentOS とか Raspberry Pi とか BeagleBone Black などと ほぼ同じ手順でインストールできる。

結局、これを何に使うのか?(どんなご利益があるのか)という議論は別に必要だが、特に入門用環境として便利だと感じた。 今後「試しにEPICSを使ってみたい」という人がいたら、VMを入れるのではなくこちら(WSL)を推奨するかもしれない。

準備

  • 2017年10月の Windows Fall Creators Update を入れることを推奨(というより必須)
  • X window emulator は XmingVcXsrv あたりをインストールする。
    • 最近は VcXsrv の方が流行している印象
    • Xのためだけに Cygwin を入れるのは(個人的には)お勧めしない

最初の段階では gcc, make など開発環境関連も無い。とりあえず以下の順でパッケージを入れた。

$ sudo apt-get update
....
$ sudo apt-get install build-essential
$ sudo apt-get install python-minimal python-pip
$ sudo apt-get install x11-apps x11-utils x11-xserver-utils
$ sudo apt-get install gnuplot-x11

ここまでは一般的なお話。次にEPICS。

EPICS インストール

OSバージョン確認

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
...

ディレクトリ構成は慣れた形に

/opt/epics/R315.5/base
          |       /extensions
          |       /modules/soft/seq
          |               |    /asyn
          |               |    /stream
          |               |
          |               /instruments
          
          /R316.1/base

実は、最初のR3.16 を試そうとしたが、medmで問題が出た。 現状では stable release である 3.15 を使うべきだろう(2018/01/23)。

環境変数の設定とベースのダウンロード

$ export EPICS_HOST_ARCH=linux-x86_64
$ wget https://epics.anl.gov/download/base/base-3.15.5.tar.gz

base ファイルを /opt/epics/R315.5/base 以下に展開

コンパイルすると readline.h が無いとか、いくつかパッケージが足りない。 後でsequencerのために必要になるので re2c も入れておく

$ sudo apt-get install libreadline-dev
$ sudo apt-get install re2c

これだけで、特に問題なく base のコンパイルは通るはず。

パスを設定するファイルを作っておく。例えばこんな感じ:

export EPICS_BASE=/opt/epics/R315.5/base
export EPICS_EXTENSIONS=/opt/epics/R315.5/extensions
export EPICS_HOST_ARCH=linux-x86_64

export PATH=$PATH:$EPICS_BASE/bin/$EPICS_HOST_ARCH:$EPICS_EXTENSIONS/bin/$EPICS_HOST_ARCH

Example Application の作成

これもいつもの通り。例えば

$ mkdir -p ~/epics/app/example
$ cd ~/epics/app/example
$ makeBaseApp.pl -t example example
$ makeBaseApp.pl -i -t example example
Using target architecture linux-x86_64 (only one available)
The following applications are available:
    example
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name? example
$
$ ll
total 4
drwxrwxr-x 0 obina obina 512 Jan 22 19:13 ./
drwxrwxr-x 0 obina obina 512 Jan 22 19:12 ../
drwxrwxr-x 0 obina obina 512 Jan 22 19:13 configure/
drwxrwxr-x 0 obina obina 512 Jan 22 19:13 exampleApp/
drwxrwxr-x 0 obina obina 512 Jan 22 19:13 iocBoot/
-rw-rw-r-- 1 obina obina 900 Jan 22 19:13 Makefile

$ make

特にエラーが出ずに終了したら

$ cd iocBoot/iocexample
$ chmod +x st.cmd
$ ./st.cmd

その後、もう1つ端末を開いて

$ camonitor obina:ai1

などとすれば良い。

ioc起動の詳細:

$ ./st.cmd
#!../../bin/linux-x86_64/example
< envPaths
epicsEnvSet("IOC","iocexample")
epicsEnvSet("TOP","/home/obina/epics/app/example")
epicsEnvSet("EPICS_BASE","/opt/epics/R316.1/base")
cd "/home/obina/epics/app/example"
## Register all support components
dbLoadDatabase "dbd/example.dbd"
example_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/exampleVersion.db", "user=obina"
dbLoadRecords "db/dbSubExample.db", "user=obina"
#var mySubDebug 1
#traceIocInit
cd "/home/obina/epics/app/example/iocBoot/iocexample"
iocInit
Starting iocInit
############################################################################
## EPICS R3.16.1
## EPICS Base built Jan 23 2018
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncExample, "user=obina"
epics> dbl
obina:subExample
obina:aiExample
obina:aiExample1
obina:ai1
obina:aiExample2
obina:ai2
obina:aiExample3
obina:ai3
obina:xxxExample
obina:aSubExample
obina:example:version
obina:calcExample
obina:calcExample1
obina:calc1
obina:calcExample2
obina:calc2
obina:calcExample3
obina:calc3
obina:compressExample
epics> 
$ camonitor obina:ai1
epicsSocketEnableAddressReuseDuringTimeWaitState: unable to set SO_REUSEADDR?
epicsSocketEnableAddressReuseDuringTimeWaitState: unable to set SO_REUSEADDR?
obina:ai1                      2018-01-22 19:22:43.528756 4 LOW MINOR
obina:ai1                      2018-01-22 19:22:44.525883 5
obina:ai1                      2018-01-22 19:22:45.531709 6 HIGH MINOR
obina:ai1                      2018-01-22 19:22:46.527323 7 HIGH MINOR
obina:ai1                      2018-01-22 19:22:47.518523 8 HIHI MAJOR
obina:ai1                      2018-01-22 19:22:48.530203 9 HIHI MAJOR
obina:ai1                      2018-01-22 19:22:49.517881 0 LOLO MAJOR

soft ioc を2つ立ち上げると、後で起動したほうが REUSEADDR の制限でアクセスできない。 WSL で SO_REUSEADDR が実装されたがまだ問題があるとの報告がたくさんある。 (それが本当の原因なのかどうか....)

さて、そこで src/libCom/osi/WIN32/osdSockAddrReuse.cpp のソースを見る。J. Hill のコメントで、windows では REUSEADDR は不要とある!! 実際にwin32版ではこの関数の中身はコメントアウト状態。 つまり WSL では EPICS_HOST_ARCH=linux-x86_64 なので libCom/osi/posix のソースを 使うにもかかわらず実際の sockopt はwindowsに依存するためにエラーになる。

一番簡単にはposixディレクトリにある当該ファイルを全部コメントアウトすることだが、 他にも同様にソースに手を入れる必要が出てくるかもしれない。 本当は

$EPICS_BASE/configure/CONFIG_SITE

の中で適当な変数(WINDOWS_WSL=YES)を定義して、#ifdef で切り分ける方針が正しい作法か? 今回は検証目的なので、とりあえず直接ソースでを編集した。 iocを複数動かさないのであれば何もソースを編集する必要は無い。


次に asyn, seq, stream。同じ手順なので、先のリンク(VM, RasPi, BBB 等)を参照。 今回ダウンロードしたバージョンとリンク先は以下の通り

asyn   : https://www.aps.anl.gov/epics/download/modules/asyn4-32.tar.gz
seq    : http://www-csr.bessy.de/control/SoftDist/sequencer/releases/seq-2.2.5.tar.gz
stream : https://github.com/paulscherrerinstitute/StreamDevice/archive/stream_2_7_7.tar.gz

※ seq を入れた後で、soft ioc で動くことを確認した


Extensions

Top  : https://www.aps.anl.gov/epics/download/extensions/extensionsTop_20120904.tar.gz
msi  : https://epics.anl.gov/download/extensions/msi1-7.tar.gz
medm : https://github.com/epics-extensions/medm/archive/MEDM3_1_14.tar.gz

medmをインストールする際に、色々とエラーが出る。必要なパッケージをまとめると以下の通り。

libmotif-common libmotif-dev libxm4 libx11-dev libxpm-dev libxt-dev libxmu-dev x11proto-print-dev

WSLでは /usr/lib/x86_64-linux-gnu 以下にライブラリが入るみたいなので、設定ファイル

/opt/epics/R316.1/extensions/configure/os/CONFIG_SITE.linux-x86_64.linux-x86_64

ファイルを編集して、

X11_LIB=/usr/lib64
 ↓
X11_LIB=/usr/lib/x86_64-linux-gnu

MOTIF_LIB=/usr/lib64
 ↓
MOTIF_LIB=/usr/lib/x86_64-linux-gnu

と変更しておく。

次に、libXpが無いと言われる。これはBBBでも出てきた。

https://packages.ubuntu.com/ja/trusty/libxp6
X Printing Extension (Xprint) client library

Ubuntu14の頃にはパッケージとして存在したようだが、今は無い。

https://packages.debian.org/jessie/amd64/libxp6/download

から jessie (Ubuntu15)のパッケージをとってきて手動で入れるのが簡単か? 例えばミラーサイトだと直リンクは以下の通り

$ wget http://ftp.jp.debian.org/debian/pool/main/libx/libxp/libxp6_1.0.2-2_amd64.deb
$ wget http://ftp.jp.debian.org/debian/pool/main/libx/libxp/libxp-dev_1.0.2-2_amd64.deb
$ sudo dpkg -i libxp6_1.0.2-2_amd64.deb libxp-dev_1.0.2-2_amd64.deb
$ ls -al /usr/lib/x86_64-linux-gnu/libXp*
-rw-r--r-- 1 root root  61068 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.a
lrwxrwxrwx 1 root root     14 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so -> libXp.so.6.2.0
lrwxrwxrwx 1 root root     14 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so.6 -> libXp.so.6.2.0
-rw-r--r-- 1 root root  33248 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so.6.2.0

Xエミュレーターを立ち上げておいてから

$ export DISPLAY=localhost:0.0
$ medm

で起動する。

Last modified 5 months ago Last modified on 01/25/18 19:55:32