简介:面向Synopsys工具学习者的license配置参考资料,聚焦授权文件在生成、迁移与日常使用中的常见问题,适合具备一定Linux环境基础、需要理解license文件结构与本地服务配置的读者参考。资源包共1个文件,为docx文档,压缩包约269KB,篇幅紧凑,便于按主题查阅。文档围绕license文件生成、格式转换、时间戳兼容性、snpslmd路径指向、fix.bat处理以及lmgrd报错排查等内容展开,并给出特征补充与project_id调整的思路;同时提示版本差异可能带来的可用性风险,以及跨系统迁移时需关注的格式与路径问题,可帮助读者建立从配置到验证的排查框架。已有602人浏览学习,适合在学习场景下对照理解授权配置流程与常见故障定位,内容强调使用边界,仅限学习用途。
1. 离线工作站上的第一道坎:license 不通,工具连启动界面都进不去
某高校实验室有一台不接外网的 CentOS 工作站,EDA 工具装完了,敲命令回车,屏幕上只回一句Cannot connect to license server system。图形界面连影子都没有,日志里翻来覆去就是 feature 拿不到。这类场景下,Synopsys license 的本地服务配置就是绕不开的一关——不是装软件难,是让 license 服务在正确的 hostid、正确的端口、正确的 feature 列表上稳定跑起来难。
这份资源给的就是这一段的完整解法:一个压缩包,里面是 license 生成工具目录、Synopsys.src模板、fix.bat批处理,配一套「Windows 上生成、拷到 Linux 上用」的流程。2022 及之前的版本有人跑通过,其他版本没验证,边界就在这里。适合手里只有单机或小集群、做课程实验和学习验证的人;商用环境请走正规授权渠道,这条线不要踩。
2. 拆开压缩包先看目录:hostid、hostname、port 三个值决定成败
拿到包别急着双击 exe。先花五分钟把目录结构摸清楚,后面 80% 的返工都是因为这三个值里有一个填错,或者填对了但格式不对。我见过太多人卡在Invalid hostid,最后发现只是 MAC 地址少抄了一位,或者把无线网卡的地址当成有线网卡的填进去了。
2.1 synlic.gen 目录里四类文件各管什么
解压之后核心目录是synlic.gen,按职能可以分成四类,改动的频率完全不同:
| 文件/工具 | 作用 | 是否需要改 | 改动频率 |
|---|---|---|---|
scl_keygen.exe | 交互式生成 license,吃 hostid/hostname/port/过期时间 | 不改,直接运行 | 每次换机器才用 |
Synopsys.src | license 模板,含 SERVER/DAEMON/FEATURE 行与时间戳 | 必改 | 每次生成前 |
fix.bat | 对生成的Synopsys.dat做 SIGN/SN 填充 | 一般不改 | 每次生成后跑 |
Synopsys.dat | 生成产物,最终要拷到 Linux 的那份 | 必改两处 | 每次生成后 |
Synopsys.src是整个流程的源头。它长什么样、里面有多少 feature、PID 写的是什么,直接决定生成出来的 license 能不能被工具认。scl_keygen.exe只是个填表器,它不判断内容对不对,你给什么它就生成什么,所以源文件的正确性得自己兜住。
提示:解压路径不要带中文和空格。Windows 下某些批处理对路径里的空格处理很粗糙,
fix.bat在C:\Users\张三\我的 文档\这种路径下静默失败是常事,现象是没有任何报错但产物没生成。
2.2 hostid 与 hostname 的取法,以及为什么必须逐字符对齐
hostid 在 license 里就是网卡 MAC 地址,去掉冒号、横线的 12 位十六进制串。Windows 上取法:
# Windows CMD 下取物理网卡 MAC,注意看"物理地址"那一行 ipconfig /all # 只想快速拿到一行,PowerShell 更省事 getmac /v /fo listLinux 上取法更直接,注意要取实际对外那块网卡,不是 docker0、不是 lo:
# 方法一:读 sysfs,最可靠,不依赖工具装没装 cat /sys/class/net/eth0/address # 方法二:ip 命令,看 link/ether 后面那串 ip link show eth0 # 方法三:如果装了 SCL,自带 lmhostid /usr/Synopsys/scl/2021.03/linux64/bin/lmhostid三个方法结果应当一致。不一致的时候大概率是取错网卡了——虚拟机里常见 ens33、ens160 混着来,物理机上还有双网卡。license 里写哪个,lmgrd 启动时就必须能读到哪个,读不到就是Invalid hostid。
hostname 同理,hostname命令输出什么就填什么,大小写敏感。有个真实的翻车现场:机器 hostname 是EDA-Node01,填表时手写成eda-node01,生成出来的 license 里 SERVER 行和 DAEMON 行对不上,lmgrd 起来就报错。这种错误没有任何提示指向大小写,只能靠自己核对。
2.3 端口选 27000 段的哪个,以及怎么确认没被占
端口习惯用 27000 到 27009 这一段,scl_keygen.exe里填的 port 会写进 SERVER 行的第三段。选之前先确认空闲:
# Linux 下看 27000-27009 有没有被监听 ss -lntp | grep -E '2700[0-9]' # 老系统没有 ss 就用 netstat netstat -lntp | grep -E '2700[0-9]'如果被占了,换一个号码,比如 27010、27011,只要在合法端口范围内、防火墙放行、license 文件和客户端连接串两边一致就行。客户端那边一般通过环境变量指定:
# 客户端连 license 服务的两种写法,端口必须和 license 里 SERVER 行一致 export SNPSLMD_LICENSE_FILE=27000@eda-node01 # 或者用 LM_LICENSE_FILE,多个源用冒号分隔 export LM_LICENSE_FILE=27000@eda-node01注意:同一台机器上如果同时跑了别的厂商的 license 服务(比如另一套 EDA 的 lmgrd),端口冲突的概率不低。
lmgrd报Failed to open the TCP port十有八九是这个原因,先ss看一眼再动手改配置。
2.4 生成前的一次性检查清单
动手点scl_keygen.exe之前,把下面几项在纸上核一遍,能省掉后面至少两轮返工:
- hostid 12 位、全大写或全小写(看生成器要求,多数情况下大小写不敏感,但保持一种风格最稳)。
- hostname 与
hostname命令输出完全一致,含大小写与连字符。 - 端口在 27000-27009 里挑一个没被占的,防火墙
firewall-cmd --add-port=27000/tcp放行。 Synopsys.src已经按第 3 章改过时间戳和 feature 列表。- 记下本机 SCL 的实际安装路径,第 4 章要写进 DAEMON 行。
这五项里任何一项错了,后面生成的 license 都是废纸。与其生成完再回头查日志,不如在这里多花五分钟。
3. 改 Synopsys.src:时间戳为什么从 2004 换到 2018 就稳了
这一章是整个流程里最容易被跳过、又最容易出问题的地方。原始说明里有一句「2004 不稳定,有时 lic 可以有时不可以,换成 2018 基本没出现过问题」,这句话看着像玄学,但确实是踩出来的经验值。理解它背后的字段语义,比死记「改成 2018」有用得多。
3.1 src 文件的四段结构
Synopsys.src是纯文本,结构上分四段,从上到下依次是:
# 第一段:SERVER 行,声明服务端机器与端口 SERVER eda-node01 001122334455 27000 # 第二段:DAEMON 行,声明守护进程名与可执行文件路径 DAEMON snpslmd # 第三段:FEATURE 行,一行一个功能点,带版本号、到期日、数量、签名 FEATURE VerilogCompiler snpslmd 2018.03 31-dec-2030 10 \ SIGN="0000 1111 2222 3333 4444 5555" # 第四段:INCREMENT 行,增量授权,格式类似 FEATURE INCREMENT VCSRuntime snpslmd 2018.03 31-dec-2030 5 \ SIGN="0000 1111 2222 3333 4444 5555"FEATURE的字段顺序是:feature 名、守护进程名、版本号(形如YYYY.MM)、到期日、授权数量,最后是签名段。这里的版本号字段就是「2004 / 2018」出现的位置——它不是工具版本,而是 license 格式的基准版本,生成器按这个值决定签名怎么算。
3.2 时间戳字段的语义与「有时行有时不行」的成因
2004 这个值偏老,生成出来的签名在某些工具版本上校验会通过,某些版本上就不通过;同一台机器重生成一次可能又好了。这种间歇性失败最难查,因为日志里只写Invalid signature或干脆什么都不写,进程直接退出,没有任何指向性。
改成 2018 之后稳定,原因是签名算法跟版本字段绑定的分支在这个值下走的是更常见的路径,各工具版本对它的兼容处理一致。这不是什么高深原理,就是实测出来的边界。批量替换用一条sed就够:
# 先备份,改配置前养成习惯,出了问题能一键回滚 cp Synopsys.src Synopsys.src.bak # 把版本字段里的 2004 全部换成 2018 # 注意只匹配 YYYY.MM 形态,避免误伤到期日里的 2004 sed -i -E 's/(snpslmd[[:space:]]+)2004\./\12018./g' Synopsys.src # 核验:应该只剩 2018,且 2004 一条不剩 grep -nE '20(04|18)\.' Synopsys.srcsed里用了-E开扩展正则,[[:space:]]+匹配一个以上空白,\1回填前面的守护进程名,只替换snpslmd 2004.这种形态。这样写的好处是不会误伤到期日字段——到期日一般写成31-dec-2030,不含点号,天然被排除。
提示:改完一定要
grep核验。sed -i是原地改,改错了没备份就得重新解压。血泪经验:我一般在任何-i前面都先cp一份。
3.3 FEATURE 行与 PID:数量对不上就是白干
Synopsys.src里有几十上百行FEATURE,每行一个工具组件。你装的工具用到哪几个,license 里就必须有哪几行。少一行,工具启动时拿不到对应 feature,日志里就是Feature not found或者No such feature exists。
原始说明里提到「如果所需工具中存在 project_id,记得修改 Synopsys.src 中的 PID」。PID 是项目标识,出现在部分 feature 的字段里。填错的表现同样是 feature 拿不到,但日志措辞略有不同,可能报Invalid project id或直接归到 feature 校验失败。实操上,把工具安装目录下的*.pid或者启动脚本里出现的 PID 与 src 里逐行比对,是最笨也最有效的办法。
feature 列表的维护没有捷径。装了什么工具、用到哪些组件、每个组件的 feature 名是什么,只能靠工具启动日志反查——把日志里报的 feature 名拿去 src 里grep,没有就补上,补完重新生成。这个循环可能要跑两三遍,直到日志干净。
# 从日志里抽缺失的 feature 名,去重后逐条核对 grep -oE 'Feature: [A-Za-z0-9_]+' lmgrd.log | sort -u # 拿抽出来的名字去 src 里查有没有 grep -n 'FeatureNameFromLog' Synopsys.src4. 生成 Synopsys.dat 后必改的两处,以及手动兜底方案
scl_keygen.exe跑完,Synopsys.dat就躺在目录里了。但这份文件不能直接用,至少有两处必须手改:DAEMON 行的路径,以及签名段 SIGN/SN 的填充。前者是路径不对,后者是fix.bat没跑成功时的兜底。
4.1 第二行 DAEMON 必须指向本地 SCL 的 snpslmd
生成的Synopsys.dat第二行通常是DAEMON snpslmd,后面没有路径。Linux 上 lmgrd 需要知道去哪里找这个守护进程可执行文件,所以要把本机 SCL 的绝对路径补上:
# 修改前的第二行 DAEMON snpslmd # 修改后:路径按你本机 SCL 实际安装位置写 DAEMON snpslmd /usr/Synopsys/scl/2021.03/linux64/bin/snpslmd路径要写绝对路径,不能写相对路径,也不能写~。先确认文件真实存在且可执行:
# 确认路径存在、可执行 ls -l /usr/Synopsys/scl/2021.03/linux64/bin/snpslmd # 看 SCL 版本,确认和工具要求的版本匹配 /usr/Synopsys/scl/2021.03/linux64/bin/lmver注意:
lmver输出的版本如果低于工具要求的最低 SCL 版本,license 服务能起来但工具连不上,报的是版本不兼容,不是 feature 缺失。这个坑藏得深,看到Feature not found先别急着改 src,先看一眼 SCL 版本。
4.2 fix.bat 做了什么,失败时怎么手动补 SIGN 与 SN
fix.bat干的事情很简单:把Synopsys.dat里所有) }结尾的行,替换成带SIGN="..."的形式,再给第 7 行补上SN=RK:0:0:1。它是个文本批处理,路径里有空格、换行符是 CRLF、文件只读,都会让它静默失败。
手动兜底也不复杂,找一段签名串填进去即可。原始说明给的签名是多组 4 位十六进制:
# 修改前,feature 行结尾是空的签名段 FEATURE VerilogCompiler snpslmd 2018.03 31-dec-2030 10 ) } # 修改后,SIGN 与 SN 前面各留一个空格,这个空格不能省 FEATURE VerilogCompiler snpslmd 2018.03 31-dec-2030 10 \ SIGN="0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 AAAA BBBB CCCC DDDD EEEE FFFF 0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 AAAA BBBB CCCC DDDD") } # 第 7 行单独处理,本来没有 ) },直接补 SN=RK:0:0:1 SIGN="0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 AAAA BBBB CCCC DDDD EEEE FFFF 0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 AAAA BBBB CCCC DDDD"行数一多手工改不现实,写个脚本批量处理更稳妥:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 把 Synopsys.dat 里所有 ") }" 结尾的行补上 SIGN 段,并处理第 7 行的 SN import re import sys SIGN = ('SIGN="0000 1111 2222 3333 4444 5555 6666 7777 8888 9999 ' 'AAAA BBBB CCCC DDDD EEEE FFFF 0000 1111 2222 3333 4444 5555 ' '6666 7777 8888 9999 AAAA BBBB CCCC DDDD"') def fix_line(line): """把行尾的 ) } 替换成 SIGN + ) },注意 SIGN 前有一个空格""" if line.rstrip().endswith(') }'): head = line.rstrip()[:-3].rstrip() # 去掉 ) } 后再去尾空白 return head + ' ' + SIGN + ') }\n' # 重新拼回去 return line def main(path): with open(path, 'r', encoding='utf-8', errors='ignore') as f: lines = f.readlines() out = [fix_line(l) for l in lines] # 第 7 行下标 6,补 SN;如果已经带了 SN 就跳过 idx = 6 if idx < len(out) and 'SN=RK:0:0:1' not in out[idx]: out[idx] = 'SN=RK:0:0:1 ' + SIGN + '\n' with open(path, 'w', encoding='utf-8', newline='\n') as f: f.writelines(out) print('done, lines=%d' % len(out)) if __name__ == '__main__': main(sys.argv[1] if len(sys.argv) > 1 else 'Synopsys.dat')脚本里两个关键点:head + ' ' + SIGN中间那个空格,少了它 lmgrd 解析会失败且不报明确错误;newline='\n'保证写出的是 LF 换行,避免在 Linux 上出现 CRLF 导致的怪问题。跑完用head -n 8看一眼第 7 行是不是符合预期。
提示:
fix.bat成功跑过就别再用脚本二次处理,重复补 SIGN 会让一行里出现两个签名段,lmgrd 直接拒绝加载。
4.3 起服务、看日志、确认 feature 能被认出来
改完的文件拷到 Linux,放到一个固定的目录,比如/opt/license/,然后起服务:
# 后台起 lmgrd,-c 指定 license 文件,-l 指定日志,-z 让它在输出里保留日志 /usr/Synopsys/scl/2021.03/linux64/bin/lmgrd \ -c /opt/license/fix_Synopsys.dat \ -l /opt/license/lmgrd.log -z # 确认端口在听 ss -lntp | grep 27000 # 查服务状态与 feature 用量 /usr/Synopsys/scl/2021.03/linux64/bin/lmstat -a -c 27000@eda-node01lmstat输出里能看到每个 feature 的总数、已用、以及是哪个用户哪个进程占着。如果某个 feature 显示Total of 0 licenses或者压根不出现,说明 license 文件里没有这一行,回第 3 章补 src。服务起来但工具连不上,先看客户端的环境变量是不是指向了正确的port@host。
5. 排查:lmgrd 日志里五类高频报错逐个拆
这一章的每一条都是实际撞过的。日志在/opt/license/lmgrd.log,遇到问题第一件事是tail -f盯住它,而不是凭感觉改文件。
5.1 Invalid hostid:网卡换了、虚拟机克隆了、hostid 抄错了
现象:lmgrd启动失败,日志写Invalid hostid或Wrong hostid on SERVER line。
原因有三种:虚拟机克隆后 MAC 变了但 license 还是旧机器的;多网卡机器上取错了网卡;手工抄 hostid 时漏位或多位。克隆场景尤其常见,克隆出来的机器 hostid 和主机不一致,但人以为一样。
解决:重新跑lmhostid或cat /sys/class/net/<实际网卡>/address,把结果和 license 里 SERVER 行第三段逐字符比对。对不上就重新生成 license,别试图改 license 里的 hostid 去凑——hostid 是硬件标识,改了签名就废。
# 当前机器实际 hostid 与 license 里写的比对 lmhostid grep -i '^SERVER' /opt/license/fix_Synopsys.dat5.2 Feature not found:src 里少了一行,或 PID 填错
现象:服务起来了,工具启动时报Feature not found、No such feature exists,或者Invalid project id。
原因:Synopsys.src的 feature 列表不全,或者某个 feature 的 PID 字段和工具要求的 project_id 不一致。原始说明里那句「如果所需工具中存在 project_id 记得修改 PID」指的就是这个。
解决:从工具日志或lmgrd.log里抽出报错的 feature 名,去 src 里grep。没有就补一行,格式照抄相邻行、只改名字和数量;PID 不对就按工具安装目录里实际的值改。改完回到第 3 章重新生成、第 4 章重新补签名,重启服务。
# 从日志抓 feature 名 grep -oE '\([A-Za-z0-9_]+\)' lmgrd.log | sort -u | head -50 # 在 src 里逐个核验 for f in $(grep -oE 'Feature: [A-Za-z0-9_]+' lmgrd.log | awk '{print $2}' | sort -u); do grep -q "^FEATURE $f " Synopsys.src || echo "missing: $f" done5.3 Port in use:同机多套 license 服务抢端口
现象:Failed to open the TCP port、Cannot bind to port。
原因:27000 被本机另一套 lmgrd 占了,或者上次的 lmgrd 没退干净,僵尸进程还在监听。
解决:ss -lntp | grep 27000找到占用进程,是残留 lmgrd 就kill掉再重启;是别的服务就换端口,同时改 license 的 SERVER 行和客户端环境变量。旧进程残留的典型特征是ps aux | grep lmgrd能看到两个同名进程,一个是新的一个是旧的。
# 清理残留 lmgrd,先看再杀 ps aux | grep -E 'lmgrd|snpslmd' | grep -v grep kill <pid>5.4 时钟回拨导致 license 提前过期
现象:昨天还能用,今天启动就报License expired,但 license 文件里到期日是 2030 年。
原因:机器时间被 NTP 往回校了一次,或者虚拟机快照回滚,lmgrd 检测到系统时间早于上次运行时间,把 license 判为不可信。这是 license 服务的一个保护机制,不针对某一家。
解决:校准系统时间ntpdate或chronyd,然后重启 lmgrd。如果 license 已经被判废,重新生成一份。长期做法是给跑 license 服务的机器配上可靠的时钟同步,别让它自由漂移。
5.5 Windows 生成的 CRLF 换行,导致 lmgrd 解析异常
现象:license 文件肉眼看着没问题,lmgrd起来就退出,日志里报Syntax error或者干脆空日志。
原因:Windows 上生成的Synopsys.dat是 CRLF 换行,lmgrd 按行解析时把\r当成了内容的一部分,字段解析错位。
解决:拷到 Linux 后转一次换行符,再启动:
# 转换 CRLF 到 LF,-k 保留原文件备份 dos2unix -k /opt/license/fix_Synopsys.dat # 没装 dos2unix 就用 sed sed -i 's/\r$//' /opt/license/fix_Synopsys.dat这个坑几乎每个从 Windows 转 Linux 的人都会踩一次,转完file命令确认一下ASCII text而不是with CRLF line terminators。
6. 把一次性配置做成可重复验证的服务:systemd 加自检脚本
手工起 lmgrd 只适合调试。真要用起来,得让它开机自启、挂了自动拉、日志有地方落。我一般写一个 systemd 单元,再加一个启动前自检的小脚本,把第 2 章到第 4 章的检查项固化成命令。
systemd 单元放在/etc/systemd/system/snpslmd.service:
[Unit] Description=Synopsys License Server (learning lab only) After=network-online.target Wants=network-online.target [Service] Type=forking User=licadmin ExecStartPre=/opt/license/precheck.sh ExecStart=/usr/Synopsys/scl/2021.03/linux64/bin/lmgrd -c /opt/license/fix_Synopsys.dat -l /opt/license/lmgrd.log ExecStop=/usr/Synopsys/scl/2021.03/linux64/bin/lmdown -c /opt/license/fix_Synopsys.dat Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.targetprecheck.sh把容易漏的几项串起来,任何一项不通过就直接退出,不让服务带着错误配置起来:
#!/bin/bash # 启动前自检:文件存在、换行符正确、端口空闲、hostid 匹配 set -e LIC=/opt/license/fix_Synopsys.dat LMHOSTID=/usr/Synopsys/scl/2021.03/linux64/bin/lmhostid [ -f "$LIC" ] || { echo "license file missing"; exit 1; } file "$LIC" | grep -q CRLF && { echo "CRLF found, run dos2unix"; exit 1; } PORT=$(awk '/^SERVER/{print $4}' "$LIC" | head -1) ss -lnt "sport = :$PORT" | grep -q LISTEN && { echo "port $PORT busy"; exit 1; } HID=$(grep -i '^SERVER' "$LIC" | awk '{print $3}') [ "$HID" = "$($LMHOSTID)" ] || { echo "hostid mismatch: $HID vs $($LMHOSTID)"; exit 1; } grep -q '^DAEMON snpslmd /' "$LIC" || { echo "DAEMON path missing"; exit 1; } echo "precheck ok"启用之后systemctl daemon-reload && systemctl enable --now snpslmd,以后换机器只要改 hostid 和端口两处,其余流程不变。验证一次完整链路:停服务、清日志、重启、lmstat -a看到 feature 全在、客户端跑一个最小 case 能起来,四步全过才算配好。
几个参数值得记住为什么这么设:Type=forking是因为 lmgrd 自己会 fork 到后台,不这么写 systemd 会以为进程退了;After=network-online.target保证端口绑定前网络已就绪;RestartSec=10给端口释放留缓冲,设太短会出现重启时端口还在 TIME_WAIT 的翻车。
注意:这份配置只用于课程实验和学习验证环境。真到生产或商业项目,license 必须走正规授权,工具厂商的授权管理有审计手段,省这一步的代价远高于省下来的成本。
我现在的习惯是,任何一台新机器配完 license,先跑一遍precheck.sh,再手工lmstat -a确认 feature 数量和工具要求对得上,最后才敢开图形界面。这个顺序是被Feature not found折腾到半夜之后定下来的——日志一行行翻太慢,把检查前置成脚本,出问题第一秒就知道卡在哪。希望帮到你。
本文还有配套的精品资源,点击获取