Changes between Initial Version and Version 1 of epics/wsl


Ignore:
Timestamp:
01/24/18 10:02:44 (7 years ago)
Author:
Takashi Obina
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • epics/wsl

    v1 v1  
     1= WSL (Windows Subsystem for Linux) に EPICS をインストール =
     2Windows Subsystem for Linux (WSL) の上で EPICS を動かす。
     3過去に書いている [wiki:epics/install VM + CentOS] とか [wiki:epics/raspberrypi Raspberry Pi] とか [wiki:epics/bbb/debian BeagleBone Black] などと
     4ほぼ同じ手順でインストールできる。
     5
     6結局、これを何に使うのか?(どんなご利益があるのか)という議論は別に必要。
     7
     8
     9== 準備 ==
     10 * Windows Subsystem for Linux (WSL) のインストール、セットアップについては先人の文書がたくさんあるのでそちらを参照してください。
     11 * 2017年10月の Windows Fall Creators Update を入れることを推奨。
     12 * X window emulator は [https://sourceforge.net/projects/xming Xming] か [https://sourceforge.net/projects/vcxsrv/ VcXsrv] あたりをインストールする。
     13   * 最近は !VcXsrv の方が流行している印象
     14   * Xのためだけに !Cygwin を入れるのはちょっと....
     15
     16
     17最初の段階では gcc, make など開発環境関連も無い。とりあえず以下の順でパッケージを入れた。
     18{{{
     19$ sudo apt-get update
     20....
     21$ sudo apt-get install build-essential
     22$ sudo apt-get install python-minimal python-pip
     23$ sudo apt-get install x11-apps x11-utils x11-xserver-utils
     24$ sudo apt-get install gnuplot-x11
     25}}}
     26ここまでは一般的なお話。次にEPICS。
     27
     28== EPICS インストール ==
     29OSバージョン確認
     30{{{
     31$ cat /etc/os-release
     32NAME="Ubuntu"
     33VERSION="16.04.3 LTS (Xenial Xerus)"
     34ID=ubuntu
     35ID_LIKE=debian
     36PRETTY_NAME="Ubuntu 16.04.3 LTS"
     37VERSION_ID="16.04"
     38...
     39}}}
     40
     41ディレクトリ構成は慣れた形に
     42{{{
     43/opt/epics/R315.5/base
     44          |       /extensions
     45          |       /modules/soft/seq
     46          |               |    /asyn
     47          |               |    /stream
     48          |               |
     49          |               /instruments
     50         
     51          /R316.1/base
     52}}}
     53実は、最初のR3.16 を試そうとしたが、medmで問題が出た。
     54現状では stable release である 3.15 を使うべきだろう(2018/01/23)。
     55
     56環境変数の設定とベースのダウンロード
     57{{{
     58$ export EPICS_HOST_ARCH=linux-x86_64
     59$ wget https://epics.anl.gov/download/base/base-3.15.5.tar.gz
     60}}}
     61base ファイルを /opt/epics/R315.5/base 以下に展開
     62
     63コンパイルすると readline.h が無いとか、いくつかパッケージが足りない。
     64後でsequencerのために必要になるので re2c も入れておく
     65{{{
     66$ sudo apt-get install libreadline-dev
     67$ sudo apt-get install re2c
     68}}}
     69
     70これだけで、特に問題なく base のコンパイルは通るはず。
     71
     72
     73
     74パスを設定するファイルを作っておく。例えばこんな感じ:
     75{{{
     76export EPICS_BASE=/opt/epics/R315.5/base
     77export EPICS_EXTENSIONS=/opt/epics/R315.5/extensions
     78export EPICS_HOST_ARCH=linux-x86_64
     79
     80export PATH=$PATH:$EPICS_BASE/bin/$EPICS_HOST_ARCH:$EPICS_EXTENSIONS/bin/$EPICS_HOST_ARCH
     81}}}
     82
     83
     84
     85== Example Application の作成 ==
     86これもいつもの通り。例えば
     87{{{
     88$ mkdir -p ~/epics/app/example
     89$ cd ~/epics/app/example
     90$ makeBaseApp.pl -t example example
     91$ makeBaseApp.pl -i -t example example
     92Using target architecture linux-x86_64 (only one available)
     93The following applications are available:
     94    example
     95What application should the IOC(s) boot?
     96The default uses the IOC's name, even if not listed above.
     97Application name? example
     98$
     99$ ll
     100total 4
     101drwxrwxr-x 0 obina obina 512 Jan 22 19:13 ./
     102drwxrwxr-x 0 obina obina 512 Jan 22 19:12 ../
     103drwxrwxr-x 0 obina obina 512 Jan 22 19:13 configure/
     104drwxrwxr-x 0 obina obina 512 Jan 22 19:13 exampleApp/
     105drwxrwxr-x 0 obina obina 512 Jan 22 19:13 iocBoot/
     106-rw-rw-r-- 1 obina obina 900 Jan 22 19:13 Makefile
     107
     108$ make
     109
     110}}}
     111
     112特にエラーが出ずに終了したら
     113{{{
     114$ cd iocBoot/iocexample
     115$ chmod +x st.cmd
     116$ ./st.cmd
     117}}}
     118
     119その後、もう1つ端末を開いて
     120{{{
     121$ camonitor obina:ai1
     122}}}
     123などとすれば良い。
     124
     125
     126
     127ioc起動の詳細:
     128{{{
     129$ ./st.cmd
     130#!../../bin/linux-x86_64/example
     131< envPaths
     132epicsEnvSet("IOC","iocexample")
     133epicsEnvSet("TOP","/home/obina/epics/app/example")
     134epicsEnvSet("EPICS_BASE","/opt/epics/R316.1/base")
     135cd "/home/obina/epics/app/example"
     136## Register all support components
     137dbLoadDatabase "dbd/example.dbd"
     138example_registerRecordDeviceDriver pdbbase
     139## Load record instances
     140dbLoadTemplate "db/user.substitutions"
     141dbLoadRecords "db/exampleVersion.db", "user=obina"
     142dbLoadRecords "db/dbSubExample.db", "user=obina"
     143#var mySubDebug 1
     144#traceIocInit
     145cd "/home/obina/epics/app/example/iocBoot/iocexample"
     146iocInit
     147Starting iocInit
     148############################################################################
     149## EPICS R3.16.1
     150## EPICS Base built Jan 23 2018
     151############################################################################
     152iocRun: All initialization complete
     153## Start any sequence programs
     154#seq sncExample, "user=obina"
     155epics> dbl
     156obina:subExample
     157obina:aiExample
     158obina:aiExample1
     159obina:ai1
     160obina:aiExample2
     161obina:ai2
     162obina:aiExample3
     163obina:ai3
     164obina:xxxExample
     165obina:aSubExample
     166obina:example:version
     167obina:calcExample
     168obina:calcExample1
     169obina:calc1
     170obina:calcExample2
     171obina:calc2
     172obina:calcExample3
     173obina:calc3
     174obina:compressExample
     175epics>
     176}}}
     177
     178
     179{{{
     180$ camonitor obina:ai1
     181epicsSocketEnableAddressReuseDuringTimeWaitState: unable to set SO_REUSEADDR?
     182epicsSocketEnableAddressReuseDuringTimeWaitState: unable to set SO_REUSEADDR?
     183obina:ai1                      2018-01-22 19:22:43.528756 4 LOW MINOR
     184obina:ai1                      2018-01-22 19:22:44.525883 5
     185obina:ai1                      2018-01-22 19:22:45.531709 6 HIGH MINOR
     186obina:ai1                      2018-01-22 19:22:46.527323 7 HIGH MINOR
     187obina:ai1                      2018-01-22 19:22:47.518523 8 HIHI MAJOR
     188obina:ai1                      2018-01-22 19:22:48.530203 9 HIHI MAJOR
     189obina:ai1                      2018-01-22 19:22:49.517881 0 LOLO MAJOR
     190}}}
     191
     192soft ioc を2つ立ち上げると、後で起動したほうが REUSEADDR の制限でアクセスできない。
     193WSL で SO_REUSEADDR が実装されたがまだ問題があるとの報告がたくさんある。
     194(それが本当の原因なのかどうか....)
     195
     196さて、そこで src/libCom/osi/WIN32/osdSockAddrReuse.cpp
     197のソースを見る。J. Hill のコメントで、windows では REUSEADDR は不要とある!!
     198実際にwin32版ではこの関数の中身はコメントアウト状態。
     199つまり WSL では EPICS_HOST_ARCH=linux-x86_64 なので libCom/osi/posix のソースを
     200使うにもかかわらず実際の sockopt はwindowsに依存するためにエラーになる。
     201
     202一番簡単にはposixディレクトリにある当該ファイルを全部コメントアウトすることだが、
     203他にも同様にソースに手を入れる必要が出てくるかもしれない。
     204本当は
     205{{{
     206$EPICS_BASE/configure/CONFIG_SITE
     207}}}
     208の中で適当な変数(WINDOWS_WSL=YES)を定義して、#ifdef で切り分ける方針が正しい作法か?
     209今回は検証目的なので、とりあえず直接ソースでを編集した。
     210iocを複数動かさないのであれば何もソースを編集する必要は無い。
     211
     212----------------------------------------------------------------------
     213次に asyn, seq, stream。同じ手順なので、先のリンク(VM, RasPi, BBB 等)を参照。
     214今回ダウンロードしたバージョンとリンク先は以下の通り
     215{{{
     216asyn   : https://www.aps.anl.gov/epics/download/modules/asyn4-32.tar.gz
     217seq    : http://www-csr.bessy.de/control/SoftDist/sequencer/releases/seq-2.2.5.tar.gz
     218stream : https://github.com/paulscherrerinstitute/StreamDevice/archive/stream_2_7_7.tar.gz
     219}}}
     220※ seq を入れた後で、soft ioc で動くことを確認した
     221
     222----------------------------------------------------------------------
     223Extensions
     224{{{
     225Top  : https://www.aps.anl.gov/epics/download/extensions/extensionsTop_20120904.tar.gz
     226msi  : https://epics.anl.gov/download/extensions/msi1-7.tar.gz
     227medm : https://github.com/epics-extensions/medm/archive/MEDM3_1_14.tar.gz
     228}}}
     229----------------------------------------------------------------------
     230medmをインストールする際に、色々とエラーが出る。必要なパッケージをまとめると以下の通り。
     231{{{
     232libmotif-common libmotif-dev libxm4 libx11-dev libxpm-dev libxt-dev libxmu-dev x11proto-print-dev
     233}}}
     234
     235それと、WSLでは /usr/lib/x86_64-linux-gnu 以下にライブラリが入るみたいなので、設定ファイル
     236{{{
     237/opt/epics/R316.1/extensions/configure/os/CONFIG_SITE.linux-x86_64.linux-x86_64
     238}}}
     239ファイルを編集して、
     240{{{
     241X11_LIB=/usr/lib64
     242 ↓
     243X11_LIB=/usr/lib/x86_64-linux-gnu
     244
     245MOTIF_LIB=/usr/lib64
     246 ↓
     247MOTIF_LIB=/usr/lib/x86_64-linux-gnu
     248}}}
     249と変更しておく。
     250
     251次に、libXpが無いと言われる。これはBBBでも出てきた。
     252{{{
     253https://packages.ubuntu.com/ja/trusty/libxp6
     254X Printing Extension (Xprint) client library
     255}}}
     256
     257Ubuntu14の頃にはパッケージとして存在したようだが、今は無い。
     258{{{
     259https://packages.debian.org/jessie/amd64/libxp6/download
     260}}}
     261から jessie (Ubuntu15)のパッケージをとってきて手動で入れるのが簡単か?
     262例えばミラーサイトだと直リンクは以下の通り
     263{{{
     264$ wget http://ftp.jp.debian.org/debian/pool/main/libx/libxp/libxp6_1.0.2-2_amd64.deb
     265$ wget http://ftp.jp.debian.org/debian/pool/main/libx/libxp/libxp-dev_1.0.2-2_amd64.deb
     266$ sudo dpkg -i libxp6_1.0.2-2_amd64.deb libxp-dev_1.0.2-2_amd64.deb
     267$ ls -al /usr/lib/x86_64-linux-gnu/libXp*
     268-rw-r--r-- 1 root root  61068 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.a
     269lrwxrwxrwx 1 root root     14 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so -> libXp.so.6.2.0
     270lrwxrwxrwx 1 root root     14 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so.6 -> libXp.so.6.2.0
     271-rw-r--r-- 1 root root  33248 Aug 20  2014 /usr/lib/x86_64-linux-gnu/libXp.so.6.2.0
     272}}}
     273
     274
     275Xエミュレーターを立ち上げておいてから
     276{{{
     277$ export DISPLAY=localhost:0.0
     278$ medm
     279}}}
     280で起動する。