IDL 8.9から、ライセンスの仕組みが再び大きく変わった。詳細は公式サイトを参照。IDL 8.5→8.6のときとは異なり、今回はクライアントでパッチを当てることで、新しいライセンスサーバー(フローティングライセンス)で古いバージョンのIDL (8.6~8.8)を使うことも可能。
新しいライセンスシステムではライセンスの借用・予約機能は利用できない。
IDL 9.0 とともにリリースされたLicense Server 4.2 は CentOS 7.x や Ubuntu 18.04 をサポートしない。IDL 9.0 はライセンスサーバーが License Server 4.1 でもとりあえず動く。
クライアントでライセンスサーバーのライセンスを使うには、License Administrator (Linuxでのコマンドは envi_idl_license_admin または harrislicense) を用いて設定するか、ライセンスサーバーのURL (例 http://192.0.2.1:4080)を記述したテキストファイルを lic_server.dat という名前で作成し、適切な場所に置く。Linux でのデフォルトの場所は /usr/local/nv5/license または /usr/local/harris/license。
システムの lic_server.dat を編集する権限がなかったり、一時的にライセンスサーバーを変更したい場合には、lic_server.dat を適当なディレクトリに置いて、IDL_LICENSE_PATH 環境変数でそのディレクトリ (ファイル名は不要)を指定してからIDLを起動する。
ライセンスサーバーの情報はウェブブラウザから http://<server_name>:4080/dashboard/ で見ることができる。APIを用いてライセンス情報を得ることも可能。以下そのAPIの例。データ形式はJSON。<server_name> はライセンスサーバーのホスト名またはIPアドレス、<host_name>はクライアントのホスト名、<user_name>はユーザー名。
# ライセンスサーバーのバージョン、ライセンス番号等http://<server_name>:4080/api/1.0/server# 各Featureの最大ライセンス数と使用中のライセンス数http://<server_name>:4080/api/1.0/features# ライセンスを使用しているクライアントのホスト名http://<server_name>:4080/api/1.0/hostnames# ライセンスを使用しているユーザー名http://<server_name>:4080/api/1.0/users# 使用中のライセンス詳細http://<server_name>:4080/api/1.0/checkouts# 使用中のライセンス詳細 (特定のクライアントのみ)http://<server_name>:4080/api/1.0/hostnames/<host_name>/checkouts# 使用中のライセンス詳細 (特定のユーザーのみ)http://<server_name>:4080/api/1.0/users/<user_name>/checkouts# イベントhttp://<server_name>:4080/api/1.0/events# ログファイル名http://<server_name>:4080/api/1.0/logs# ログhttp://<server_name>:4080/api/1.0/logs/<log_name>ライセンスサーバーのログファイルは、デフォルトでは /usr/local/harris/license_server/logs/ 以下に保存されている。
IDL 8.6から、ライセンスの仕組みが大きく変わった。IDL 8.5以前はFLEXlmを使っていたのに対して、IDL 8.6以降ではFlexera Softwareのコンカレントライセンス(Concurrent License)になっている。両者のライセンスに互換性はなく、IDL 8.6以降にバージョンアップすると、旧バージョンは利用不可となる。(コンカレントライセンスのメリットと利用上の注意点)
コンカレントライセンスでは、フローティングライセンスとノードロックライセンスを自由に切り替えて使うことができる。複数ライセンスを契約している場合には、一部を特定の端末にノードロックライセンスとして割り当て、残りをフローティングライセンスとして使うことも可能。
16桁の認証コードさえわかればライセンスを勝手に使われてしまうので、認証コードは他人に知られないようにする。
ここでは、GUIを使えない環境や、管理の自動化のため、コマンドラインツールを用いてライセンスを管理する方法を説明する。GUIを使える環境であれば、harrislicense (License Administrator) を用いて管理を行うほうが簡単。
インターネットにアクセス可能なクライアントマシン上で実行する。あらかじめ他のマシンでライセンスを無効化するなどしてライセンスの空きをつくっておく。
cd $IDL_DIR/license_utils/bin.linux.x86_64./activate -a ${activateID} -q 1$IDL_DIR はIDLのインストールディレクトリ、${activateID} は16桁の認証コード(AAAA-BBBB-CCCC-DDDD)。-q 2 などとして複数のライセンスを認証することも可能。
ライセンスサーバーをアンインストールする場合や、OSを再インストールする場合、全てのライセンスを別のマシンに移す場合には、あらかじめライセンスを無効化しておく。
cd $IDL_DIR/license_utils/bin.linux.x86_64./activate -a ${activateID} -q 0フローティングライセンスの管理には flexnetlsadmin.sh を用いる。デフォルトでは /usr/local/harris/flexnetls_xxxx.xx.x/enterprise (xxxx.xx.x はバージョン番号) 以下にインストールされる。
Linux のライセンスサーバー(インターネットにアクセス可能)でフローティングライセンスとして認証(Activation)するには次のようにする。
cd /usr/local/harris/flexnetls_xxxx.xx.x/enterprise./flexnetlsadmin.sh -server http://localhost:7070/api/1.0/instances/~ -activate -id ${activateID} -count $count${activateID} は16桁の認証コード(AAAA-BBBB-CCCC-DDDD)、$count は認証を行うライセンス数。ライセンスサーバー以外のマシンから操作する場合には localhost をライセンスサーバーのホスト名に変更する。Windows の場合にはスクリプト名は flexnetlsadmin.bat になる。macはライセンスサーバーになることはできない。
ライセンス数を増減させる時も同様に、新しい$countを指定して認証を行う。
ライセンスサーバーをアンインストールする場合や、OSを再インストールする場合、ライセンスを別のマシンに移す場合には、あらかじめライセンスを無効化しておく。
cd /usr/local/harris/flexnetls_xxxx.xx.x/enterprise./flexnetlsadmin.sh -server http://localhost:7070/api/1.0/instances/~ -activate -id ${activateID} -count 0以前のバージョンの flexnetlsadmin.sh ではサーバーを指定する際 http://localhost:7070 としても動作したが、2022年春にリリースされたバージョン 2020.07 では以下のようなエラーが生じる。
# ./flexnetlsadmin.sh -server http://localhost:7070/ -statusBase URL http://localhost:7070/ is invalid.Please provide a valid Server Base URL orset the environment variable FLEXNETLS_BASEURL correctly e.g FLEXNETLS_BASEURL=http://localhost:7070/api/1.0/instances/~.この場合、-server http://localhost:7070/api/1.0/instances/~ のように指定する必要がある。毎回サーバーを指定するのが煩雑な場合は、エラーメッセージ中にも例示されているように、FLEXNETLS_BASEURL 環境変数を設定しておく。
$IDL_DIR/../license/o_licenseserverurl.txt という名前のテキストファイルを作成し、中身は http://${LICENSE_SERVER}:7070/fne/bin/capability の1行のみを書き込む。${LICENSE_SERVER} はライセンスサーバーのホスト名またはIPアドレス。$IDL_DIR はIDLのインストールディレクトリ。
Linux/Windows/mac ともに、IDLを利用するユーザーが、$IDL_DIR/../license/flexera/ および $IDL_DIR/../license/flexera-sv/ に対して読み書きできる必要がある。ここにはノードロック・フローティングどちらのライセンスを用いる場合でも、マシン固有のライセンス情報が書き込まれる(Trusted Storage)。IDLのインストールディレクトリをNFS等を用いて複数のマシン間で共有する場合には、適当な場所に書き込み可能なディレクトリを作成し、flexera および flexera-sv からそこに向けてシンボリックリンクを張る。
cd $IDL_DIR/../license/mv flexera flexera.bakmv flexera-sv flexera-sv.bakmkdir /var/lib/flexera{,-sv}chmod 777 !$ln -s !$ .今まで正常に利用できていたにもかかわらず、突然次のようなメッセージを出してIDLが新規に起動しなくなることがある。
Failed to acquire license.% A license is not available to run this product. Use the license administration utility to determine which licenses are available or activate an entitlement.他のマシンではIDLが正常に動作するにもかかわらず、特定のマシンのみでこの問題が発生する場合、クライアント側でライセンス情報を管理しているファイルが破損している可能性がある。同一マシン上で動いている他のIDLのプロセスを全て終了させた上で、$IDL_DIR/../license/flexera/ および $IDL_DIR/../license/flexera-sv/ 内のファイルを削除する(ディレクトリは削除しない)。
ライセンスサーバーからライセンスの借用(Borrow)を行うことで、出張先などライセンスサーバーと通信できない状態でも一定期間IDLを利用することができる。
cd $IDL_DIR/license_utils/bin.linux.x86_64./activate -a ${activateID} -s ${LICENSE_SERVER}:7070 -t ${seconds}$IDL_DIR はIDLのインストールディレクトリ、${activateID} は認証コード、${LICENSE_SERVER} はライセンスサーバーのホスト名またはIPアドレス、${seconds} は借りる秒数で省略時のデフォルトは1日(86400秒) (harrislicenseでは7日)、最大60日間(5184000秒)。有効期限が到来すると、ライセンスは自動的にライセンスサーバーに返却される。-q 2 などとして複数のライセンスを借用することも可能。
利用期限が到来する前に不要になったライセンスをライセンスサーバーに返却する場合には以下のようにする。
cd $IDL_DIR/license_utils/bin.linux.x86_64./activate -r -s ${LICENSE_SERVER}:7070ライセンスの予約(Reserve)を行うことで、ライセンスサーバー上の一部のライセンスを特定のクライアントのみに使わせることができる。
How to reserve license seats from a license server and for a given client machine を参照。
あらかじめDevice ID (20桁の英数字)を調べておけば、ライセンスの予約・予約取り消し時にはクライアントでの操作を要しない。
実質的にノードロックライセンスと同じことができる。
| 方法 | 期間 | クライアントとライセンスサーバーの通信 | クライアントのインターネット接続 | クライアントでの操作 ( activate または harrislicense) | ライセンスサーバーでの操作 ( flexnetlsadmin) |
|---|---|---|---|---|---|
| ノードロック | 無期限 | 不要 | ライセンス割り当て・削除時に必要 | 必要 | 不要 |
| 借用 (Borrow) | 最大60日 | 貸し出し・返却時に必要 | 不要 | 必要 (利用期限到来後は自動で返却される) | 不要 |
| 予約 (Reserve) | 無期限 | IDL使用中は常に必要 | 不要 | Device IDがわかれば不要 | 必要 |
Linuxではサーバーログはデフォルトでは/var/opt/flexnetls/idl_lmgrd/logs/に保存される。
サーバーやライセンスの状態を確認するには次のようにする。
cd /usr/local/harris/flexnetls_xxxx.xx.x/enterprise# サーバーのバージョンや状態./flexnetlsadmin.sh -server http://localhost:7070/api/1.0/instances/~ -status# 各Featureの情報./flexnetlsadmin.sh -server http://localhost:7070/api/1.0/instances/~ -features# Featureごとの利用可能ライセンス数と現在の利用数、ライセンスを利用しているデバイスの情報など./flexnetlsadmin.sh -server http://localhost:7070/api/1.0/instances/~ -licenses -verbosesv- から始まるFeatureはServerd license(フローティングライセンス)、nl- から始まるFeatureはノードロックライセンスを示す。末尾の -pe は Process Engine、-te は Task Engine、_rt は Runtime を示す。
REST APIを用いて、flexnetlsadmin.sh がインストールされていないマシンから情報を確認する。ライセンスサーバー名を ${LICENSE_SERVER} とする。結果はJSON形式で返ってくる。一部のAPIが返す結果には認証コードが含まれるので、ファイアウォールでアクセス制限をかけておくほうが無難。
# ライセンスサーバーの host id (macアドレス)curl http://${LICENSE_SERVER}:7070/api/1.0/hostids# サーバー情報curl http://${LICENSE_SERVER}:7070/api/1.0/instances# サーバーのバージョンcurl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/version# サーバーの設定curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/configuration# サーバーの設定項目の説明curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/configuration/metadata# Featureの情報 (ライセンス数や使用数を含む)curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/features# 指定した Feature (id: ${FEATURE_ID}) を利用中のクライアント情報curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/features/${FEATURE_ID}/clients# 現在ライセンスを利用中のクライアントの情報curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/clients# 指定したクライアント (id: ${CLIENT_ID}) が利用しているライセンスcurl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/clients/${CLIENT_ID}/featuresクライアントID (id: ${CLIENT_ID}) の数字は、クライアントがライセンスサーバーと通信する度に増加していく。
APIはデフォルトでは20件までしか結果を返さないので、多数のライセンスが登録されているサーバーでは次のようにする。
# Featureの情報 (一度に100件を取得)curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/features?size=100# Featureの情報 (1~20件目を取得)curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/features?page=0&size=20# Featureの情報 (21~40件目を取得)curl http://${LICENSE_SERVER}:7070/api/1.0/instances/~/features?page=1&size=20flexnetlsadmin.sh は裏で REST API を叩いて、その結果を見やすく加工して表示している。花山天文台のIDLライセンス使用状況 も同様。
IDL 8.8.1 を IDL 8.5以前と同じマシンで同じインストール先($IDL_DIR の1つ上のディレクトリが同一)にインストールすると、ライセンスが正常に設定されているにも関わらず、次のようなエラーメッセージが出て、IDL 8.8.1 が起動しない場合がある。
Unable to obtain an IDL license.IDL 8.8.1 (linux x86_64 m64).(c) 2021, Harris Geospatial Solutions, Inc.% Failed to acquire license.% A license is not available to run this product. Use the license administration utility to determine which licenses are available or activate an entitlement.IDL 8.5以前のためのライセンスファイル $IDL_DIR/../license/license.dat が存在すると、IDL 8.8.1 は正常に起動しない。license.licなど他の名前にリネームするとよい。
マルチユーザーシステムでIDL開始時に次のようなメッセージが表示され、IDLが起動しない場合がある。詳細はHow to resolve error “CLLFloatingLicenseInitialie failed to start the license thread”を参照。
# ファイル破損の場合$ idl(null): [1,7E4,7,0[73000045,1,400703EA]]Failed file read. : Failed file read. (code : 1929379909) (cll_internal.cpp : 495) (code : 1929379909) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.(null): [1,7E4,7,0[73000045,1,400703EA]]Failed file read. : Failed file read. (code : 1929379909) (cll_internal.cpp : 495) (code : 1929379909) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.Unable to obtain an IDL license.IDL 8.8.1 (linux x86_64 m64).(c) 2021, Harris Geospatial Solutions, Inc.% Failed to acquire license.% A license is not available to run this product. Use the license administration utility to determine which licenses are available or activate an entitlement.# ディレクトリ・ファイルのパーミッションの問題$ idl(null): [1,7E4,7,0[73000041,D,400703F3]]Failed file open. : Failed file open. (code : 1929379905) (cll_internal.cpp : 495) (code : 1929379905) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.(null): [1,7E4,7,0[73000041,D,400703F3]]Failed file open. : Failed file open. (code : 1929379905) (cll_internal.cpp : 495) (code : 1929379905) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.Unable to obtain an IDL license.IDL 8.8.1 (linux x86_64 m64).(c) 2021, Harris Geospatial Solutions, Inc.% Failed to acquire license.% A license is not available to run this product. Use the license administration utility to determine which licenses are available or activate an entitlement.# /tmp/fne.* に書き込み失敗する場合$ idl(null): [1,7e4,7,0[74100008,1,1202014b]] Internal. : Internal. (code : 1947205640) (cll_internal.cpp : 495) (code : 1947205640) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.(null): [1,7e4,7,0[74100008,1,1202014b]] Internal. : Internal. (code : 1947205640) (cll_internal.cpp : 495) (code : 1947205640) (CLLFloatingLicenseThread.cpp : 468)CLLFloatingLicenseInitialize failed to start the license thread.Unable to obtain an IDL license.IDL 8.8.1 (linux x86_64 m64).(c) 2021, Harris Geospatial Solutions, Inc.% Failed to acquire license.% A license is not available to run this product. Use the license administration utility to determine which licenses are available or activate an entitlement.フローティングライセンスのクライアントの場合、$IDL_DIR/../license/flexera/、$IDL_DIR/../license/flexera-sv/、/tmp/Harris/License/ の各ディレクトリ中のファイルが破損している場合があるので削除してみると改善する場合がある。特にflexera-sv内のファイルはIDL起動の都度書き込みが行われるため、マルチユーザーシステムでは破損しやすいように感じる。また、これらのディレクトリやその中のファイルのパーミッションが正しいかどうかも確認する。
また、最近のLinux環境では、カーネルパラメータ protected_regular の値を0にしないと、特定のユーザー(/tmp/fne.*の所有者)以外はIDLを起動できなくなる。
sudo sysctl -w fs.protected_regular=0>
再起動後も設定を保持するには/etc/sysctl.confにfs.protected_regular=0を加える。
メモ: protected_regular=1のときopenat(AT_FDCWD, "/tmp/fne.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", O_WRONLY|O_CREAT, 0777) = -1で失敗している模様。なお、上記のサポートページによると、そもそもIDLはマルチユーザー環境を公式にはサポートしていないらしい。
以下の内容は Floating License 利用を前提とする。IDLではライセンスの管理をFLEXlmで行っている。ライセンスの管理に用いる lmutil コマンドはIDLのインストールディレクトリの bin 以下にある。通常はパスが通っていない。IDLを標準のディレクトリ構成でインストールした場合、lmutil コマンドは例えば次のような場所にある(最初の3つがLinux、後の2つがWindowsでの例):
/usr/local/exelis/idl82/bin/lmutil/usr/local/itt/idl/idl81/bin/lmutil/usr/local/itt/idl71/bin/lmutil"c:\Program Files\Exelis\IDL82\bin\bin.x86\lmutil.exe""c:\Program Files\Exelis\IDL82\bin\bin.x86_64\lmutil.exe"以下の説明ではフルパスは省略する。
ライセンスの使用状況を確認するには、lmutil コマンドの lmstat サブコマンドを使う。Unix 環境では、lmutil コマンドと同じディレクトリにある lmstat コマンドも使える。
lmutil lmstat -a -c <port>@<myserver>lmutil lmstat -a -c <licensefile><port>@<myserver> にはライセンスサーバーの “ポート番号@ホスト名” 又は <licensefile> には“ライセンスファイルのパス”を指定する。ポート番号のデフォルトは 1700 である。
また、Unix 環境では idl 以外のソフトで FLEXlm が使われていなければ次のように -c オプションを省略できる場合がある。
lmstat -aライセンスの使用状況は、製品別に次のような形式で表示される。
user host display (version) (server/port handle), start_date, number_of_licensesdisplayは、UnixでXを利用している場合、通常は “ホスト名/DISPLAY環境変数の値(スクリーン番号を除く)” となる。DISPLAY 環境変数が設定されていない場合は、“ホスト名/:0” となる。Windowsではターミナルサービス(リモートデスクトップ)を使っていない場合はホスト名と同一となり、ターミナルサービスを使っている場合は接続元のホスト名となる。
handle は、チェックアウトされているライセンスを区別するための一意な値である。number_of_licenses はチェックアウトされているライセンス数で、idl本体は6個単位、idlのオプション(idl_mpegなど)は1個単位となる。
参考: 飛騨天文台のIDLライセンス使用状況 (表示を短くするため display からホスト名の部分を取り除いて表示している)
IDLが異常終了などの時、チェックアウトされたライセンスが返却されず、いつまでもライセンスが確保されたままになってしまうことがある。このようなときは lmutil コマンドの lmremove サブコマンドを使って、ライセンスを取り上げる。Unix 環境では、lmremove コマンドも使える。lmstat コマンドまたはサブコマンドで対象となるチェックアウトの <user>, <host>, <display> を調べておく必要がある。
lmutil lmremove idl <user> <host> <display> -c <port>@<server>ライセンスファイル・ライセンスサーバーの指定の優先度の順位は次のようになっている。
デフォルトでは、ライセンスマネージャは、ライセンスの確認のため2つのTCPポートを使用する。ライセンスマネージャデーモン lmgrd とベンダーデーモン idl_lmgrd でそれぞれ1つずつポートを使用する。lmgrd はデフォルトでポート番号 1700で接続を待ち受ける。一方、idl_lmgrd が待ち受けに使うポート番号は動的に割り当てられる。idl_lmgrd が使うポート番号を固定するには、サーバーのライセンスファイル(デフォルトの名前は license.dat)を変更する。
ライセンスファイルの先頭部分は、デフォルトでは次のようになっている。lmgrd が使うポート番号 1700 はデフォルトで指定されている。
############ license file comments, do not delete ################ License Number(s):<license number>SERVER <host name of server> <hostid of server> 1700USE_SERVERDAEMON idl_lmgrdidl_lmgrd が使うポート番号を変更するには、DAEMON で始まる行の末尾に PORT=<port> を追加する。次の例では、idl_lmgrd が使うポート番号として31700 を指定している。これ以外の箇所を変更すると、ライセンスファイルが使えなくなるので注意。
############ license file comments, do not delete ################ License Number(s):<license number>SERVER <license server name> <hostid> 1700USE_SERVERDAEMON idl_lmgrd PORT=31700ライセンスファイルを書きかえた後、ライセンスマネージャ lmgrd を再起動する。以上で、idl_lmgrd は固定のポート番号を使うようになる。
idl_lmgrd のポート番号が固定されれば、SSH で port forwarding する場合にも、毎回 idl_lmgrd が動いているポート番号を調べる必要がなくなる。次の例のように lmgrd と idl_lmgrd が使う固定のポート番号を port forwarding するだけでよい。
ssh -L 1700:<license server name>:1700 -L 31700:<license server name>:31700 <gateway name>別のターミナルで環境変数IDL_LMGRD_LICENSE_FILE の値を 1700@localhost としてからIDLを起動する。転送元のポート番号を1700から変更している場合は、それに応じてIDL_LMGRD_LICENSE_FILE の値も変更する。
# csh の場合setenv IDL_LMGRD_LICENSE_FILE 1700@localhost# bash の場合export IDL_LMGRD_LICENSE_FILE=1700@localhost# Windows のコマンドプロンプト場合 (もしくはシステムのプロパティで設定する)set IDL_LMGRD_LICENSE_FILE=1700@localhost# IDL を起動するidl環境変数LM_LICENSE_FILE も IDL_LMGRD_LICENSE_FILE とほぼ同じ意味だが、~/.flexlmrc に記録された設定よりも優先度が低いので、~/.flexlmrc で有効なライセンスファイルが指定されている場合はそちらが優先される。
一度使用したライセンスファイルの情報は ~/.flexlmrc に記録されるので、次回からは環境変数 IDL_LMGRD_LICENSE_FILE を指定しなくてもつながるはず(Windows では未確認)。意図したのと異なるライセンスサーバーに接続しようとするときは、~/.flexlmrc の内容を確認するか、 IDL_LMGRD_LICENSE_FILE を明示的に指定してやる。
ライセンスファイルと同じディレクトリに idl_lmgrd.optという名前でオプションファイルを作成することで、ライセンスの設定を行うことができる。オプションファイル中では大文字・小文字は区別される。
ユーザー observer は idl の利用をできなくする。
EXCLUDE idl USER observerユーザー observer の最大利用数を1ライセンス(6ユニット)に制限する。
MAX 6 idl USER observer192.168.33.* からの最大利用数を2ライセンス(12ユニット)に制限する。
MAX 12 idl INTERNET 192.168.33.*ユーザー observer のためにidlを1ライセンス(6ユニット)予約する。
RESERVE 6 idl USER observer