Changes between Initial Version and Version 1 of epics/wsl


Ignore:
Timestamp:
01/24/18 10:02:44 (6 years ago)
Author:
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で起動する。