Version 8 (modified by hirose, 8 years ago) (diff) |
---|
概要
Channel ArchiverはSpallation Neutron Source(SNS)でC++を用いて開発された、EPICSのデータを記録するためのツールセットである。
その中心となるArchive Engine はChannel Access(CA)を介して複数のCA Server(IOC)からデータを収集する。
収集したデータは定期的に独自のバイナリ形式でローカルディスクファイル(データファイル)に書き出され、インデックスファイルによって関連付けられる(インデックスはR木で実装されている)。
これらの履歴データはXML-RPCを実装したData Serverを起動することで、ネットワーク上の他計算機からも読出すことができる。
ビルド方法
今回は以下の環境でビルドを行った。
OS | CentOS 6.7 64bit | CentOS 7 64bit |
---|---|---|
GCC | 4.4.7 | 4.8.5 |
EPICS Base | 3.14.12.4 | 3.14.12.3 / 3.14.12.5 |
- EPICS Base及びExtensions セットアップ
まずは EPICS Base 及び Extensions をセットアップする。
これについては、EPICSをゼロからインストールに手順が記載されているため、ここでは説明を割愛する。 - ソース ダウンロード
githubからクローンし、masterブランチでチェックアウトする。これよりも前?のバージョンはタグで管理されているようだ。$ cd $EPICS_EXTENSIONS/src $ git clone https://github.com/EPICSTools/ChannelArchiver $ cd ChannelArchiver $ git checkout --track origin/master
- 必要なライブラリの整備
ChannelArchiver/ThirdPartyディレクトリに、ビルド時に利用されるライブラリパッケージが用意されている。
今回インストールしたライブラリは下記の通り。
なお、xerces-c-devel及びperl-Frontier-RPCはソースからインストールし、その他はyumでインストールした。
Library Version xerces-c-devel 2.8.0 xmlrpc-c-devel 1.32.5-1905 perl-libwww-perl 6.05-2 expat 2.1.0-8 perl-XML-Simple 2.20-5 perl-Frontier-RPC 0.07b4
xerces-c-develはyumだと 3.1.1 がインストールされるが、Archive Engine起動時にXMLの読込が失敗する。
これはバージョンが原因と思われるため、以下のように別途2.8.0をダウンロードしてインストールを行った。(用意されているxerces-c-develは2.4.0である)
$ cd $EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty $ wget http://archive.apache.org/dist/xerces/c/xerces-c-src-current.tar.gz $ tar xzvf xerces-c-src-current.tar.gz $ ls xerces-c-src_2_8_0 $ cd xerces-c-src_2_8_0/src/xercesc $ export XERCESCROOT=$EXTENSIONS_TOP/src/ChannelArchiver/ThirdParty/xerces-c-src_2_8_0 $ ./runConfigure -plinux -cgcc -xg++ -minmem -nsocket -tnative -rpthread $ make $ su root # make install
- ビルド
GCCコンパイラのバージョンの影響かは分からないが、ビルド時にエラーが発生してしまう。
そこで、予め ChannelArchiver/Tools/AVLTreeTest.cpp の修正を行っておく(この修正による影響はないとみている)。
そのままビルドすると、sort_compare や toString の関数定義がないといわれる。
これはAVLTree.h がインクルードされた後に、上記の関数定義がされていたためである。
これを、関数定義がされた後にインクルードするように修正しておく。
修正後、makeする。
$ cd $EPICS_EXTENSIONS/src/ChannelArchiver $ make $ ls $EPICS_EXTENSIONS/bin/linux-x86_64 ArchiveDataClient.pl ArchiveExport make_compress_script.pl ArchiveDataServerStandalone ArchiveIndexTool make_indexconfig.pl ArchiveDataTool ArchiveManager ArchiveEngine ConvertEngineConfig.pl
Archive Engine 起動
- Configuration (XML) 作成
ChannelArchiver/Engine ディレクトリ下に DTDファイル と サンプルのXMLファイルが置かれているので、これを参考に作成する。$ ls $EPICS_EXTENSIONS/src/ChannelArchiver/Engine | grep engineconfig* engineconfig.dtd engineconfig.xml
- 起動
インデックスファイルとデータファイルを格納する任意のディレクトリを用意し、各オプションを指定して起動する。$ mkdir $HOME/ChannelArchiver/data $ $EPICS_EXTENSIONS/bin/linux-x86_64/ArchiveEngine -port 4812 -description "Example IOC" -log engine.log engineconfig.xml $HOME/ChannelArchiver/data/index
Archive Engine管理ツール(ArchiveDaemon) セットアップ
インデックスファイルは破損してしまうことがしばしばあり、サイズが大きいと復旧にかなりの時間を要する。
この影響を低減させる目的で、!ArchiveDaemonをセットアップする。
!ArchiveDaemonは複数のArchive Engineを一括管理でき、自動再起動なども設定できる。
- ArchiveDaemon 定義ファイル(XML)作成
定義ファイルのサンプルは $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup ディレクトリに置かれている。
例えば、日毎にインデックスファイルを作成する(Archive Engineを再起動する)場合は、以下のように記述する。<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE daemon SYSTEM "ArchiveDaemon.dtd"> <daemon> <port>4900</port> <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BM'> <desc>BM</desc> <port>51130</port> <config>/mnt/edata1/archiver/cssArchiver/xml_files/BM.xml</config> <restart type='daily'>00:10</restart> </engine> <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/BT'> <desc>BT</desc> <port>51131</port> <config>/mnt/edata1/archiver/cssArchiver/xml_files/BT.xml</config> <restart type='daily'>00:20</restart> </engine> <engine directory='/mnt/edata1/archiver/ChannelArchiver/data/CO'> <desc>CO</desc> <port>51132</port> <config>/mnt/edata1/archiver/cssArchiver/xml_files/CO.xml</config> <restart type='daily'>00:30</restart> </engine> <daemon>
- ArchiveDaemon 起動
- 環境変数 設定
$ export PATH="$EPICS_EXTENSIONS/bin/linux-x86_64:$PATH" $ export LD_LIBRARY_PATH="/usr/local/lib:$EPICS_BASE/lib/linux-x86_64"
- 起動
$ cd /mnt/edata1/archiver/ChannelArchiver/daemon $ /usr/bin/perl $EPICS_EXTENSIONS/src/ChannelArchiver/ExampleSetup/ArchiveDaemon.pl -f ArchiveDaemon.xml Read ArchiveDaemon.xml. Check status via http://localhost:4900 You can also monitor the log file: ArchiveDaemon.log Disassociating from terminal.
デフォルトは4900番ポートでWeb管理画面が動作しており、http://localhost:4900 でアクセスできる。
- 環境変数 設定
- master_index 作成
最新の index は current_index で参照することが出来る。
しかし、このままでは日毎のデータしか参照できない状態であり、不便である。
そこで、index をひとまとめにした master_index を作成する。
- indexconfig.xml を作成する
make_indexconfig.pl を実行して、indexconfigを作成する。
$ make_indexconfig.pl -d indexconfig.dtd /path/to/index > indexconfig.xml $ less indexconfig.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE indexconfig SYSTEM "/proj/epics/R314/R31412/extensions/R314123-CSA_centos7/src/ChannelArchiver/IndexTool/indexconfig.dtd"> <indexconfig> <archive> <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_18/index</index> </archive> <archive> <index>/mnt/edata1/archiver/ChannelArchiver/data/BM/2016/01_19/index</index> </archive> </indexconfig>
なお、/path/to/*/index と指定すれば、/path/to 以下全ての index を探してくれる。
- master_index を作成する
$ ArchiveIndexTool -v 1 indexconfig.xml master_index
- indexconfig.xml を作成する
なお、今回のバージョンよりも前のものでは、ArchiveDaemon が自動的に master_index を作成している。
少し調べてみると、どうやら ArchiveDaemon.pl の仕様が変更されている模様。
PF-ARのは 2.3.0 、こちらは 3.0.0 とメジャーバージョンが異なっている。
2.3.0 では、master_index を作成していると思われるファンクションや変数があるが、3.0.0 には無くなっている。
指定できるオプション(引数)も違っていた。
master_indexは定期的に更新するのが望ましいため、crontabで更新処理を行うようにした。
各グループの master_index を作成するスクリプト(create_master_index.sh)を用意し、kbdaemonユーザで30分おきに実行するように設定した。
*/30 * * * * /mnt/edata1/archiver/ChannelArchiver/data/indices/create_master_index.sh
CSSで閲覧する
CSSなどのクライアントアプリケーションからデータを閲覧するために!ArchiveDataServerを立ち上げる。
具体的には、HTTP Serverを立ち上げ、予め用意されているCGIを実行する。
- サーバディレクトリ 作成(apache ユーザがアクセス出来るようにしておくこと)
# mkdir /var/www/html/archive/cgi
ここにCGIプログラム、設定ファイルを配置する。# cd /var/www/html/archive/cgi # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/O.linux-x86_64/ArchiveDataServer . # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.dtd . # cp $EPICS_EXTENSIONS/src/ChannelArchiver/XMLRPCServer/serverconfig.xml . # mv ArchiveDataServer ArchiveDataServer.cgi
各グループのデータが見られるように、serverconfig.xml を下記のように編集する。<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE serverconfig SYSTEM "serverconfig.dtd"> <serverconfig> <archive> <key>1</key> <name>BM</name> <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BM/index</path> </archive> <archive> <key>2</key> <name>BT</name> <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/BT/index</path> </archive> <archive> <key>3</key> <name>CO</name> <path>/mnt/edata1/archiver/ChannelArchiver/data/2016/CO/index</path> </archive> </serverconfig>
- /etc/httpd/conf/httpd.conf 編集
サーバディレクトリの設定(下記)を最終行に追加する。# Check that environment variables are available, # assert that this directive is not commented-out. # Your web server might use a different module name # or location, in my case it happened to be this : LoadModule env_module libexec/httpd/mod_env.so # Check that CGI is enabled, i.e. assert that # these are not commented-out: LoadModule cgi_module libexec/httpd/mod_sgi.so # This tells Apache that ArchiveDataServer.cgi # is a CGI program because of the .cgi extension: AddHandler cgi-script .cgi <Directory "/var/www/html/archive"> Order Allow,Deny Allow from All </Directory> # Allow cgi-scripts in the ..../cgi directory : <Directory "/var/www/html/archive/cgi"> SetEnv EPICS_TS_MIN_WEST -540 SetEnv LD_LIBRARY_PATH /usr/local/lib:/proj/epics/R314/R31412/base-3.14.12.3-CSA_centos7/lib/linux-x86_64 SetEnv SERVERCONFIG /var/www/html/archive/cgi/serverconfig.xml # This directive enables CGI for this dir.: Options +ExecCGI </Directory>
- httpdサービス 再起動
# systemctl restart httpd.service
- CSS DataBrowser 閲覧
Archive SearchのURLで下記のように指定する。xnds://localhost:80/archive/cgi/ArchiveDataServer.cgi