2016年7月28日木曜日

XLX Reflector を Raspberry Pi2 で構築しテストしてみる

Back


 XLX Reflector とは正しくは
XLX Multiprotocol Gateway Reflector と言い、その名のとおりD-STARに於ける3つの接続手順であるDPlus(REF)、DCSDExtra (XRF)の全てをサポートします。つまりどの手順を使用しても接続できると言うことです。

=MEMO= 現在ではD-STARのみならず、DMR に関しても接続出来、XLXシステムとしては AMBE++規格のDVSI Vocoderを2チャンネル以上使用することにより、同じモジュールに接続したD-STARとDMR間でプロトコルの違いを気にせず通信が出来る仕組みになっています。

 図のようにダッシュボード(WEB)も標準で備わって居り、画像を変更したりする事に依りカスタマイズも可能です。勿論、HTMLやPHPをご存じであれば大きく変化させる事も可能です。
 特徴としては A B C 3つのモジュールを主に使用(H までは接続可能)し、A はインターナショナルとして世界中とピアトゥピア(Peer to Pear:後述)に依ってリフレクター同士が結ばれます。日本では先駆者によって B はローカルグループ、C は日本語による日本国内のピアトゥピアに使用されています。

Special thanks to LX1IQ Mr. Luc Engelmann and Digital Voice Communications Working Group of The Radioamateurs du Luxembourg

=MEMO=
XLXリフレクター・ソフトウェアの使用に関しては dvc@rlx.lu にご一報ください。


環境を整える

● Raspberry Pi2 の準備

今回、私の場合は限界を知る為に Raspberry Pi2 にしましたが、実際の運用においては Pi3 又は通常の PC を使用した方が良いと思います。(繋がるユーザ数次第ですが・・特にWEB参照数が影響大)
  • microSDにOSイメージを焼き、Rasbian が立ち上がるようにします。

  • 詳しくはRaspbian(Jessie)のインストール for HAMをご参照ください。
    今回のケースでは、ダウンロードしたOSイメージに含まれる機能のみで構いません。上記参照ページでの「追加の機能をインストールします」以下の説明は無視してください。

  • パソコンを利用される方

  • 詳しくは眠っていたパソコンが Linux (Debian8)で蘇るをご参照ください。

  • 作業用のパソコンから SSH 接続できるようにします。

  • 一度、キーボードやディスプレイを接続してターミナルで sudo ifconfig して IPアドレスを確認するか、Fing(スマホ用)や Angry IP Scanner 等のアプリをご使用ください。 なお、その際にはID : pi   Password : raspberry が必要になります。
    SSH接続には Putty 等のツールが便利ですが、Windowsならコマンドプロンプト、Linuxならターミナルから ssh 192.168.x.y -l pi -p 22 とすれば接続できます。 (192.168.x.yの部分は確認したIPアドレスです。)

  • microSD の領域拡張と update, upgrade は上記URLをご参照の上、忘れずに行ってください。

=MEMO= XLX開発者のオリジナルサイトでは安定版OSの Wheezy(Debian 7)のみサポートしています。 この記事のケースでは最新版の Jessie(Debian 8)での稼働を検証する目的で構成しています。どうしてもうまく行かない場合は、OS を Wheezy にインストールし直してサポートを受けてください。
2017.07.11現在、最新の Stretch(Debian 9)にも対応しているとのアナウンスが Luc から有りました。
2017.07.17現在、最新の Stretch(Raspbian 9 : Jessie dist-upgrade)に対応している事を確認しました。

● systemd による固定IPアドレスの取得

    ここでの設定方法は飽くまでテキストモード( X Window を使用しない)での使用を想定しています。パワーに余裕が有る場合や、 一般のパソコンやサーバを利用する場合はGUI標準の wicd を使用した方が便利です。

  1. ユニットファイル(Unit File)の作成

  2. ファイル名には一定のルールが有ります。wiredとした部分は eth0, wlan0, wireless など判別しやすい物を使用しますが、ドット以降は networkとする必要が有ります。 (WiFi を利用したい方は、テキストモードでWi-Fi接続を安定させる(Jessie)をご覧ください。

    $ sudo nano /etc/systemd/network/wired.network
    
      GNU nano 2.2.6         File: /etc/systemd/network/wired.network
    [Match]
    Name=eth0
    
    [Network]
    #DHCP=yes
    
    DHCP=no
    Address=10.0.0.10/24
    Gateway=10.0.0.1
    

    [Ctrl]+[o]➡[Enter]➡[Ctrl]+[x]で保存・終了します。

  3. 既存のネットワークシステムを無効にします。

  4. 先ず、dhcpcd.serviceを無効にします。このサービスは全てのインターフェースにdhcpを機能させようとして不安定要素の一つになる様なのでユニットファイルをリネームしてしまいます。

    $ cd /lib/systemd/system
    $ sudo mv dhcpcd.service dhcpcd.service.org
    $ cd        # homeに戻る
    

    コマンドでも分かるようにユニットファイルの保存されている場所は /lib/systemd/system/etc/systemd/system の2ヶ所ですが、ユーザ作成用としては後者です。 そして、ユーザ作成用の /etc 内の方が優先されます。

    次に、自動起動スクリプト(/etc/init.d/dhcpcd)も無効にします。

    $ sudo update-rc.d dhcpcd remove
    

    私の場合、これで再起動してみたところ相変わらず dhcpcd が起動していました。($ ps -eで確認)そこで、スクリプト自体を移動させてみました。

    $ sudo mv /etc/init.d/dhcpcd /home/pi
    

    これで立ち上がらなくする事が出来ました。

    最後にもう一つ、systemd のサービスである networking.service を無効にします。

    $ sudo systemctl stop networking.service
    $ sudo systemctl disable networking.service
    

  5. 作成した wired.network ファイルを使ってネットワークを立ち上げます。

  6. 現在は、networking から systemd のネットワークサービスへの過渡期で、標準では起動(有効)に設定されていません。

    $ sudo systemctl is-enabled systemd-networkd.service
    disable
    $ sudo systemctl enable systemd-networkd.service
    

  7. これで再起動すれば、必要とするネットワークサービスだけが立ち上がります。

  8. $ sudo reboot
    

● ルータのフィルタリング・フォワーディングの設定とダイナミックDNS

  1. 下記各ポートのインバウンドを通すようフィルタリング設定を変更します

  2. ポートプロトコル概  要
    80TCPhttp ダッシュボード用WEBの参照 httpsの場合 443
    10001UDPXLX本体とのJSONインターフェース
    10002UDPXLXインターリンク(Peer to Peer)
    22又は10022TCPセキュリティ上、リモートによる支援が必要な場合のみとする
    20001UDPDPlus プロトコル用
    30001UDPDExtra プロトコル用
    30051UDPDCS プロトコル用

  3. 各ポートから XLX Reflector の IPアドレス宛のフォワーディングを設定します

  4. 上記フィルタリング設定やフォワーディング設定についてはお持ちのルータのマニュアルに従ってください。

  5. 固定グローバルアドレスを取得するか、ダイナミックDNSを設定します

  6. 詳しくは、ご契約のプロバイダーのWEBなどをご覧ください。 有償サービスはIPアドレスが変化した場合でもプロバイダー側で追随してくれます。 また、無償サービスでも自動書き換えに対応した機能を提供しているところもあります。 詳しくは、Linux(Raspbian)でダイナミックDNSを使うをご参照ください。

XLX Reflector のインストール

● xlxd を GitHub よりクローン(ダウンロード)します。

https://github.com/LX3JL/xlxdCloan or download ▼ から[Download ZIP]するか、次のように GIT Clone してください。
  1. 追加機能のインストール

  2. $ sudo apt-get install git git-core
    $ sudo apt-get install php          # php パッケージ(apache2が含まれます。2018年現在 PHP7)
    

  3. xlxd をダウンロードします

  4. $ git clone https://github.com/LX3JL/xlxd.git
    

  5. xlxd をコンパイルしてインストール

  6. $ cd xlxd/src/
    $ sudo make
    $ sudo make clean
    $ sudo make install
    $ cd
    

    インストール先は /xlxd です。

  7. 自動起動スクリプトを /etc/init.d/ へコピーして編集します

  8. $ sudo cp xlxd/scripts/xlxd /etc/init.d/
    $ sudo nano /etc/init.d/xlxd
    
      GNU nano 2.2.6          File: /etc/init.d/xlxd
        :
        :
    # change below settings according to your system
    NAME="xlxd"
    DAEMON="/xlxd/xlxd"
    ARGUMENTS="XLX047 10.0.0.10 127.0.0.1"
    PIDFILE="/var/log/xlxd.pid"
    USER=root
    GROUP=root
        :
        :
    

    「XLX047」の部分は、欲しい番号が使われていないのを確認の上、記入します。先取方式ですが正式登録(後述の自動認証)されねばなりません。 また、その後のIPアドレスは前者が上記ネットワークの設定で固定したアドレス、後者がAMBE Serverのアドレスで使用しない時でも127.0.0.1にします。 [Ctrl]+[o]➡[Enter]➡[Ctrl]+[x]で保存・終了します。


    =MEMO= $ sudo /etc/init.d/xlxd start とするとその時は立ち上がるのですが、$ sudo update-rc.d xlxd defaults としても自動起動しません。


  9. 自動起動用スクリプトを自動起動させる為の工夫

  10. ネットワーク設定の時同様にユニットファイルを作成します。

    $ sudo nano /etc/systemd/system/xlxd.service
    
      GNU nano 2.2.6          File: /etc/systemd/system/xlxd.service
    [Unit]
    Description=XLX Reflector Daemon by LC1IQ
    After=systemd-networkd.service
    # ネットワーク設定の違いにより自動起動しない時試してください。
    # After=network.target
    # After=networking.service
    
    [Service]
    Type=forking
    ExecStart=/etc/init.d/xlxd start
    ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
    

    [Ctrl]+[o]➡[Enter]➡[Ctrl]+[x]で保存・終了します。

    既存のファイルを変更しただけなので本当に正しい記述かは、今少し勉強が必要です。 今回は起動スクリプトを自動スタートするユニットファイルという事で逃げていますが、本来ならばユニットファイルだけで /xlxd/xlxd を起動できるのではと思っています。

    次に、ユニットファイルを起動用コマンドとして有効にします。

    $ sudo systemctl enable xlxd.service
    

    これで、再起動すれば自動起動してくれるはずですが、まだ重要な環境設定が終わっていませんので、後で再起動する事になります。

  11. ダッシュボード用テンポラリーファイルをWEB用ディレクトリーへコピーします。

  12. $ sudo cp -r ~/xlxd/dashboard/* /var/www/html/
    $ sudo rm /var/www/html/index.html
    

    WEB公開用ディレクトリーには、apache2のインストールによって index.html が存在していますので、ここでコピーしたファイルの index.php と混同しないように最初に削除しておきます。(indexと言う名のファイルが2つ有るのもトラブルの元)

  13. ハッシュ用フォルダ(/tmp)を、専用フォルダ(/callhome)に変更します。

  14. 理由は、tmpにハッシュ用ファイル(callinghome.php)が有ると、PCを再起動する度に内容が失われ、XLX管理サーバとの接続が失われる為です。

    $ sudo mkdir /callhome
    $ sudo chmod 777 /callhome
    $ sudo chmod +r /var/log/messages
    

    callinghomes.php は接続が有効になると自動作成されます。

    =MEMO= リフレクタリスト(後述)に於いて接続完了のグリーンアイコンが赤のダウンに変わったり、リフレクタの表示自体が消えた時などは、この callinghomes.php を一度削除すると正常に戻る事が有るとの情報を頂きました。(from JR1OFP 鈴木さん)

  15. 最も重要な設定ファイルを編集します。

  16. $ sudo nano /var/www/html/pgs/config.inc.php
    
      GNU nano 2.2.6          File: /var/www/html/pgs/config.inc.php
    <?php
    /*
    Possible values for IPModus
    
    HideIP
    ShowFullIP
    ShowLast1ByteOfIP
    ShowLast2ByteOfIP
    ShowLast3ByteOfIP
    
    */
    
    $Service     = array();
    $CallingHome = array();
    $PageOptions = array();
    
    $PageOptions['ContactEmail']                         = 'xlx047@todo.vc';     // 管理者用メールアドレス
    
    $PageOptions['DashboardVersion']                     = '2.3.9';              // Dashboard Version
    
    $PageOptions['PageRefreshActive']                    = true;                 // WEBのリフレッシュをする(true)/しない(false)
    $PageOptions['PageRefreshDelay']                     = '10000';              // 10秒に1回
    
    
    $PageOptions['RepeatersPage'] = array();
    $PageOptions['RepeatersPage']['LimitTo']             = 99;                   // 接続可能なリピータ数の上限
    $PageOptions['RepeatersPage']['IPModus']             = 'ShowLast1ByteOfIP';  // IPアドレスを右1桁のみ表示(標準:すべて表示)
    $PageOptions['RepeatersPage']['MasqueradeCharacter'] = '*';                  // 隠す部分の代替え文字指定
    
    
    $PageOptions['PeerPage'] = array();
    $PageOptions['PeerPage']['LimitTo']                  = 99;                   // 接続可能なピア数の上限
    $PageOptions['PeerPage']['IPModus']                  = 'ShowLast1ByteOfIP';  // IPアドレスを右1桁のみ表示(標準:すべて表示)
    $PageOptions['PeerPage']['MasqueradeCharacter']      = '*';                  // 隠す部分の代替え文字指定
    
    $PageOptions['LastHeardPage']['LimitTo']             = 39;                   // ラストハードの表示行数を指定(規定値40行)
    
    $PageOptions['ModuleNames'] = array();                                       // Module nomination 変更しています
    $PageOptions['ModuleNames']['A']                     = 'Int\'l Peers';
    $PageOptions['ModuleNames']['B']                     = 'JA Room';
    $PageOptions['ModuleNames']['C']                     = 'JA Peers';
    $PageOptions['ModuleNames']['D']                     = '';
    
    
    $PageOptions['MetaDescription']                      = 'XLX is a D-Star Reflector System for Ham Radio Operators.';  
    $PageOptions['MetaKeywords']                         = 'Ham Radio, D-Star, XReflector, XLX, XRF, DCS, REF, ';
    $PageOptions['MetaAuthor']                           = 'LX1IQ';
    $PageOptions['MetaRevisit']                          = 'After 30 Days';     // この5項目は SEO 対策なので変更しない。
    $PageOptions['MetaRobots']                           = 'index,follow';
    
    $PageOptions['UserPage']['ShowFilter']               = true;                // ユーザページのフィルタ記入枠を表示又は消去(false)します
    $PageOptions['Traffic']['Show']                      = true;                // ネットワークトラフィックのメニューを表示又は消去(false)
    
    $Service['PIDFile']                                  = '/var/log/xlxd.pid';
    $Service['XMLFile']                                  = '/var/log/xlxd.xml';
    
    $CallingHome['Active']                               = true;                                    // ここをtrueにしないと接続不可
    $CallingHome['MyDashBoardURL']                       = 'http://xlx047.ddns.net';                // dashboard url
    $CallingHome['ServerURL']                            = 'http://xlxapi.rlx.lu/api.php';          // 変更厳禁
    $CallingHome['PushDelay']                            = 600;                                     // push delay in seconds
    $CallingHome['Country']                              = "JAPAN";                                 // 国名又はエリア名
    $CallingHome['Comment']                              = "Hosted by 'Day After Day D*Star Network'. Now Testing on Jessie 4.4.13-v7+ RPi2.";   // コメント最大100文字
    $CallingHome['HashFile']                             = "/callhome/callinghome.php";             // /tmp/から/callhome/に変更
    $CallingHome['OverrideIPAddress']                    = "";                                      // 設定不要
    $CallingHome['InterlinkFile']                        = "/xlxd/xlxd.interlink";                  // インターリンク設定ファイルの場所
    
    $VNStat['Interfaces']                                = array();
    $VNStat['Interfaces'][0]['Name']                     = 'eth0';              // ネットワークトラフィックを測定するインターフェース名(Wi-Fi: wlan0など)
    $VNStat['Interfaces'][0]['Address']                  = 'eth0';
    $VNStat['Binary']                                    = '/usr/bin/vnstat';
    
    /*
    include an extra config file for people who dont like to mess with shipped config.ing.php
    this makes updating dashboard from git a little bit easier
    */
    
    if (file_exists("../config.inc.php")) {
     include ("../config.inc.php");
    }
    
    ?>
    

    赤い文字の部分が今回、変更・追加した部分です。
    [Ctrl]+[o]➡[Enter]➡[Ctrl]+[x]で保存・終了します。



再起動後のチェックポイントと調整・改良

● 再起動後にチェックすべき事

  1. さて前項までで全ての準備が整いました。再起動します。

  2. 全てが、うまく行っているとXLX Reflector Serverが立ち上がると、他のマシンのブラウザで http://10.0.0.10 を見てみると基本形のWEBが立ち上がります。 (右図は基本形ではありません)

    そして、WEBメニューの[Reflectorlist]をクリックすると、全世界のXLXのリンクリストが表示されます。その中のXLX047がグリーンのUPマークになっていれば成功です。

  3. WEBが表示しないなどの問題点が有る場合、まずxlxdが起動しているかを確認します。

  4. $ ps -e | grep xlxd
    29227 ?        08:56:50 xlxd
    

    プロセス番号と共に上のように表示されれば起動しています。もし起動していない時は

    $ sudo /etc/init.d/xlxd start
    

    としてみて、もし立ち上がれば /etc/systemd/system/xlxd.service に問題があるかも知れません。

  5. apache2に問題は無いか?のチェックをします。

  6. $ ps -e | grep apache2
     1356 ?        00:00:02 apache2
     1359 ?        00:10:01 apache2
     1362 ?        00:10:15 apache2
     1456 ?        00:10:07 apache2
     1457 ?        00:09:48 apache2
     4624 ?        00:01:08 apache2
     4674 ?        00:01:22 apache2
     4675 ?        00:01:18 apache2
     4676 ?        00:01:07 apache2
     4700 ?        00:01:00 apache2
     5008 ?        00:00:12 apache2
    

    apache2 が立ち上がっている事が分かります。それでも表示しない場合は、WEB公開用のディレクトリー指定が違っているかも知れません。 今回のシナリオどおりにインストールを行うと、公開ディレクトリーの指定を変更する必要は無いはずですが、チェックしてみます。 実際に index.php の存在している公開フォルダは /var/www/html です。

    $ sudo nano /etc/apache2/sites-available/000-default.conf
    
      GNU nano 2.2.6     File: /etc/apache2/sites-available/000-default.conf
    
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com
    
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
    
             :
             :
    

    [Ctrl]+[o]➡[Enter]➡[Ctrl]+[x]で保存・終了します。

  7. WEBが表示したら確認すべき事(リフレクターリスト)

  8. 再起動直後の成功例ならば良いのですが、リフレクターリストに構築した XLX Reflector が表示されない場合は、/etc/init.d/xlxd の個別設定部分と /var/www/html/pgs/config.inc.php を見直す必要が有るかも知れません。また、前述の=MEMO=の様に callinghomes.php を一度削除してみると良いかも知れません。

● ちょっとした改良?

  1. どうにも気になる日付表示

  2. 気にしなければ良いのですが、yyyy.mm.dd 表示に慣れている私としては dd.mm.yyyy はとても見難く間違いやすいので表示形式を変更しました。

    $ sudo nano /var/www/html/pgs/users.php
    

    44行目・・・
      GNU nano 2.2.6           File: /var/www/html/pgs/users.php
    <td width="150">'.@date("Y.m.d H:i", $Reflector->Stations[$i]->GetLastHeardTime()).'</td>
    

    d.m.Y となっているのを Y.m.d に変更するだけです。大文字/小文字は意味がありますので注意してください。 これを、repeaters.phppeers.php にも施します。


その他テスト運用で得られた結果はリフレクタWEB(XLX047)にも記載しておりますのでご参照ください。

  • CPU負荷率(Rate of CPU Use) [CPU]をクリック

  • CPU温度(CPU Temperature) [Temp.]をクリック

  • Back



    73
    J E 3 H C Z / REF047 C / XLX047 B


    4 件のコメント:

    1. お世話になります。
      JN4TBI 
      資料を参考にしながら、Pi4でXLX430を立ち上げました。
      ネットで検索したがわからず、一つご教授して頂けたい件がありましてよろしくお願いします。
      他のリフレクターにインターリンクPeersの方法がわからず頓挫しています。できるだけ自分で操作して作り上げたいと思っています。
      よろしくお願いします。

      返信削除
      返信
      1. JN4TBI局、おはようございます。

        早速ですがお尋ねの件について、先ずインターリンクして欲しい相手に、貴局のリフレクタ名とリンクして欲しいモジュール名を指定して依頼メールを出してください。
        依頼する相手によってモジュールが異なっていても構いません。

        受託のメールが来るか、直接インターリンクの信号が返って来ます。
        (インターリンクには UDP: 10002のポートフォワードが必要です)
        確認には次の様にします。
        $ tail -f /var/log/messages | egrep -v 'DPlus'
        試しに、貴局自身が接続したりカーチャンクするとその様子が表示されます。

        相手の了解が確認出来たら、自局側の設定をします。
        $ sudo nano /xlxd/xlxd.interlink
        XLX???[tab]xlx???.dynamicdns.net[tab]BC ----> FQDN(名前)
        XLX???[tab]111.222.333.444[tab][tab]BC ----> グローバルIPアドレス

        このファイルを保存すると、ちょっとタイミングを置いて、先ほどのログに接続requestのパケットと接続の結果が表示されます。(双方の信号が有れば・・)

        相手に連絡せずに、この設定を先にしてしまうと、相手リフレクタへ10秒毎にパケットが飛び、攻撃しているように見えますのでお気を付けください。

        以上、お楽しみください。

        削除
    2. OMさん早急の対応ありがとうございます。
      早速試させていただきます。

      分からいことがありましたら。
      お手数ですが質問させていただきます。
      よろしくお願いします。

      JN4TBI

      返信削除
      返信
      1. JN4TBI様

        恐れ入りますが、ご質問はTOPページ(メニュー)最下部のリンクより、フォーラムにお願いいたします。

        削除