ことの始まり
FPGAを触りたくなったので開発環境のための準備(根っこの構築?)を行った。
勉強用のFPGA評価ボードはGowin社製Tang nano 20k。開発環境ソフトGowin EDAのライセンスはノードロック式かフローティング方式のいずれかで認証が都度必要になるという。自分の場合はどのOS環境および端末で読み書きするかはその時次第なので、認証はフローティングライセンス方式を選んでおくことにした。
我が家ではiKOOLCOREのR1Pro(の革を被ったR1)が常時起動していて、仮想基盤管理ソフトのproxmoxが走ってるので仮想マシンやLXCコンテナは自由に作成できる。そこでライセンス管理およびその発行は専用のLXCを一つ作ってその中で行うことにした。
OSはDebian 13、CPUコア1つ、メモリ50MB、ストレージは10GB程度の仕様とした。
ストレージは5GBもあれば十分かもしれない。シンプロビジョニングだから常時確保されるわけもないしでまあいいや。
このページでは何かの拍子に環境をリセットしてしまったときのための備忘録として残すことにした。
ライセンスマネージャのインストールから始めて、システム起動後の自動化までを書き残す。
環境構築
ライセンスマネージャのダウンロード
ライセンスマネージャのダウンロードでは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配下にIDEとProgrammerがあって、ライセンスマネージャは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の記述あり)

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

