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の記述あり)

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


Disk2vhdでイメージ化したけど起動しない

故人のPC本体は捨てたいけど中身はそのまま手元に置いておきたいという状態。ディスクをまるまるイメージ化してHyper-Vで起動できるようにした。

使用するソフトはDisk2vhd。ディスクイメージはVHDXフォーマットへ出力して適当なディレクトリに保存する
OSはWindows7だったのでHyper-Vの仮想マシン世代は第一世代を選択。イメージ本体はIDEコントローラ傘下にする。(SCSIにするとBOOT FAILURE. REBOOT AND SELECT PROPER BOOT DEVICE OR INSERT BOOT MEDIA~~~みたいなメッセージが起動時表示されるだけ)

ディスク修復の処理がかかったけど、これで起動した。

GT710環境下でproxmoxのインストールに失敗する

具体的にはproxmoxのインストール中の下記画面で止まる。これはGT710用のドライバが見当たらないためで、kernel mode setting(KMS)を無効にすれば先に進む。

Welcome to the Proxmox 9.0 ~
initial ~
mouting proc file system
mouting sts file system
FEI boot ~
boot comandline: 
laoding drivers: nvidiafb ahci ~~~~~intel_rapl_common amd_atl fmpm

PVEのインストール画面にて、”Install Proxmox VE (xxxx)”で”e”キーを押して入力編集モードへ。linux行の末尾に”nomodeset”を入力して ctrl + xを押す。

linux /boot/vmlinuz ~~ ...plash-silent nomodeset

lost+foundを非表示にした

proxmoxでturnkeylinuxのfile serverを使っている。ぽちぽち押すだけで済むだけ何かと楽(セキュリティ的に楽とは言ってない)
さっそく使い始めるとエクスプローラ上で表示されるlost+foundが邪魔なので非表示化した。/etc/samba/smb.confのglobal設定に以下を記述

[global]
hide dot files = yes
veto files = /lost+found/
delete veto files = yes
hide files = /lost+found/

veto files = /lost+found/ :lost+found を Windows から完全に隠す
delete veto files = yes : ユーザーが削除を試みてもエラーにする
hide files = /lost+found/ : lost+found を隠す(念押し