Gowin EDA用のライセンスサーバ(サービス)を立てる

ことの始まり

FPGAを触りたくなったので開発環境のための準備(根っこの構築?)を行った。


勉強用のFPGA評価ボードはGowin社製Tang nano 20k。開発環境ソフトGowin EDAのライセンスはノードロック式かフローティング方式のいずれかで認証が都度必要になるという。自分の場合はどのOS環境および端末で読み書きするかはその時次第なので、認証はフローティングライセンス方式を選んでおくことにした。

我が家ではiKOOLCOREのR1Pro(の革を被ったR1)が常時起動していて、仮想基盤管理ソフトのproxmoxが走ってるので仮想マシンやLXCコンテナは自由に作成できる。そこでライセンス管理およびその発行は専用のLXCを一つ作ってその中で行うことにした。
OSはDebian 13、CPUコア1つ、メモリ50MB、ストレージは10GB程度の仕様とした。
ストレージは5GBもあれば十分かもしれない。シンプロビジョニングだから常時確保されるわけもないしでまあいいや。

ikoolcore R1

このページでは何かの拍子に環境をリセットしてしまったときのための備忘録として残すことにした。
ライセンスマネージャのインストールから始めて、システム起動後の自動化までを書き残す。


環境構築

ライセンスマネージャのダウンロード

ライセンスマネージャのダウンロードではcurlを使いたいところ。あいにくこのコンテナには最小限の機能しかない。そこでcurlの導入から始める。

# apt install curl -y

落としてきたライセンスマネージャは/opt配下に展開して使うことにする。なお、ダウンロードページはメンバー登録完了後でないとみれない。
curlでの-LO以下はプログラムの配布ページにあるURLを入力する。ダウンロードページからxxxx.gzのリンク先を得るはず。ちなみにフローティングライセンスの申請も同じタイミングで済ませておいた。発行依頼をかけてから2日程度で届いた。一悶着あったけど。

# cd /opt
# curl -LO "https://www.gowinsemi.com/~~~~.gz"

tar -xzfでもって、gzipで圧縮されたtarファイルの解凍。
-xはアーカイブの展開、-zはgzip圧縮の解凍、-fでファイル名指定。まとめた引数-xzfで解凍する。

# tar -xzf ~~~~~.gz
# ls
~~~~~.gz  Gowin_LicenseServer_V2.2_linux

解凍するとGowin_LicenseServer_V2.2_linuxが出てくる。長い。冗長なのでリネームしておく。

# mv Gowin_LicenseServer_V2.2_linux gowin-license

ディレクトリ構成はgowin-license配下にIDEProgrammerがあって、ライセンスマネージャはbinの中にいる。license_serverがそれ。

/opt/gowin-license/bin# ls -l
total 58304
-rwxr-xr-x 1 626 1707      764 Oct 16  2025 gowin_E_xxxxx.lic
-rwxr-xr-x 1 626 1707  7070064 Oct 16  2025 libQt5Core.so.5
-rwxr-xr-x 1 626 1707  8775264 Oct 16  2025 libQt5Gui.so.5
-rwxr-xr-x 1 626 1707  2218784 Oct 16  2025 libQt5Network.so.5
-rwxr-xr-x 1 626 1707  8100680 Oct 16  2025 libQt5Widgets.so.5
-rwxr-xr-x 1 626 1707  2521224 Oct 16  2025 libcrypto.so.10
-rwxr-xr-x 1 626 1707   320720 Oct 16  2025 libgssapi_krb5.so.2
-rwxr-xr-x 1 626 1707 25048256 Oct 16  2025 libicudata.so.56
-rwxr-xr-x 1 626 1707  3368288 Oct 16  2025 libicui18n.so.56
-rwxr-xr-x 1 626 1707  2069136 Oct 16  2025 libicuuc.so.56
-rwxr-xr-x 1 626 1707   180496 Oct 16  2025 license_server

ライブラリ不足の解消

さっそくlicense_serverを起動してみるとエラーがでてきた。どうやら稼働に必要なライブラリが不足しているみたい。

/opt/gowin-license/bin# ./license_server --help
./license_server: error while loading shared libraries: libGL.so.1:cannot open shared object file:No such file ordirectory

不足するライブラリをlddで確認したところ、3つばかり足りない。パッケージ名指定で追加インストールする。

opt/gowin-license/bin# ldd ./license_server
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        libGL.so.1 => not found
        libgthread-2.0.so.0 => not found
        libglib-2.0.so.0 => not found
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opt/gowin-license/bin# apt install -y libgl1 libglib2.0-0

不足するライブラリはないか改めて確認しておく。
not foundと表示されなければ、とりあえずlicense_serverは起動できるようになる。

/opt/gowin-license/bin# ldd ./license_server | grep "not found"

ライセンスファイルをコンテナ内に移動する

申請していたライセンスファイルをRloginなどでホストからゲスト(LXC内)へ移動させる。
今回はホストroot直下へ転送したライセンスファイルをLXC(ホストID:104)へ移動するとともにgowin.licへリネームしておく。

# pct push 104 /root/gowin_xxxx_floating.lic /opt/gowin-license/bin/gowin.lic

ライセンスマネージャの起動可否を確認する

とりあえずLXC内のライセンスマネージャを起動してみる。うまくいけば下記の表示になる。

/opt/Gowin_LicenseServer_V2.2_linux/bin# ./license_server
yyyy-mm-dd hh:mm:ss.sss >
    Server started.
    Local Address: ipadress
    Local Host Name: hogehoge
    Listening Port: xxxx
    License Count: z

今回はここでトラブル発生。たとえば私の場合はERROR: License mode not match.なんてメッセージが出てきてしまった。
発行ライセンスにまさかの誤りがあったのである…っ!!
フローティングライセンスを申請したはずが、なぜかノードロックライセンスが届くという…。
あらためてライセンスを要求すると今度はきちんとしたものが届いた。なぜか数量が二桁に化けて(・∀・;)

ライセンスがうまく認識された後、ctrl+zキーで一時停止。プログラムは通信ポートを使いぱなしなのでプロセスをkillしておく。
無事に動作しているようなら次にコンテナ起動、ライセンスプログラムも起動するような設定を作る。

/opt/gowin-license/bin# jobs -l
[1]+  aaaa Stopped                 ./license_server
/opt/gowin-license/bin# kill -9 aaaa

systemdでライセンスマネージャをサービス化する

ライセンスマネージャはLXCの起動とともにも自動的に立ち上がるようにしておきたいので、systemdでサービス化する。サービス名はgowin-licenseとかにしておく

# vi /etc/systemd/system/gowin-license.service

作成したサービスの設定は下記のようにしてみた。

## gowin-license.serviceの中身
[Unit]
# サービスの説明
Description=Gowin License Server
# ネットワーク系のサービス初期化後、利用可能になったタイミングで起動させる
After=network.target

[Service]
# サービスが単一のプロセスを持つ単純なタスクなので
Type=simple
# ワーキングディレクトリの指定
WorkingDirectory=/opt/gowin-license/bin
# 起動する実行ファイル
ExecStart=/opt/gowin-license/license_server
# 異常終了したら、自動的に再起動かける
Restart=on-failure
# なお、異常終了してから5秒待って再起動します。
RestartSec=5

[Install]
# Linuxが通常のマルチユーザーモードで起動したらこのサービスも起動させる。
WantedBy=multi-user.target

ここまでの設定でLXC起動→systemd起動→multi-user.target到達→gowin-license.service起動となる。
あとはサービス実行のためデーモン設定のリロードとつくったばかりのサービスを有効化する。
ついでに状態も見ておく。

# systemctl daemon-reload
# systemctl enable gowin-license
# systemctl status gowin-license
* gowin-license.service
     Loaded: loaded (/etc/systemd/system/gowin-license.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-07-27 14:31:00 UTC; 273ms ago
 Invocation: xxxx
   Main PID: 1515 (license_server)
      Tasks: 1 (limit: 16707)
     Memory: 2M (peak: 2M)
        CPU: 16ms
     CGroup: /system.slice/gowin-license.service
             `-1515 /opt/gowin-license/bin/license_server
             

問題があるとすればタイムゾーンがUTCなのでJSTに変更しておくくらいか。

クライアント側でIDEの起動確認を行う。

動作チェックとしてwindowsとlinuxの入った端末それぞれで検証してみる。
IPアドレスと通信ポート番号(license_serverの起動時にListening Portの記述あり)

クライアントとサーバ間の通信は問題なさそう。


雑記(2022/7/2)

 Linuxよくわからない勢の一人です。ただサーバーのOSはどれが良さそうってのはなんとなく知っていて、大学の知り合いから吹き込まれたCentOSを好んで使っていました。
ただ昨年の今頃くらいにCentOSのあり方が変わることを耳にし、慣れきらないうちにOSの変更を考えるようになりました。
期限切れは2024年6月であるものの、kifuyu.netの運用環境が若干古くなってきたこともありサーバー再構成とOS変更を同時に実施です。
 いっその事、個人・開発用途であれば無償で使えるRHELにしてみるのもありだったけど、特に思い入れもないのでDebian系のUbuntuを選択。

この日の新鯖における作業は下記の通り。

  • ユーザの追加
  • SSHの設定
  • Fail2banの設定
  • DBのkill

>SSHの設定
“SSH2 User Auth Failure “publickey,gssapi-keyex,gssapi-with-mic”
Status=1004 Send Disconnect Message…
publickey(ssh-ed25519),publickey(ssh-ed25519)”

上記のポップウィンドウが出てきてしまって見事にハマった。
公開鍵のフォーマットを見直したら、ようやくsshでの通信が通った。
楽しようとRloginで生成したけど、結局ssh-keygenで生成した方がスムーズに行けたという。原因はopensshの設定にあるのか、Rloginのせいなのかよくわからん。後者ぽいけど。

//Rloginで生成
-----BEGIN OPENSSH PRIVATE KEY-----
*****
-----END OPENSSH PRIVATE KEY-----
->
//ssh-keygenで生成したやつ。
ssh-ed25519 ***** hogehoge

 sshdの設定ファイルは、/etc/ssh/配下のsshd_configをsshd_config.dへコピーして、hogehoge.confへリネーム。
また同ファイルを下記の設定に書き換え。

// コピー先の*.conf内のincludeをコメントアウト
- Include /etc/ssh/sshd_config.d/*.conf
+ # Include /etc/ssh/sshd_config.d/*.conf

// ポート番号変更。Firewallの設定も忘れずに。
- Port 22
+ Port hogehoge

// rootユーザでログインはしないので無効化
- PermitRootLogin yes
+ PermitRootLogin no

// 公開鍵認証に限定のため変更。公開鍵使ってるのにあえて"yes"を指南する記事があったけど何故…
- PasswordAuthentication yes
+ PasswordAuthentication no

// コメントアウトしないと何故かエラーが発生する。"Failed to start OpenBSD Secure Shell server."
- Subsystem sftp /usr/lib/openssh/sftp-server
+ #Subsystem sftp /usr/lib/openssh/sftp-server


 authorized_keysはssh接続するユーザのディレクトリ配下(home/hogehoge/.ssh/)に置いとく必要がある。
しばらくrootのディレクトリに配置していたせいで接続できんかった。。