NVIDIA vGPU License Server on Photon OS 4.0

最近,GPU 入れ替え案件があり,せっかくなので License Server を Linux 版で作り直す事にしました.
はい,タイトル通り Photon に入れます.今回は自分の備忘録ですw.

vmware.github.io

Photon OS は Minimal Install して tdnf update しておきます.
vGPU License Server の Document はこちらを参考にしています.Requirement 通りの VM を作成し,MAC address "Manual" にしておきます.


Java の Install

利用可能な Version を確認します.

root@vmug [ ~ ]#  tdnf list available | grep jdk
openjdk10.x86_64                            1.10.0.23-7.ph4     photon-release
openjdk10-doc.x86_64                        1.10.0.23-7.ph4     photon-release
openjdk10-src.x86_64                        1.10.0.23-7.ph4     photon-release
openjdk11.x86_64                            11.0.9-1.ph4        photon-release
openjdk11-doc.x86_64                        11.0.9-1.ph4        photon-release
openjdk11-src.x86_64                        11.0.9-1.ph4        photon-release
openjdk8.x86_64                             1.8.0.265-2.ph4     photon-release
openjdk8-doc.x86_64                         1.8.0.265-2.ph4     photon-release
openjdk8-sample.x86_64                      1.8.0.265-2.ph4     photon-release
openjdk8-src.x86_64                         1.8.0.265-2.ph4     photon-release

新しいモノ好きなので,迷わず 11 を Install します.

root@vmug [ ~ ]# tdnf install openjdk11

Installing:
slang                                                x86_64                     2.3.2-1.ph4                         photon-release                 3.12M 3273998
newt                                                 x86_64                     0.52.21-1.ph4                       photon-release                179.54k 183846
chkconfig                                            x86_64                     1.9-2.ph4                           photon-updates                737.55k 755248
openjdk11                                            x86_64                     11.0.9-1.ph4                        photon-release             300.78M 315393368

Total installed size: 304.80M 319606460
Is this ok [y/N]: y

Downloading:
slang                                   826995   100%
newt                                    101755   100%
chkconfig                               187201   100%
openjdk11                            168242283   100%
Testing transaction
Running transaction
Installing/Updating: slang-2.3.2-1.ph4.x86_64
Installing/Updating: newt-0.52.21-1.ph4.x86_64
Installing/Updating: chkconfig-1.9-2.ph4.x86_64
Installing/Updating: openjdk11-11.0.9-1.ph4.x86_64

Complete!

Java 用の環境変数を /etc/profile で設定します.

# Set JAVA environmentavariables
export JAVA_HOME=/usr/lib/jvm/OpenJDK-1.11.0
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

Java の動作確認,問題なさそうです.

root@vmug [ / ]# source /etc/profile
 10:37:26 up 2 min,  0 users,  load average: 0.00, 0.00, 0.00
tdnf update info not available yet!

root@vmug [ / ]# which java
/usr/lib/jvm/OpenJDK-1.11.0/bin/java

root@vmug [ / ]# java -version
openjdk version "11.0.9-internal" 2020-10-20
OpenJDK Runtime Environment (build 11.0.9-internal+0-adhoc..openjdk-11.0.9)
OpenJDK 64-Bit Server VM (build 11.0.9-internal+0-adhoc..openjdk-11.0.9, mixed mode)


Tomcat の Install

Group と User 作成しておきます.

root@vmug [ / ]# groupadd tomcat
root@vmug [ / ]# useradd -d /usr/share/tomcat -g tomcat -M -s /bin/false tomcat

Apache Tomcat サイトから Binary をダウンロードします.

tomcat.apache.org

こちらも,迷わず Latest の Tomcat 10 を!と試したのですが,License Server がまだ jakarta.servlet.Filter 対応してないので,泣く泣く 9.0.55 を入れ直しました.

Tomcat 用ディレクトリ作成.

root@vmug [ / ]# mkdir -p /usr/share/tomcat

Binary 展開.

root@vmug [ /usr/local/src ]# tar xvf apache-tomcat-9.0.55.tar.gz -C /usr/share/tomcat --strip-components 1
root@vmug [ /usr/local/src ]# chgrp -R tomcat /usr/share/tomcat/

ディレクトリのアクセス権・オーナー変更

root@vmug [ /usr/local/src ]# cd /usr/share/tomcat/
root@vmug [ /usr/share/tomcat ]# chmod -R g+r conf
root@vmug [ /usr/share/tomcat ]# chmod g+x conf
root@vmug [ /usr/share/tomcat ]# chown -R tomcat webapps/ work/ temp/ logs/


Tomcat の自動起動設定

自動起動 script を用意します.
/etc/systemd/system/tomcat.service を以下の内容で作成して chmod 644 しておきます.

[Unit]
Description=Apache Tomcat Server
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/OpenJDK-1.11.0
Environment=CATALINA_PID=/usr/share/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/share/tomcat
Environment=CATALINA_BASE=/usr/share/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/usr/share/tomcat/bin/startup.sh
ExecStop=/usr/share/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=15
Restart=always

[Install]
WantedBy=multi-user.target

Service Unit File を load して systemctl で enable にします.

root@vmug [ / ]# systemctl daemon-reload
root@vmug [ / ]# sudo systemctl enable tomcat.service
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /etc/systemd/system/tomcat.service.

Tomcat を起動して確認します.問題なさそうです.

root@vmug [ / ]# sudo systemctl start tomcat.service
root@vmug [ / ]# systemctl status tomcat.service 
● tomcat.service - Apache Tomcat Server
     Loaded: loaded (/etc/systemd/system/tomcat.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-12-02 19:03:36 JST; 20s ago
    Process: 2256 ExecStart=/usr/share/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
   Main PID: 2263 (java)
      Tasks: 20 (limit: 4713)
     Memory: 132.7M
     CGroup: /system.slice/tomcat.service
             └─2263 /usr/lib/jvm/OpenJDK-1.11.0/bin/java -Djava.util.logging.config.file=/usr/share/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.>

Dec 02 19:03:36 vcslic systemd[1]: Starting Apache Tomcat Server...
Dec 02 19:03:36 vcslic startup.sh[2256]: Tomcat started.
Dec 02 19:03:36 vcslic systemd[1]: Started Apache Tomcat Server.

http://fqdn:8080/ に接続してお馴染みのページが表示されたら OK ! f:id:tcpninja:20211207180934p:plain:w530


License Server Install

準備が整ったので,License Server を Install します.
License Portal から Binary を入手して適当なディレクトリで解凍します.
Photon を Minimal で入れたせいで, unzip コマンドも無いので,必要に応じて足りないものは tdnf install しましょう.

root@vmug [ /usr/local/src ]# unzip NVIDIA-ls-linux-2021.07-2021.07.0.30193485.zip

ディレクトリ名が長いので NVIDIA-ls-linux に変更し,setup.bin に実行権限付けて Install 開始,console で必要項目に答えながら進めるだけ.

root@vmug [ /usr/local/src/NVIDIA-ls-linux ]# chmod +x setup.bin 
root@vmug [ /usr/local/src/NVIDIA-ls-linux ]# ./setup.bin -i console

(省略)

Install Complete
----------------

License Server has been successfully installed to:

   /opt/flexnetls/nvidia

PRESS <ENTER> TO EXIT THE INSTALLER: 

http://fqdn:8080/licserver にアクセスして無事 License Server の稼働を確認できました. f:id:tcpninja:20211207190022p:plain:w530


ここまでくれば,あとはドキュメントの通り管理者ユーザー設定したり,HTTPS 化するだけですね.


今回の教訓

いつもの事ですが,Ver X.X.X or later とあるとすぐに Latest で試そうとする悪い癖が治っていませんw.
/licserver アクセスでエラーになり,catalina.out の中探りました.

02-Dec-2021 19:36:46.777 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate container log file
02-Dec-2021 19:36:46.777 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal Context [/fne] startup failed due to previous errors
02-Dec-2021 19:36:48.088 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal One or more Filters failed to start. Full details will be found in the appropriate container log file
02-Dec-2021 19:36:48.088 SEVERE [main] org.apache.catalina.core.StandardContext.startInternal Context [/licserver] startup failed due to previous errors

localhost.日付.log で cast NG 発見.

03-Dec-2021 08:46:43.861 SEVERE [main] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [struts2]
    java.lang.ClassCastException: class org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter cannot be cast to class jakarta.servlet.Filter (org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter is in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @50825a02; jakarta.servlet.Filter is in unnamed module of loader java.net.URLClassLoader @6d7b4f4c)

切り分けどーしようと悩んでいたら,VMUG の友・ポメさんが Java 11 で Lisence Server 動くよと教えてくれたので,Tomcat 10 -> 9 に入れ直すだけで長短時間解決できました!ポメさん,今度一杯奢りますね!


追記 2021/12/08

ついでに,HTTPS 化についても加えておきます.
まず,HTTPS for Connections Between the Management Interface and the License Server ですが,これはドキュメントにもある通り,同一ホスト内のプロセス間なので,今回はスキップしますw.

License Server の Web U/I 経由でログインするので,HTTPS for Connections from a Web Browser to the License Server Management Interface は必須ですね.

keytool で キーストアファイルを作成します.CN, OU 等証明書に必要な事項に答えながら進めましょう.

root@vmug [ /usr/share/tomcat/conf ]# keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks

キーストアに tomcat のアクセス権を加えます.

root@vmug [ /usr/share/tomcat/conf ]# chown root:tomcat ./keystore.jks

/usr/share/tomcat/conf/server.xml で JSSE スタイルの SSL Connector 部分を有効にして,certificateKeystoreFile に先程作成したキーストアファイル名を,certificateKeystorePassword にキーストアのパスワードを設定.

(省略)
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/keystore.jks"
                         certificateKeystorePassword="キーストアのパスワード" 
                         type="RSA" />
        </SSLHostConfig>
(省略)

あとは tomcat restart して https://FQDN:8443/licserver にアクセスできれば完了です!