Synopsys License 配置:src、SIGN 与 lmgrd 排障
简介:面向需要在学习与测试环境中配置Synopsys工具license的初学者和工程人员,这份文档围绕license资源管理这一关键环节,梳理文件获取、格式转换、时间戳调整、本地服务路径设置、特征补全及常见报错排查等要点,并强调相关资源仅限学习使用,使用时应留意版权与合规边界。资源包共1个docx文件,约269KB,以文字说明为主,便于在Windows与Linux环境之间对照理解license文件的组织方式与修改逻辑。已有602人学习,说明其在同类配置问题中具有一定参考价值。文档对生成失败、批处理未生效、日志提示缺少特征等情形给出了排查思路,也提醒读者关注版本兼容性与参数匹配。内容侧重原理说明与问题定位,而非单纯步骤堆叠,适合具备一定工具配置基础、需要系统梳理license管理流程的读者查阅。
1. Windows 生成、Linux 起服务:这套 license 环境为什么总卡在第二步
装 EDA 工具链的人大多见过这种场面:Linux 上工具能启动,一跑就提示找不到 license,回头查服务端,lmgrd 进程还在,日志里躺着一行 feature 未找到。这套 synopsys license 资源的搭建路径本身不复杂,Windows 侧生成 Synopsys.dat,拷到 Linux,起 snpslmd 服务,麻烦的是中间几个参数只要写错一个,前面全白做。最反直觉的一步是把 Synopsys.src 里的 2004 改成 2018:不改也能生成 lic,但时好时坏,玄学得很,我第一次装的时候就卡在这,还以为是自己路径写错了。这篇笔记按学习测试环境来写,工具链仅限学习使用,正式项目请走正规授权渠道。
2. 环境清点:scl 2021.03 与 Windows 侧工具的版本对齐
这套流程分两段跑:Windows 上只负责生成和修文件,Linux 上负责起服务。两段之间唯一的契约是 hostid、hostname 和端口,任何一项对不上,后面全是对不上的报错。所以在下载解压之后、双击 scl_keygen.exe 之前,先把两边的环境清一遍,比出问题再回头查省事得多。
2.1 Linux 侧要准备的三样东西
目标机器上真正跑起来的是 scl(Software License Configuration)里的 snpslmd 守护进程,路径形如/usr/Synopsys/scl/2021.03/linux64/bin/snpslmd。先确认这个目录下 lmgrd、snpslmd、lmstat、lmutil 四个可执行文件都在:
# 确认 scl 版本目录与四个关键可执行文件 ls -l /usr/Synopsys/scl/2021.03/linux64/bin/ | grep -E 'lmgrd|snpslmd|lmstat|lmutil'四个文件缺一个都别往下走。lmgrd 是调度器,snpslmd 是真正解析 feature 的 vendor daemon,lmstat 后面用来验证,lmutil 在排查时能单独对 lic 文件做语法检查。版本目录名里的 2021.03 要和你后面写进 DAEMON 行的路径完全一致,我见过把 2021.03 写成 2021.3 导致 snpslmd 根本拉不起来的现场。
第二样是主机名解析。license 文件里的 SERVER 行绑定的是 hostname 加 hostid,客户端连的也是这个名字,所以hostname和hostname -i必须能互相解释:
# 三条输出要能自洽:主机名、解析到的 IP、网卡 MAC hostname hostname -i ip -o link show | awk -F'link/ether ' '{print $2}' | awk '{gsub(":","");print $1}'第三行输出的就是 hostid 的原始形态,把冒号去掉、取小写,就是 scl_keygen 要填的那串。常见做法是挑第一块物理网卡,别用 docker0、virbr0 这种虚拟网卡的 MAC,机器重启或者容器重建之后 MAC 会变,lic 立刻失效。
第三样是端口。27000 是 lmgrd 的默认端口,实际环境里 27000 到 27009 都在用,先在服务端确认没被占:
# 看 27000-27009 段是否已有进程监听 ss -lntp | grep -E '2700[0-9]'有输出就换一个空闲端口,换完记得 Windows 侧生成时填的 port、SERVER 行、客户端环境变量三处一起改。
2.2 Windows 侧工具包与目录约定
网盘拿到的 ocad.tar.gz 解压后,生成工具在../synlic.gen/..目录下,核心是三个东西:scl_keygen.exe、Synopsys.src、fix.bat。解压路径按我的习惯固定成D:\synlic,纯英文、无空格、层级不超过两层。带中文或者带空格的路径会让 fix.bat 在执行时拼接出错误的文件路径,表现是窗口一闪就关,什么都没生成。
Windows 侧还需要两个前置动作。一是把系统时间校准,scl_keygen 生成过期时间是基于本机时间算的,本机时间漂到几年前,生成的 lic 当天就过期。二是临时关掉杀毒软件对 bat 的拦截,fix.bat 会写文件,被拦下来的典型症状是生成了 fix_Synopsys.dat 但内容是空的。
注意:整套操作在 Windows 侧只做文件生成,不要在 Windows 上装 scl 去起服务,跨系统的路径写法差异会带来一堆无意义的报错。
2.3 版本对照表与前置检查
把两边的关键信息先填进一张表,后面每一步都对着它核:
| 组件 | 版本/取值 | 所在位置 | 作用 |
|---|---|---|---|
| scl | 2021.03 | Linux/usr/Synopsys/scl/2021.03/linux64/bin/ | 提供服务端守护进程 |
| scl_keygen.exe | 工具包自带 | WindowsD:\synlic\synlic.gen\ | 生成 Synopsys.dat |
| Synopsys.src | 工具包自带 | 同上 | feature 清单与年份基准 |
| fix.bat | 工具包自带 | 同上 | 补齐 SIGN 字段 |
| hostid | 网卡 MAC 去冒号 | Linux | lic 绑定依据 |
| port | 27000(示例) | 两端一致 | 客户端连接端口 |
前置检查就一条命令能覆盖大半:
# 服务端一条命令核完:hostname、IP、MAC、端口占用 printf '%s\n%s\n' "$(hostname)" "$(hostname -i)"; ip -o link show | awk -F'link/ether ' '{print $2}' | awk '{gsub(":","");print $1}' | head -1; ss -lntp | grep 27000 || echo "port free"命令拆开看很直白:前两行打印主机名和解析 IP,第三段取第一块网卡的 MAC 去掉冒号,最后一段判断 27000 是否空闲。这四行输出直接决定 scl_keygen 里三个输入框怎么填,抄错一个字符,后面 lmgrd 一定报 hostid 不匹配。
3. 生成 Synopsys.dat:从 Synopsys.src 改 2018 到 scl_keygen 填参数
这一步是整个流程里最容易“看起来成功了其实没成功”的环节。生成器不报错,文件也确实产出了,但 lic 拿到 Linux 上要么起不来,要么用一阵子突然失效。核心原因就两个:src 里的年份基准不对,以及 SERVER/DAEMON 行指向了错误的位置。
3.1 先改 Synopsys.src:把 2004 换成 2018
用文本编辑器打开Synopsys.src,全文查找2004,全部替换成2018。这一步在原始说明里被强调过:2004 生成的 lic 不稳定,有时能用有时不能用,换成 2018 之后基本没再复现过。从原理上讲,src 里的年份字段参与签名计算,生成器按这个基准算出来的签名和 snpslmd 侧校验时用的基准对不上,就会出现“同一份文件重启一次就失效”的诡异现象。
手工替换容易漏,用 PowerShell 一次做完更稳:
# 备份原文件后整体替换年份,注意用 ASCII 编码避免 BOM 头 Copy-Item .\Synopsys.src .\Synopsys.src.bak (Get-Content .\Synopsys.src) -replace '2004','2018' | Set-Content .\Synopsys.src -Encoding ASCII-Encoding ASCII不是可选项。PowerShell 5.x 的Set-Content默认写 UTF-16,src 文件被写成带 BOM 的宽字符之后,scl_keygen 读进去解析异常,生成的 lic 会缺 feature,而报错信息完全看不出编码问题。备份那一行也别省,改错了还能退回去。
同时顺手确认 src 里的 PID(project_id)。如果你要用的工具本身带 project_id,这里必须改成对应值,否则生成的 lic 里 PID 与工具期望的不一致,特征能读到但校验不过。常见做法是先在 src 里搜PID,看已有条目的写法,照格式改数值,不要自己造字段名。
3.2 scl_keygen.exe 的三个输入框怎么填
双击scl_keygen.exe,界面上要填的是 hostid、hostname、port,加上一个可自行调整的过期时间。三个值的来源就是 2.3 那张表:
# scl_keygen.exe 界面输入对应关系(示例值,按自己环境替换) hostid = 001122334455 ; Linux 网卡 MAC,去冒号小写 hostname = eda-node01 ; 必须是 Linux 上 hostname 的输出 port = 27000 ; 与 SERVER 行、客户端变量一致 expire = 31-dec-2030 ; 按需调整,别超过 src 里 feature 的有效期hostname 必须逐字符等于 Linux 上hostname的输出,大小写都算。有过一次现场是 Windows 侧手打成了EDA-Node01,Linux 上实际是小写,客户端连上来之后 lmgrd 日志里只有一行含糊的 “wrong hostid”,查了两个小时。
过期时间不是随便填的越大越好。src 里每个 feature 行自带一个到期日期,lic 里最终生效的是两者中较早的那个,把生成器的过期时间设到 2099 年没意义,feature 行写的 2030 年一到照样失效。
点生成,得到Synopsys.dat。这个文件此刻还不能直接用,还差两处改动。
3.3 第 2 行 DAEMON:把 snpslmd 指到本地 scl 路径
打开生成的Synopsys.dat,第 1 行是 SERVER,第 2 行是 DAEMON。默认生成的 DAEMON 行路径往往不对,需要手动改成目标 Linux 机器上真实的 snpslmd 绝对路径:
# Synopsys.dat 前两行示例 SERVER eda-node01 001122334455 27000 DAEMON snpslmd /usr/Synopsys/scl/2021.03/linux64/bin/snpslmdSERVER 行三个字段分别是主机名、hostid、端口,和 3.2 里填的完全对应。DAEMON 行第二个字段固定是 snpslmd,第三个字段是 Linux 上的绝对路径,写 Windows 路径(哪怕是D:\...形式)lmgrd 一定起不来。
改完这两行先别急着拷走,用 lmutil 在 Linux 侧做一次语法预检,比启动之后看日志快得多:
# 只校验 lic 文件语法,不启动服务 /usr/Synopsys/scl/2021.03/linux64/bin/lmutil lmdiag -c /path/to/Synopsys.datlmdiag 会把每一行的问题指出来,包括字段数不对、路径不存在、端口非法。这一步能把大部分低级错误拦在启动之前。
4. 补齐 SIGN 与 SN:fix.bat 跑不通时的手工改法
生成的 Synopsys.dat 里,feature 行的结尾是) },缺少 snpslmd 校验所需的 SIGN 字段,直接拿去起服务会报签名无效。这一步由 fix.bat 完成,但它在某些环境下会静默失败,所以必须掌握手工改法。
4.1 fix.bat 做了什么
双击fix.bat,它读取同目录的Synopsys.dat,把每个 feature 行末尾的) }补成带 SIGN 字段的完整形式,输出fix_Synopsys.dat。执行成功的标志是同目录下出现非空的fix_Synopsys.dat,且文件大小比原文件大一圈。
执行不成功一般三种原因:路径含中文或空格导致拼接失败、当前用户对目录没有写权限、杀软拦截了 bat 的文件写操作。对应处理分别是换到D:\synlic、右键以管理员身份运行、临时关闭拦截。修完再跑一次,能生成就直接用,生成不了就走 4.2。
4.2 手工替换:三处位置与空格陷阱
手工改的核心是把所有) }补成完整的 SIGN 结构。用编辑器打开Synopsys.dat,做全局替换,把每一处:
) }替换成:
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 行。第 7 行原本是SN=RK:0:0:1结尾且没有) }的,直接在后面追加 SIGN,改成:
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"这一步有两个空格陷阱,两个都是血泪经验。第一,SIGN 前面必须有一个空格,1111"SN=这种粘连写法会让解析器把 SN 当成 SIGN 值的一部分;第二,替换) }的时候,)和}中间那个空格要保留,写成)}会让 lmdiag 报字段数不符。
用 PowerShell 做替换比手工点更快,也更容易保证空格一致:
# 全局补齐 SIGN,注意 $sign 后保留一个空格再拼 ") }" $src = "D:\synlic\Synopsys.dat" $dst = "D:\synlic\fix_Synopsys.dat" $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"' (Get-Content $src -Encoding ASCII) -replace '\) \}', "$sign) }" | Set-Content $dst -Encoding ASCII这段脚本只做了全局替换,第 7 行的 SN 追加还得手工补一次,因为它的原始结尾不是) },正则匹配不到。执行完打开fix_Synopsys.dat抽查三行:第 2 行 DAEMON 路径、第 7 行 SN 加 SIGN、任意一条 feature 行结尾的SIGN="...") }。
4.3 改完后的格式自检
文件格式上有三个点必须在拷到 Linux 之前确认。编码是纯 ASCII,没有 BOM;换行按需转成 LF,lmgrd 对 CRLF 的容忍度不稳定,转一下更保险:
# 去掉 Windows 换行符,再确认文件没有 BOM sed -i 's/\r$//' /path/to/fix_Synopsys.dat file /path/to/fix_Synopsys.dat head -c 3 /path/to/fix_Synopsys.dat | xxdfile应该报 ASCII text,head -c 3不该出现efbbbf。第三点是权限,文件属主设为跑服务的那个账号,权限 644 就够,别图省事给 777,某些版本的 lmgrd 会拒绝加载全局可写的 lic 文件。
5. 常见问题排查:feature 缺失、PID 对不上与 lmgrd 起不来的五种现场
5.1 日志报 feature 未找到,工具启动直接退出
现象:lmgrd -c fix_Synopsys.dat -l Synopsys.dat.log起得来,但客户端一启动就像没 license 一样退出,日志里明确写着某个 feature 找不到。
原因:Synopsys.src里没有这个 feature,生成器自然不会把它写进 lic;或者 src 里有,但 PID 与工具期望的 project_id 不一致,snpslmd 认为这行不归自己管。
解决:回到Synopsys.src,照已有 feature 行的字段顺序追加缺失的 feature 名,同时把 PID 改成工具对应的 project_id,然后重新走第 3 章生成一次 Synopsys.dat,再走第 4 章补齐 SIGN。改完必须重新生成,直接在 fix_Synopsys.dat 里手写一行 feature 是没用的,签名对不上。
5.2 lic 今天能用明天不能用,重启一次就好
现象:没有任何改动,同一份 lic 有时客户端能拿到,有时报无效;重启 lmgrd 之后又好了。
原因:src 里的年份基准还是 2004。这个基准参与签名计算,校验侧和生成侧的基准漂移,导致校验结果不稳定。
解决:按 3.1 把Synopsys.src里所有 2004 换成 2018,重新生成、重新补 SIGN。这个坑最容易误判成网络问题,因为表现太像“偶发连不上”。
5.3 服务进程在,客户端连不上
现象:服务端ps -ef | grep lmgrd能看到进程,客户端设了SNPSLMD_LICENSE_FILE仍然连不上。
原因:防火墙拦了 27000 端口,或者客户端配置里的 hostname 解析不到服务端。
解决:服务端ss -lntp | grep 27000确认监听地址不是只有 127.0.0.1,客户端telnet eda-node01 27000验证通路,不通就查防火墙和/etc/hosts。hosts 里补一行服务端IP 服务端hostname是最省事的做法。
5.4 报 SIGN 校验失败
现象:lmgrd 起不来,日志里是签名无效或 license key 格式错误。
原因:替换) }的时候漏了某几行,或者 SIGN 前少了那个空格,或者第 7 行的 SN 后缀没补。
解决:用grep -c 'SIGN='数一下带 SIGN 的行数,和grep -c '^INCREMENT'的 feature 行数对比,数量对不上说明漏替。再grep -n 'SN=RK'确认第 7 行格式,SIGN 与 SN 之间必须有一个空格。
5.5 fix.bat 一闪而过,什么都没生成
现象:双击 bat 窗口瞬间关闭,目录里没有fix_Synopsys.dat。
原因:路径含中文或空格;当前用户无写权限;杀软拦截。
解决:整个工具目录搬到D:\synlic这类纯英文短路径,右键以管理员身份运行,临时关掉拦截再试。仍然失败就走 4.2 的手工替换,结果等价。
6. 装完怎么验证:lmstat 与日志双确认的落地方法
验证这件事我只认两个输出:lmstat 能看到 feature 被签出,日志里没有新报错。二者缺一都不算跑通。启动服务时建议带上日志参数,别让它前台跑着然后另开窗口猜:
# 后台启动,日志单独落盘,方便反复回看 export SNPSLMD_LICENSE_FILE=27000@eda-node01 nohup /usr/Synopsys/scl/2021.03/linux64/bin/lmgrd \ -c /path/to/fix_Synopsys.dat \ -l /path/to/Synopsys.dat.log > /dev/null 2>&1 & # 等三秒再看状态,立刻看容易看到还没起完的中间态 sleep 3 /usr/Synopsys/scl/2021.03/linux64/bin/lmstat -a -c 27000@eda-node01-c指定 lic 文件,-l指定日志,-a列出所有 feature 和当前占用情况。lmstat 输出里每个 feature 会显示Total of N licenses issued; Total of 0 in use,0 in use 说明服务端正常但还没客户端接入,这时去目标机器上跑一次工具,再回到 lmstat 看 in use 是否变成 1。
日志侧重点看三行:Starting snpslmd说明 vendor daemon 拉起来了,LICENSE ... issued to说明有签出,最后检查有没有Invalid、Wrong hostid、Cannot find这类字样。我一般会用一条命令把常见错误一次性筛出来:
# 只看错误行,正常启动的日志会很长 grep -Ei 'invalid|wrong hostid|cannot find|failed|error' /path/to/Synopsys.dat.log没有输出才算干净。有输出就按第 5 章对应条目处理,别在服务还在跑的状态下直接改 lic 文件,改完要lmdown停服务再重启,热改文件 lmgrd 不会重新加载。
验证清单对照着走一遍:
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 进程存在 | ps -ef | grep lmgrd | 有 lmgrd 与 snpslmd 两个进程 |
| 端口监听 | ss -lntp | grep 27000 | 监听 0.0.0.0 或服务端 IP |
| feature 可见 | lmstat -a -c 27000@主机名 | 列出目标 feature,issued 数正常 |
| 客户端签出 | 在客户端跑一次工具 | in use 从 0 变 1 |
| 日志无错 | grep -Ei 'invalid|error' 日志 | 无输出 |
还有个小技巧:如果客户端报错但服务端日志干净,问题多半在客户端环境变量。SNPSLMD_LICENSE_FILE和LM_LICENSE_FILE两个变量同时存在时,不同版本的工具优先级不一样,常见做法是只留SNPSLMD_LICENSE_FILE,把另一个 unset 掉,能避免一大半莫名其妙的连不上。
这套环境我前后装过七八次,每次翻车都翻在同一个地方:改完 src 忘了重新走生成那一步,直接拿旧的 Synopsys.dat 去补 SIGN,结果自然是白忙一场。从那以后我每次动完 Synopsys.src,都强制按“重生成、改 DAEMON、补 SIGN、lmdiag 预检、启动看日志”这五步完整走一遍,不跳步、不复用旧产物。希望帮到你。
本文还有配套的精品资源,点击获取