1 | | Channel Archiver のビルドについて |
| 1 | == 概要 == |
| 2 | |
| 3 | Channel ArchiverはSpallation Neutron Source(SNS)でC++を用いて開発された、EPICSのデータを記録するためのツールセットである。[[BR]] |
| 4 | その中心となるArchive Engine はChannel Access(CA)を介して複数のCA Server(IOC)からデータを収集する。[[BR]] |
| 5 | 収集したデータは定期的に独自のバイナリ形式でローカルディスクファイル(データファイル)に書き出され、インデックスファイルによって関連付けられる(インデックスはR木で実装されている)。[[BR]] |
| 6 | これらの履歴データはXML-RPCを実装したData Serverを起動することで、ネットワーク上の他計算機からも読出すことができる。[[BR]] |
| 7 | |
| 8 | == ビルド方法 == |
| 9 | |
| 10 | 今回は以下の環境でビルドを行った。 |
| 11 | ||= OS =|| CentOS 7 64bit || |
| 12 | ||= GCC =|| 4.8.5 || |
| 13 | ||= EPICS Base =|| 3.14.12.5 || |
| 14 | |
| 15 | 1. '''EPICS Base及びExtensions セットアップ'''[[BR]] |
| 16 | まずは EPICS Base 及び Extensions をセットアップする。[[BR]] |
| 17 | これについては、[wiki:epics/install EPICSをゼロからインストール]に手順が記載されているため、ここでは説明を割愛する。 |
| 18 | 2. '''ソース ダウンロード'''[[BR]] |
| 19 | githubからクローンし、masterブランチでチェックアウトする。これよりも前?のバージョンはタグで管理されているようだ。 |
| 20 | {{{ |
| 21 | $ cd $EPICS_EXTENSIONS/src |
| 22 | $ git clone https://github.com/EPICSTools/ChannelArchiver |
| 23 | $ cd ChannelArchiver |
| 24 | $ git checkout --track origin/master |
| 25 | }}} |
| 26 | 3. '''必要なライブラリの整備'''[[BR]] |
| 27 | !ChannelArchiver/ThirdPartyディレクトリに、ビルド時に利用されるライブラリパッケージが置かれている。[[BR]] |
| 28 | 今回インストールしたライブラリは下記の通り。[[BR]] |
| 29 | なお、__xerces-c-devel及びperl-Frontier-RPCはソースからインストール__し、その他はyumでインストールした。[[BR]] |
| 30 | ||= Library =||= Version =|| |
| 31 | ||= xerces-c-devel =|| 2.8.0 || |
| 32 | ||= xmlrpc-c-devel =|| 1.32.5-1905 || |
| 33 | ||= perl-libwww-perl =|| 6.05-2 || |
| 34 | ||= expat =|| 2.1.0-8 || |
| 35 | ||= perl-XML-Simple =|| 2.20-5 || |
| 36 | ||= perl-Frontier-RPC =|| 0.07b4 || |
| 37 | 4. '''ビルド'''[[BR]] |
| 38 | GCCコンパイラのバージョンの影響かは分からないが、ビルド時にエラーが発生してしまう。[[BR]] |
| 39 | そこで、予め !ChannelArchiver/Tools/AVLTreeTest.cpp の修正を行っておく(この修正による影響はないとみている)。[[BR]] |
| 40 | |
| 41 | そのままビルドすると、sort_compare や toString の関数定義がないといわれる。[[BR]] |
| 42 | これはAVLTree.h がインクルードされた後に、上記の関数定義がされていたためである。[[BR]] |
| 43 | これを、__関数定義がされた後にインクルードするように修正__しておく。[[BR]] |
| 44 | |
| 45 | 修正後、makeする。[[BR]] |
| 46 | {{{ |
| 47 | $ cd $EPICS_EXTENSIONS/src/ChannelArchiver |
| 48 | $ make |
| 49 | $ ls $EPICS_EXTENSIONS/bin/linux-x86_64 |
| 50 | ArchiveDataClient.pl ArchiveExport make_compress_script.pl |
| 51 | ArchiveDataServerStandalone ArchiveIndexTool make_indexconfig.pl |
| 52 | ArchiveDataTool ArchiveManager |
| 53 | ArchiveEngine ConvertEngineConfig.pl |
| 54 | }}} |
| 55 | |
| 56 | == Archive Engine 起動 == |
| 57 | |
| 58 | 1. '''Configuration (XML) 作成'''[[BR]] |
| 59 | !ChannelArchiver/Engine ディレクトリ下に DTDファイル と サンプルのXMLファイルが置かれているので、これを参考に作成する。 |
| 60 | {{{ |
| 61 | $ ls $EPICS_EXTENSIONS/src/ChannelArchiver/Engine | grep engineconfig* |
| 62 | engineconfig.dtd engineconfig.xml |
| 63 | }}} |
| 64 | 2. '''起動'''[[BR]] |
| 65 | インデックスファイルとデータファイルを格納するディレクトリを用意し、各オプションを指定して起動する。 |
| 66 | {{{ |
| 67 | $ mkdir $HOME/ChannelArchiver/data |
| 68 | $ $EPICS_EXTENSIONS/bin/linux-x86_64/ArchiveEngine -port 4812 -description "Example IOC" -log log/engine.log engineconfig.xml $HOME/ChannelArchiver/data/index |
| 69 | }}} |
| 70 | |
| 71 | == Archive Engine管理ツール(!ArchiveDaemon) セットアップ == |
| 72 | |
| 73 | インデックスファイルは破損してしまうことがしばしばあり、サイズが大きいと復旧にかなりの時間を要する。[[BR]] |
| 74 | この影響を低減させる目的で、!ArchiveDaemonをセットアップする。[[BR]] |
| 75 | !ArchiveDaemonは複数のArchive Engineを一括管理でき、自動再起動なども設定できる。[[BR]] |
| 76 | |
| 77 | 1. '''!ArchiveDaemon 定義ファイル(XML)作成'''[[BR]] |
| 78 | 定義ファイルのサンプルは $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup ディレクトリに置かれている。[[BR]] |
| 79 | 例えば、日毎にインデックスファイルを作成する(Archive Engineを再起動する)場合は、以下のように記述する。 |
| 80 | {{{ |
| 81 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| 82 | <!DOCTYPE daemon SYSTEM "ArchiveDaemon.dtd"> |
| 83 | <daemon> |
| 84 | <port>4900</port> |
| 85 | <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BM'> |
| 86 | <desc>BM</desc> |
| 87 | <port>51130</port> |
| 88 | <config>/mnt/edata1/archiver/cssArchiver/xml_files/BM.xml</config> |
| 89 | <restart type='daily'>00:10</restart> |
| 90 | </engine> |
| 91 | <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BT'> |
| 92 | <desc>BT</desc> |
| 93 | <port>51131</port> |
| 94 | <config>/mnt/edata1/archiver/cssArchiver/xml_files/BT.xml</config> |
| 95 | <restart type='daily'>00:20</restart> |
| 96 | </engine> |
| 97 | <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/CO'> |
| 98 | <desc>CO</desc> |
| 99 | <port>51132</port> |
| 100 | <config>/mnt/edata1/archiver/cssArchiver/xml_files/CO.xml</config> |
| 101 | <restart type='daily'>00:30</restart> |
| 102 | </engine> |
| 103 | <daemon> |
| 104 | }}} |
| 105 | 2. '''!ArchiveDaemon 起動'''[[BR]] |
| 106 | i. 環境変数 設定[[BR]] |
| 107 | {{{ |
| 108 | $ export PATH="$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH" |
| 109 | $ export LD_LIBRARY_PATH="/usr/local/lib:$EPICS_BASE/lib/linux-x86_64" |
| 110 | }}} |
| 111 | ii. 起動[[BR]] |
| 112 | {{{ |
| 113 | $ cd /mnt/edata1/archiver/ChannelArchiver/daemon |
| 114 | $ /usr/bin/perl $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup/ArchiveDaemon.pl -f ArchiveDaemon.xml |
| 115 | Read ArchiveDaemon.xml. Check status via |
| 116 | http://localhost:4900 |
| 117 | You can also monitor the log file: |
| 118 | ArchiveDaemon.log |
| 119 | Disassociating from terminal. |
| 120 | }}} |
| 121 | デフォルトは4900番ポートでWeb管理画面が動作しており、http://localhost:4900 でアクセスできる。[[BR]] |
| 122 | |
| 123 | 3. '''master_index 作成'''[[BR]] |
| 124 | 最新の index は current_index で参照することが出来る。[[BR]] |
| 125 | しかし、このままでは日毎のデータしか参照できない状態であり、不便である。[[BR]] |
| 126 | そこで、index をひとまとめにした master_index を作成する。[[BR]] |
| 127 | i. indexconfig.xml を作成する[[BR]] |
| 128 | make_indexconfig.pl を実行して、indexconfigを作成する。[[BR]] |
| 129 | {{{ |
| 130 | $ make_indexconfig.pl -d indexconfig.dtd /path/to/index > indexconfig.xml |
| 131 | $ less indexconfig.xml |
| 132 | <?xml version="1.0" encoding="UTF-8" standalone="no"?> |
| 133 | <!DOCTYPE indexconfig SYSTEM "/proj/epics/R314/R31412/extensions/R314123-CSA_centos7/src/ChannelArchiver/IndexTool/indexconfig.dtd"> |
| 134 | <indexconfig> |
| 135 | <archive> |
| 136 | <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_18/index</index> |
| 137 | </archive> |
| 138 | <archive> |
| 139 | <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_19/index</index> |
| 140 | </archive> |
| 141 | </indexconfig> |
| 142 | }}} |
| 143 | なお、/path/to/*/index と指定すれば、/path/to 以下全ての index を探してくれる。[[BR]] |
| 144 | ii. master_index を作成する |
| 145 | {{{ |
| 146 | $ ArchiveIndexTool -v 1 indexconfig.xml master_index |
| 147 | }}} |
| 148 | |
| 149 | なお、今回のバージョンよりも前のものでは、!ArchiveDaemon が自動的に master_index を作成している。[[BR]] |
| 150 | 少し調べてみると、どうやら !ArchiveDaemon.pl の仕様が変更されている模様。[[BR]] |
| 151 | PF-ARのは 2.3.0 、こちらは 3.0.0 とメジャーバージョンが異なっている。[[BR]] |
| 152 | 2.3.0 では、master_index を作成していると思われるファンクションや変数があるが、3.0.0 には無くなっている。[[BR]] |
| 153 | 指定できるオプション(引数)も違っていた。 |
| 154 | |
| 155 | master_indexは定期的に更新するのが望ましいため、crontabで更新処理を行うようにした。[[BR]] |
| 156 | 各グループの master_index を作成するスクリプト(create_master_index.sh)を用意し、kbdaemonユーザで30分おきに実行するように設定した。[[BR]] |
| 157 | {{{ |
| 158 | */30 * * * * /mnt/edata1/archiver/ChannelArchiver/data/indices/create_master_index.sh |
| 159 | }}} |
| 160 | |
| 161 | == CSSで閲覧する == |
| 162 | |
| 163 | CSSなどのクライアントアプリケーションからデータを閲覧するために!ArchiveDataServerを立ち上げる。[[BR]] |
| 164 | 具体的には、HTTP Serverを立ち上げ、予め用意されているCGIを実行する。[[BR]] |
| 165 | |
| 166 | 1. '''サーバディレクトリ 作成'''(apache ユーザがアクセス出来るようにしておくこと) |
| 167 | {{{ |
| 168 | # mkdir /var/www/html/archive/cgi |
| 169 | }}} |
| 170 | ここにCGIプログラム、設定ファイルを配置する。 |
| 171 | {{{ |
| 172 | # cd /var/www/html/archive/cgi |
| 173 | # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/O.linux-x86_64/ArchiveDataServer . |
| 174 | # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.dtd . |
| 175 | # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.xml . |
| 176 | # mv ArchiveDataServer ArchiveDataServer.cgi |
| 177 | }}} |
| 178 | 各グループのデータが見られるように、serverconfig.xml を下記のように編集する。 |
| 179 | {{{ |
| 180 | <?xml version="1.0" encoding="UTF-8"?> |
| 181 | <!DOCTYPE serverconfig SYSTEM "serverconfig.dtd"> |
| 182 | <serverconfig> |
| 183 | <archive> |
| 184 | <key>1</key> |
| 185 | <name>BM</name> |
| 186 | <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BM/index</path> |
| 187 | </archive> |
| 188 | <archive> |
| 189 | <key>2</key> |
| 190 | <name>BT</name> |
| 191 | <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BT/index</path> |
| 192 | </archive> |
| 193 | <archive> |
| 194 | <key>3</key> |
| 195 | <name>CO</name> |
| 196 | <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/CO/index</path> |
| 197 | </archive> |
| 198 | </serverconfig> |
| 199 | }}} |
| 200 | |
| 201 | 2. '''/etc/httpd/conf/httpd.conf 編集'''[[BR]] |
| 202 | サーバディレクトリの設定(下記)を最終行に追加する。 |
| 203 | {{{ |
| 204 | # Check that environment variables are available, |
| 205 | # assert that this directive is not commented-out. |
| 206 | # Your web server might use a different module name |
| 207 | # or location, in my case it happened to be this : |
| 208 | LoadModule env_module libexec/httpd/mod_env.so |
| 209 | |
| 210 | # Check that CGI is enabled, i.e. assert that |
| 211 | # these are not commented-out: |
| 212 | LoadModule cgi_module libexec/httpd/mod_sgi.so |
| 213 | |
| 214 | # This tells Apache that ArchiveDataServer.cgi |
| 215 | # is a CGI program because of the .cgi extension: |
| 216 | AddHandler cgi-script .cgi |
| 217 | |
| 218 | <Directory "/var/www/html/archive"> |
| 219 | Order Allow,Deny |
| 220 | Allow from All |
| 221 | </Directory> |
| 222 | |
| 223 | # Allow cgi-scripts in the ..../cgi directory : |
| 224 | <Directory "/var/www/html/archive/cgi"> |
| 225 | SetEnv EPICS_TS_MIN_WEST -540 |
| 226 | SetEnv LD_LIBRARY_PATH /usr/local/lib:/proj/epics/R314/R31412/base-3.14.12.3-CSA_centos7/lib/linux-x86_64 |
| 227 | SetEnv SERVERCONFIG /var/www/html/archive/cgi/serverconfig.xml |
| 228 | |
| 229 | # This directive enables CGI for this dir.: |
| 230 | Options +ExecCGI |
| 231 | </Directory> |
| 232 | }}} |
| 233 | |
| 234 | 3. ''' httpdサービス 再起動''' |
| 235 | {{{ |
| 236 | # systemctl restart httpd.service |
| 237 | }}} |
| 238 | |
| 239 | 4. '''CSS !DataBrowser 閲覧'''[[BR]] |
| 240 | Archive SearchのURLで下記のように指定する。 |
| 241 | {{{ |
| 242 | xnds://localhost:80/archive/cgi/ArchiveDataServer.cgi |
| 243 | }}} |
| 244 | |
| 245 | {{{#!comment |
| 246 | == トラブルシューティング == |
| 247 | * '''!ArchiveEngine 起動エラー'''[[BR]] |
| 248 | どうやら write_period タグの値が読み込めていないようだが、なぜそうなっているのか原因は不明...[[BR]] |
| 249 | get_threshold や file_size など他タグでも、同様のエラーが発生している。 |
| 250 | {{{ |
| 251 | 12/25/2015 15:52:04 Starting Engine with configuration file engineconfig.xml, index data/index |
| 252 | 12/25/2015 15:52:04 Creating ChannelAccess Context. |
| 253 | 12/25/2015 15:52:04 Removing memory for channels and groups. |
| 254 | 12/25/2015 15:52:04 Stopping ChannelAccess. |
| 255 | 12/25/2015 15:52:04 Engine main routine: |
| 256 | ../EngineConfig.cpp (68): 'engineconfig.xml': Error in write_period |
| 257 | |
| 258 | 12/25/2015 15:52:04 Done. |
| 259 | }}} |
| 260 | Apache Xercesのバージョンが3.1.1でこの問題が発生してしまった。[[BR]] |
| 261 | バージョンを2.8.0に変更したら解決したため、バージョンによる問題と思われる。[[BR]] |
| 262 | 2.8.0のインストールは下記のように行った。[[BR]] |
| 263 | {{{ |
| 264 | $ cd $EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty |
| 265 | $ wget http://archive.apache.org/dist/xerces/c/xerces-c-src-current.tar.gz |
| 266 | $ tar xzvf xerces-c-src-current.tar.gz |
| 267 | $ ls |
| 268 | xerces-c-src_2_8_0 |
| 269 | $ cd xerces-c-src_2_8_0/src/xercesc |
| 270 | $ export XERCESCROOT=$EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty/xerces-c-src_2_8_0 |
| 271 | $ ./runConfigure -plinux -cgcc -xg++ -minmen -nsocket -tnative -rpthread |
| 272 | $ make |
| 273 | $ su root |
| 274 | # make install |
| 275 | }}} |
| 276 | |
| 277 | * '''!ArchiveDataServer 起動'''[[BR]] |
| 278 | [[Image(DataServerModel.png, 400)]][[BR]] |
| 279 | クライアントアプリケーションとして '''!ArchiveViewer''' が配布されているようなので、早速試してみる。[[BR]] |
| 280 | * [https://ics-web.sns.ornl.gov/archive/viewer/] |
| 281 | |
| 282 | !ArchiveViewer は !ArchiveDataServer に対して問い合わせを行う。手順はマニュアルを参考に行った。[[BR]] |
| 283 | |
| 284 | 1. httpd(v2.4.6-40) サービスを起動する。 |
| 285 | {{{ |
| 286 | # yum install httpd |
| 287 | # systemctl enable httpd |
| 288 | # systemctl start httpd |
| 289 | }}} |
| 290 | 2. !ArchiveDataServer 起動ディレクトリを作成する。[[BR]] |
| 291 | このディレクトリに配置するものは、''$EPICS_EXTENSIONS/src/ChannelArchiver/DemoData'' にサンプルが用意されているので、今回はそれらを流用する。[[BR]] |
| 292 | コピーしてくるものは、以下の2つ。 |
| 293 | * abyss.conf |
| 294 | * abyss/mime.types |
| 295 | |
| 296 | {{{ |
| 297 | $ mkdir $HOME/ChannelArchiver/DataServer |
| 298 | $ mkdir $HOME/ChannelArchiver/DataServer/abyss |
| 299 | $ cd $HOME/ChannelArchiver/DataServer |
| 300 | $ cp $EPICS_EXTENSIONS/src/ChannelArchiver/DemoData/abyss.conf . |
| 301 | $ cp $EPICS_EXTENSIONS/src/ChannelArchiver/DemoData/abyss/mime.types abyss/ |
| 302 | $ vim abyss.conf |
| 303 | ---- |
| 304 | # The Server Root (UNIX systems style) |
| 305 | ServerRoot $HOME/ChannelArchiver/DataServer |
| 306 | ---- |
| 307 | |
| 308 | $ $EPICS_EXTENSIONS/bin/linux-x86_64/ArchiveDataServerStandalone abyss.conf $HOME/ChannelArchiver/data/index |
| 309 | ArchiveDataServerStandalone Running |
| 310 | Unless your 'abyss.conf' selects a different port number, |
| 311 | the data should now be available via the XML-RPC URL |
| 312 | http://localhost:8080/RPC2 |
| 313 | }}} |
| 314 | |
| 315 | 3. !ArchiveViewer を起動する。[[BR]] |
| 316 | {{{ |
| 317 | $ java -jar archiveviewer.jar -u http://localhost:8080/RPC2 |
| 318 | }}} |
| 319 | |
| 320 | }}} |
| 321 | |
| 322 | == 参考リンク == |
| 323 | |
| 324 | * [http://www.aps.anl.gov/bcda/epicsgettingstarted/starttools/channelarchiver.htm EPICS Channel Archiver(ANL)] |
| 325 | * [https://ics-web.sns.ornl.gov/kasemir/archiver/ Kay氏のページ] |
| 326 | * [https://github.com/EPICSTools/ChannelArchiver github] |
| 327 | |