Amazon EC2上のRed Hat Enterprise LinuxにX11転送でElixir ReportをGUIインストールする手順

この記事はクラウド環境のLinuxインスタンスに、帳票ツールの[Elixir Report](http://www.grapecity.com/tools/info/java/elixir-report/)をGUIインストールする手順についてまとめたものです。

以前の記事、[Amazon EC2上にRed Hatインスタンスを作成してElixir Reportをコンソールインストールする手順](http://qiita.com/mdmom/items/6382fa66264c4c8168ac)では、デスクトップ環境のないLinuxインスタンスにコンソールインストールする手順を試してみました。

今回は、SSHのX11転送（X11フォワーディング）機能を使って、デスクトップ環境の入っていないAmazon EC2上のRed Hat Enterprise LinuxのインスタンスでElixir Reportのレポートサーバーのインストーラを実行し、GUIインストーラをWindows側に表示してインストールしてみたいと思います。

#環境
Windows 8.1
Elixir Report 8.7J
Amazon EC2 Red hat Enterprise Linux 7.3


#WindowsにTera Termをインストールする
この記事では、Linux OSへのSSH接続にTera Termを使用します。Tera TermのWindowsへのインストールは、[以前の記事](http://qiita.com/mdmom/items/6382fa66264c4c8168ac)の[［SSH接続用にWindowsにTera Termをインストールする］](http://qiita.com/mdmom/items/6382fa66264c4c8168ac#ssh%E6%8E%A5%E7%B6%9A%E7%94%A8%E3%81%ABwindows%E3%81%ABtera-term%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)を参考にしてください。


#WindowsにXサーバーをインストールする
Linux上のGUIアプリケーションをWindows側で操作するには、WindowsのリモートデスクトップやVNC経由でLinuxのデスクトップに接続することもできますが、この記事では、Linux上で動作しているアプリケーションのGUIをWindows側に表示する方法としてX11転送を利用します。

この方法ではWindows側にXサーバーがインストールされている必要があるので、今回はXmingというフリーのWindows用Xサーバーを使用します。こちらの記事を参考にしました。

【参考記事】[フリーのWindows用Xサーバー「Xming」のインストールと基本設定、使い方](https://mag.osdn.jp/09/10/14/0753240)

1. Xmingインストーラを[ダウンロードサイト](https://ja.osdn.net/projects/sfnet_xming/releases/)からダウンロードします。本記事の作成時（2016年11月）で最新のXming（*Xming-6-9-0-31-setup.exe*）と、Xming-fonts（*Xming-fonts-7-7-0-10-setup.exe*）をダウンロードします。![1ダウンロードファイル選択.png](https://qiita-image-store.s3.amazonaws.com/0/152421/7bdb71ba-23d1-6e67-16af-448cd17fe574.png)　　
<br>

2. Xmingのインストーラをダブルクリックで起動します。選択項目は基本的にデフォルト設定を受け入れてインストールします。［Next］で進みます。
    ![2install01.png](https://qiita-image-store.s3.amazonaws.com/0/152421/e42633bd-80d7-5b60-a4b6-3a28177060c0.png)  
<br> 

3. インストール先を指定して次に進みます。  
<br>

4. コンポーネントの選択画面では、デフォルト設定を受け入れて進みます。![3install03.png](https://qiita-image-store.s3.amazonaws.com/0/152421/1caf3bf5-c6c3-021d-c901-778de30b864f.png)  
<br>

5. アイコンやタスクの選択ステップも同様に、デフォルトのまま進みます。![4install05.png](https://qiita-image-store.s3.amazonaws.com/0/152421/9d274b52-47c9-de3b-261b-19a2cc6211fe.png)  
<br>

6. インストール前の確認項目をチェックして進み、インストールを完了します。![5install07.png](https://qiita-image-store.s3.amazonaws.com/0/152421/669e9f3b-6210-10af-7b06-84ca8432e222.png)  
<br>

7. インストールの完了画面で`［Launch Xming］`にチェックを入れて終了すると、Xmingが起動してタスクトレイにアイコンが表示されます。
![6icon.png](https://qiita-image-store.s3.amazonaws.com/0/152421/b9ad5931-e0d4-8b98-179f-d38ec5240146.png)

    ［注意］Xming起動時に、Windowsファイアウォールの警告が表示されることがあります。その場合は、アクセスを許可します。
<br>

8. 次にXming-fontsをインストールします。Xming-fontsのインストーラを起動し、コンポーネントの選択でデフォルトを受け入れます。
![7fontinstall01.png](https://qiita-image-store.s3.amazonaws.com/0/152421/79d3a9e4-62b2-7bcf-90ba-cd2574cac159.png)
<br>

9. インストールの内容を確認して進めると、インストールが完了します。![8fontinstall03.png](https://qiita-image-store.s3.amazonaws.com/0/152421/bd0a2e83-8478-884f-ab15-59368be4ffb8.png)

 


#Amazon EC2 Red Hatインスタンスの作成と準備
Amazon EC2上に、デフォルトの構成でRed Hatインスタンスを作成します。[以前の記事](http://qiita.com/mdmom/items/6382fa66264c4c8168ac)の[［Red Hatインスタンスの作成と準備］](http://qiita.com/mdmom/items/6382fa66264c4c8168ac#red-hat%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E6%BA%96%E5%82%99)セクションを参考にしてください。

インスタンスの作成と、Windows上のTera TermからRed Hatインスタンスへ接続するまでの手順が完了します。


#X11転送の設定をする
X11転送に関する、Red Hat側およびWindows側の設定と確認を行います。


##Linux側の設定
1. Red Hatインスタンスで、X11転送が有効化されているか確認します。`/etc/ssh/sshd_config`内で、`X11Forwarding`が**yes**になっていれば問題ありません。

    ```shell-session
    $ sudo cat /etc/ssh/sshd_config |grep X11
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #       X11Forwarding no
    ```

2.	手順1で、`X11Forwarding`が**no**になっている場合は、`/etc/ssh/sshd_config`をバックアップした上で設定を**yes**に変更し、sshdを次のコマンドに従って再起動します。

    ```shell-session
    $ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_org
    $ sudo vi /etc/ssh/sshd_config
    $ sudo service sshd restart
    Redirecting to /bin/systemctl restart  sshd.service
    ```

3. XアプリケーションをX11転送によりWindows上に表示できるか確認するため、今回は`xeyes`というXアプリケーションをRed Hatインスタンスにインストールしておきます。

    ```shell-session
    $ sudo yum –y install xeyes
    ```


##Windows側の設定とテスト
4. Windows側でXmingが起動していることを確認します。  
<br>
5. Tera Termの設定で、リモートのXアプリケーションをローカルに表示する設定を行います。Tera Termの［設定］-［SSH転送］をクリックします。
![9TeraTerm_SSH転送設定.png](https://qiita-image-store.s3.amazonaws.com/0/152421/9b28bc6c-5d9c-e23a-f15f-9dd3095eb156.png)
<br>

6. ［リモートの(X)アプリケーションをローカルのXサーバに表示する］にチェックを入れて、［OK］をクリックします。
![10TeraTerm_SSH転送設定01.png](https://qiita-image-store.s3.amazonaws.com/0/152421/758023ee-de41-b2cd-67cd-e910965cc486.png)
<br>

7. 一旦Tera Termからログアウトして、再度ログインし直します。
<br>
8. DISPLAY変数が設定されているかコマンドで確認します。

    ```shell-session
    $ echo $DISPLAY
    ```

9. 前の手順で何も返ってこなかった場合は、先ほどインストールしたxeyesを実行しても次のようなエラーになってしまいます。

    ```shell-session
    $ sudo xeyes
    Error: Can't open display:
    ```

    Red Hatインスタンス側にxauthと、x11のライブラリが不足しているようなので、必要なライブラリを次のコマンドでインストールしました。

    ```shell-session
    $ sudo yum –y install xorg-x11-xauth.x86_64 xorg-x11-server-utils.x86_64
    ```

10. 一旦Tera Termでログアウトします。

    ```shell-session
    $ exit
    ```

11. 再度Tera TermでRed Hatインスタンスにログインして、次のコマンドでDISPLAY変数を確認します。筆者の環境では自動で`localhost:10.0`が設定されていました。

    ```shell-session
    $ echo $DISPLAY
    localhost:10.0
    ```

12. xeyesを実行してみます。無事Windows側にxeyesアプリケーションが表示されました。

    ```shell-session
    $ xeyes
    ```
    ![11xeyes.png](https://qiita-image-store.s3.amazonaws.com/0/152421/6d4986fa-c9d3-699d-6493-d770a209e3b8.png)

    ［注意］次のようなX転送のエラーが出るときは、XmingがWindows側で起動していない可能性があります。起動していることを確認してください。
![12TTSSHエラー.png](https://qiita-image-store.s3.amazonaws.com/0/152421/52f1806f-8618-4b12-6460-4866954ac7cf.png)

#レポートサーバーのインストーラをRed Hatに転送する
Tera Termを利用して、Windows側にあるElixir ReportのレポートサーバーのLinux OS用インストーラ（*elixirreport87_linux64.bin*）と、ライセンスファイル（**.license*）をRed Hatインスタンスに転送します。

この手順については、[以前の記事](http://qiita.com/mdmom/items/6382fa66264c4c8168ac) の[［レポートサーバーのインストーラをRed Hatに転送する］](http://qiita.com/mdmom/items/6382fa66264c4c8168ac#%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%A9%E3%82%92red-hat%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B)を参照してください。

ファイルの転送が完了したら、次の準備を行っておきます。

1. インストールは現在ログインしているec2-userで行います。ec2-userのLANG環境変数が英語になっている場合は、日本語（ja_JP.UTF-8）に変更しておきます。

    ```shell-session
    $ echo $LANG
    en_US.UTF-8
    $ export LANG=ja_JP.UTF-8
    $ echo $LANG
    ja_JP.UTF-8
    ```

2. 転送したインストーラに実行権限を与えます。

    ```shell-session
    $ chmod +x ./elixirreport87_linux64.bin
    $ ls -la
    -rwxr-xr-x. 1 ec2-user ec2-user 279506476 Sep 29 00:00  elixirreport87_linux64.bin
    ```


#GUIインストーラの実行とエラーの発生
いよいよインストーラを実行してみます。しかし、エラーでインストーラが終了してしまいました。必要なライブラリがRed Hat側に不足しているようです。

```
$ ./elixirreport87_linux64.bin
Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
strings: '/lib/libc.so.6': No such file

Launching installer...

Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)

Stack Trace:
java.lang.NoClassDefFoundError: Could not initialize class java.awt.Toolkit
        at java.awt.Component.<clinit>(Component.java:593)
        at com.zerog.ia.installer.LifeCycleManager.g(DashoA8113)
        at com.zerog.ia.installer.LifeCycleManager.h(DashoA8113)
        at com.zerog.ia.installer.LifeCycleManager.a(DashoA8113)
        at com.zerog.ia.installer.Main.main(DashoA8113)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.zerog.lax.LAX.launch(DashoA8113)
        at com.zerog.lax.LAX.main(DashoA8113)
This Application has Unexpectedly Quit: Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)

```

#必要なライブラリをインストールして実行時エラーを解消する
1. 上記のエラーを最初から確認すると、まず`libc.so.6ファイルが見つからない`という内容のエラーが出力されているので、次のコマンドでlibc.so.6ライブラリをインストールします。

    ```shell-session
    $ sudo yum -y install libc.so.6
    ```

2. 次に発生している`InvocationTargetException`は、X11のライブラリが不足していることが原因のようです。必要なライブラリをインストールします。

    ```shell-session
    $ sudo yum –y install libXtst
   ```


#起動したGUIインストーラの日本語が□に…フォントをインストールする
1. 再度インストーラを実行してみます。

    ```shell-session
    $ ./elixirreport87_linux64.bin
    ```

2. インストーラのGUIが起動しましたが、日本語が□表示になっています。Linux側に日本語フォントがインストールされていないことが原因でしょう。左下のキャンセルボタンをクリックしてインストールを中止します。
    ![13GUIトーフになる.png](https://qiita-image-store.s3.amazonaws.com/0/152421/b3d64e17-75df-bfd2-02ab-a6ffbd3a6a07.png)   

    ![14終了02.png](https://qiita-image-store.s3.amazonaws.com/0/152421/543845e7-052b-6e16-d85a-be6276d1d80c.png)
<br>
3. 日本語フォントをインストールします。VLゴシック、IPA明朝、IPAゴシックをインストールしました。

    ```shell-session
    $ sudo yum -y install vlgothic-fonts ipa-mincho-fonts ipa-gothic-fonts 
    ```

#GUIインストールを実行する
1. 再度インストーラを起動します。今度は日本語も表示されるようになりました。
![15GUI_01.png](https://qiita-image-store.s3.amazonaws.com/0/152421/61fcb868-78a8-74ed-9d9f-2748a7f7b94a.png)
<br>

2. ［次へ］で進み、［使用許諾契約の条項に同意する］にチェックして、進みます。
![16GUI_02.png](https://qiita-image-store.s3.amazonaws.com/0/152421/d376a97c-8b1e-04c6-d95d-cb6782076da8.png)
<br>
3.	［ライセンスキーファイルの登録］をクリックして、登録するライセンスファイルを選択します。
![17GUI_03.png](https://qiita-image-store.s3.amazonaws.com/0/152421/5d83adef-b5d0-f136-9f2e-ae0f5823ef0b.png)
<br>
4. インストールするモジュールにチェックが入っていることを確認して、次に進みます。この画面では、先ほどの手順で追加したライセンスでインストールできるモジュールだけが表示されます。![18GUI_04.png](https://qiita-image-store.s3.amazonaws.com/0/152421/bbd0be1e-573b-87e0-0f1c-4384e7c86671.png)
<br>
5. レポートサーバーで使用するポート（今回はデフォルトの`7001`）、ログレベルを確認します。デフォルトのまま進みます。
![19GUI_ポート設定.png](https://qiita-image-store.s3.amazonaws.com/0/152421/92546157-4e6e-5b21-7b3e-efe9a72092e5.png)
<br> 
6. インストール先ディレクトリは、ec2-userにアクセス権のある場所を選択します。今回はユーザーディレクトリの下にします。
![20GUI_インストール先.png](https://qiita-image-store.s3.amazonaws.com/0/152421/02469dbf-76a9-95b2-fc53-aead3e39d7cd.png)

    ［注意］ec2-userに書き込み権限のない場所を指定すると、エラーが表示されます。
<br>
7. 確認画面で内容を確認したら、［インストール］をクリックします。
![21GUI_確認.png](https://qiita-image-store.s3.amazonaws.com/0/152421/a2f96b69-7bd8-15b7-8f1a-650a4860b1cf.png)
<br>
8. 次の画面が表示されれば完了です。
![22GUI完了.png](https://qiita-image-store.s3.amazonaws.com/0/152421/12bca1b5-8925-bc50-7283-820717f40410.png)

#ヘッドレスモードの設定とレポートサーバーの起動
インストールはX11転送でGUIを利用しましたが、今後、レポートサーバーの実行時にX Window Systemに接続できない場合は、Javaのヘッドレスモードを有効にする必要があります。

1. レポートサーバーのインストール先/binディレクトリに移動します。筆者の環境では/home/ec2-user/ElixirReport87J/bin/になります。

    ```shell-session
    $ cd /home/ec2-user/ElixirReport87J/bin
    ```

2. レポートサーバーの起動シェルスクリプトをバックアップした後、編集します。

    ```shell-session
    $ cp reportserver-start.sh reportserver-start.sh_org
    $ vi reportserver-start.sh
    ```

    ※5行目の`headless`設定を追加して、保存します。

    ```sh
    #!/bin/sh
    JAVACMD="../jre/bin/java"
    
    $JAVACMD -mx512M \
            -Djava.awt.headless=true \
            -Duser.home=../license \
    　（以下省略）
    ```

3. レポートサーバーの起動シェルスクリプトを実行します。

    ```shell-session
    $ ./reportserver-start.sh &
    ```
    ※”&”を付加してバックグラウンド実行にします。

    【注意】起動ユーザーのLANG環境変数が英語の場合、レポートサーバーが英語ロケールで起動され、Webインターフェースのメニューなどが英語表示になってしまいます。日本語ロケールへ変更して起動してください。
<br>
4. 起動に成功すると、コンソール上に次のようにCopyrightが表示されます。

    ```
    INFO  [main] com.elixirtech.ers2.Main - Copyright 2016 Elixir Technology Pte Ltd
    INFO  [Thread-19] com.elixirtech.ers2.EnsureServerStarted - Checking server     status
    ```

5. Windows上のブラウザからレポートサーバーのWebインターフェースにログインしてみます。

    ```
    http://<パブリックIP>:7001
    ``` 
    ![23WebインターフェースURL.png](https://qiita-image-store.s3.amazonaws.com/0/152421/59dae902-bc20-c4b8-08b2-6029fec4f6b0.png)


    【注意】ログイン画面が表示されないときは、以下のような原因が考えられます。
    ・レポートサーバーの起動に失敗している
    ・Red Hatインスタンスのセキュリティグループの設定で、ポート”7001”を追加していない
<br>
6. ログイン画面が表示されたら、デフォルトで用意されている次の管理者ユーザーでログインします。

    ```
    ユーザー名: admin
    パスワード: sa
    ```

7. ［リポジトリ］以下のサンプルテンプレートを実行してみます。
    `［samples］‐［demo］-［sales2］-［sales2.rml］`を選択して、出力形式に”PDF”を選んで［OK］をクリックします。
![24レポート生成PDF選択.png](https://qiita-image-store.s3.amazonaws.com/0/152421/afcbbbc5-5de4-835b-7c94-7ac00db19018.png)
<br> 
8. PDF形式のレポートが生成できました。
![25フォントインストール後の結果.png](https://qiita-image-store.s3.amazonaws.com/0/152421/94ca8523-80af-667a-dc77-fd559cec6eb7.png)


 
以上で完了です。





#参考情報

##Q1. No X11 DISPLAY variable was setエラーでインストールが終了する
X11などの設定を何も行っていない状態でGUIインストールを実行すると、X11のエラーでインストーラが終了してしまいます。この記事の[［X11転送の設定をする］](http://qiita.com/mdmom/items/41b42da2dec00d77faa1#x11%E8%BB%A2%E9%80%81%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B)の項目を確認してみてください。

```bash:［参考情報］エラー出力の例
$ ./elixirreport87_linux64.bin
Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...
strings: '/lib/libc.so.6': No such file

Launching installer...

Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)

Stack Trace:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
        at java.awt.Window.<init>(Window.java:536)
        at java.awt.Frame.<init>(Frame.java:420)
        at java.awt.Frame.<init>(Frame.java:385)
        at javax.swing.JFrame.<init>(JFrame.java:189)
        at com.zerog.ia.installer.LifeCycleManager.g(DashoA8113)
        at com.zerog.ia.installer.LifeCycleManager.h(DashoA8113)
        at com.zerog.ia.installer.LifeCycleManager.a(DashoA8113)
        at com.zerog.ia.installer.Main.main(DashoA8113)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at com.zerog.lax.LAX.launch(DashoA8113)
        at com.zerog.lax.LAX.main(DashoA8113)
This Application has Unexpectedly Quit: Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)
```

##Q2. フォントをインストールしても、日本語が□のままになる
`fc-list`コマンドがRed Hatインスタンスで実行できるか確認してください。コマンドが入っていない場合は、フォントの管理に使用される`fontconfig`パッケージを次のコマンドでインストールして、`fc-list`コマンドが使用できるようになるか確認した上で、再度インストールを試してみてください。

```shell-session
$ sudo yum –y install fontconfig
```

※この記事では、X11転送の確認用に`xeyes`アプリケーションをインストールしています。このインストール中、依存関係により`fontconfig`が一緒にインストールされるため、日本語の表示には問題ありませんでした。`xeyes`をインストールしなかった場合は、別途`fontconfig`をインストールする必要があります。

##Q3. Xアプリケーションを起動したが、Windows側にX転送エラーが表示される
次のようなX転送のエラーが出るときは、XmingがWindows側で起動していることを確認してください。
![12TTSSHエラー.png](https://qiita-image-store.s3.amazonaws.com/0/152421/3abc8927-5033-8f9d-07e1-76b2d488117b.png)

##Q4. レポートサーバー起動時にWindows側にX転送エラーが表示され、レポートサーバーが起動できない
Q3と同様のエラーが表示され、レポートサーバーの起動中に次のような`java.awt.AWTError`が出力される場合は、ヘッドレスモードの設定が正しく行われていない可能性があります。この記事の[［ヘッドレスモードの設定とレポートサーバーの起動］](http://qiita.com/mdmom/items/41b42da2dec00d77faa1#%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%B5%B7%E5%8B%95)の項目を参考に、起動シェルスクリプトの編集を行ってみてください。

```
Exception in thread "main" java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of the DISPLAY variable.
        at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
        at sun.awt.X11GraphicsEnvironment.access$200(X11GraphicsEnvironment.java:65)
（以下省略）