☰
Synopsys license生成、lmgrd启动与故障排查实战
2026/11/4 4:52:10 网站建设 项目流程

简介:面向 Synopsys 工具初学者与需要搭建本地学习环境的工程师,这份文档围绕 license 资源的获取、生成与跨平台使用展开,重点梳理 Windows 下生成、拷贝至 Linux 使用的常见配置、版本兼容性与注意事项。压缩包仅含 1 个 docx 文件,大小约 269KB,篇幅集中,便于按主题查阅与对照。内容涉及 license 文件格式调整、过期时间与 snpslmd 路径处理、fix 脚本失败后的手工修改,以及 lmgrd 报 feature 缺失时的排查思路,并提醒不同版本可用性需谨慎验证。文档同时说明 project_id 与特征项匹配等细节,涵盖从文件结构理解到日志定位的常见问题,并保留常见错误现象与解决方向的整理,适合已具备一定工具配置基础、希望减少 license 排错时间的读者参考。目前已有 602 人学习,可作为 Synopsys license 学习场景的查阅材料,使用时需注意仅限学习及版权合规。

1. 一台装好工具的机器,卡在一份 license 上

工具装完、环境变量配好、dc_shell敲下去,屏幕上直接甩出一行Unable to obtain a license,这种场面见得太多了。真正折腾人的不是软件本体,而是那份 synopsys license 资源——它得先在 Windows 上用一个生成器产出Synopsys.dat,再拷到 Linux 上由lmgrd拉起来,中间任何一个字段写歪,服务就静默退出。这套资源走的是两段式流程:Windows 侧解包ocad.tar.gz、改Synopsys.src、跑scl_keygen.exe,Linux 侧改 DAEMON 路径、用lmgrd -c起服务。定位是仅限学习使用的自建测试环境,正式商用请走厂商授权。下面按我实际装过的顺序走一遍,版本差异和翻车点都写进去。

2. 环境准备:Windows 出文件,Linux 跑服务

这套流程最容易被忽略的一点是:生成和运行不在同一台机器上,甚至不在同一个操作系统上。Windows 只负责把Synopsys.dat造出来,Linux 只负责把它挂成服务。两边的版本、路径、主机标识必须对得上,否则生成出来的文件在 Linux 上就是一张废纸。

2.1 两端各装什么、版本怎么对

先把两端的分工列清楚,我一般会照下面这张表逐项核对,缺一项就别往下走:

位置需要的东西从哪来关键点
Windows解包工具系统自带 tar 或 7-Zipocad.tar.gz是 tar 包,不是 zip
Windowssynlic.gen目录解包后自动出现内有scl_keygen.exe、Synopsys.src、fix.bat
Windows文本编辑器记事本、Notepad++ 均可必须能保存为无 BOM 的纯文本
LinuxSCL 安装本地已有的 scl 目录版本号决定 DAEMON 行路径,2021.03 只是示例
Linuxlmgrd/lmstat/lmdown随 SCL 一起安装在scl/<版本>/linux64/bin下
Linux工具本体已装好只需能读到 license 即可,不必重装

SCL 版本这块我建议先摸清楚再动手,因为Synopsys.dat第二行要写死snpslmd的绝对路径,路径写错lmgrd连启动都启动不了,日志里只会留一行Failed to open the daemon。装的是 2021.03 就写 2021.03,别照着别人的笔记抄年份。常见做法是:

# 找出本机实际的 scl 版本目录,别凭记忆写 ls -d /usr/Synopsys/scl/*/ 2>/dev/null # 确认 snpslmd 真的存在且可执行 ls -l /usr/Synopsys/scl/*/linux64/bin/snpslmd

第一条命令把本机所有 SCL 版本列出来,如果有多个版本共存,就挑和工具本体匹配的那个;第二条确认snpslmd二进制在位并且带x权限。这两步看着琐碎,但省下来的时间比后面查日志多得多。

2.2 解包 ocad.tar.gz 与目录确认

ocad.tar.gz在 Windows 上解包,直接右键或者命令行都行。解完的目录结构大致是这样,第一次装的人最好对着看一下,少一个文件后面步骤全废:

文件作用是否可以改
scl_keygen.exe生成 license 的主程序不改
Synopsys.srcfeature 模板,年份和 PID 都在里面必须改
fix.bat自动给生成结果补 SIGN 尾串执行即可,不必改
Synopsys.dat生成产物,最终要拷到 Linux生成后手工微调

解包用命令行更稳,避免 Windows 资源管理器把 tar 包当压缩包乱解:

# 在 Windows 的 Git Bash / WSL 里执行,也可以直接在 Linux 上先解开看看内容 tar -xzf ocad.tar.gz # 只看目录结构不解包,适合先确认包里有没有 synlic.gen tar -tzf ocad.tar.gz | head -n 20

第一条是标准解包,-x解、-z走 gzip、-f指定文件;第二条只列清单,-t是 list 模式,加head是为了别刷屏。我习惯先-t看一眼顶层目录叫什么,再决定解到哪个位置,免得解出来一堆文件散落在当前目录。

2.3 取三件套:hostid、hostname、port

生成器要的三样东西全在 Linux 侧取,Windows 上是取不到的,这点新手最容易搞反。hostid 在 Synopsys 的语境里通常就是网卡的 MAC 地址(12 位十六进制,去掉冒号),hostname 是 Linux 的机器名,port 默认 27000。

# 机器名,注意大小写,后面填进生成器要和这里完全一致 hostname # 部分系统上 hostid 命令直接给出十六进制串 hostid 2>/dev/null # 更可靠的做法:直接看网卡 MAC,挑正在用的那块 ip link show | grep -A1 "state UP"

hostname输出什么就填什么,别自作主张加域名后缀。hostid命令在有些发行版上返回的是别的东西,所以我更信 MAC 地址。ip link show那份输出里,state UP的那块网卡才是有效的,一台机器有 docker0、virbr0、多块物理网卡时,随手抄一个 MAC 上去,生成出来的 license 只能在本机用,换台机器立刻失效——这个坑我踩过不止一次。

2.4 先把授权边界说清楚

这套东西是给自己搭学习测试环境用的,工具版本、SCL 版本、feature 列表都得跟本机实际装的对应上,不要拿去接生产任务。多个版本共存时优先用与工具本体同期发布的 SCL,跨大版本混搭经常出现 feature 认不出、lmstat显示正常但工具拿不到的情况。真要在团队里长期用,走正式授权渠道,比自己维护一套生成流程省心得多。

3. 生成 Synopsys.dat:改 src、填参数、指路径

这一步是整个流程里唯一会产生"最终产物"的环节,Synopsys.dat生成出来之后,后面所有操作都是在这个文件上打补丁。所以三件事必须一次做对:Synopsys.src里的年份、生成器里填的三件套、生成后第二行的 DAEMON 路径。

3.1 Synopsys.src 里的年份:2004 换 2018

Synopsys.src是纯文本,每行大致是FEATURE 名称 + daemon 名 + 版本年份 + 授权类型 + hostid的结构,其中版本年份字段默认写的是2004。这个年份就是玄学所在:用 2004 生成出来的 license,有时候lmgrd起得来,有时候起不来,同一份文件重启一次服务结果都可能不一样。换成2018之后我这边基本没再出现过时好时坏的情况,这也是原始记录里明确提到的改动。

# 改之前先备份,出问题能马上回滚,这是后悔药 cp Synopsys.src Synopsys.src.bak # 只替换字段位上的 2004,带前导空格和点,避免误伤其他数字 sed -i 's/ 2004\./ 2018./g' Synopsys.src # 核对:改了多少行,还剩多少 2004 grep -c " 2018\." Synopsys.src grep -c " 2004\." Synopsys.src

sed -i是原地修改,所以第一步备份不能省。匹配串写成2004\.而不是裸的2004,是因为文件里可能还有别的含 2004 的字符串(比如某个 feature 名里带数字),带前导空格和点的模式能把范围收窄到版本字段。最后两条grep -c是自检:第一条应该等于 feature 行数,第二条应该是 0。如果第二条不为 0,说明有行格式和别人不一样,得手工挑出来改。

改完随手抽一行看看长什么样,确认替换落在正确位置:

grep -m 3 "^FEATURE" Synopsys.src

-m 3是只输出前三行,避免刷屏。正常输出里年份应该是2018.xx,如果看到2018跑到 feature 名中间去了,说明替换规则写宽了,回滚重来。

3.2 scl_keygen.exe 的填写:hostid / hostname / port / 过期时间

双击scl_keygen.exe,界面上要填的字段不多,但每一个填错都白干:

字段填什么从哪取常见错误
Hostid12 位 MAC,无冒号无横线ip link show里 state UP 那块抄了 docker0 或无线网卡
HostnameLinux 机器名,原样hostname输出手加了域名后缀、大小写不一致
Port默认 27000端口没被占用即可和别的 license 服务撞端口
Expire过期时间自行设定设太远或设成过去时间

过期时间这块我一般设一年左右,别图省事填个 2099。一方面填太远的日期在某些版本上反而触发校验异常,另一方面到期前重生成一次,正好把版本升级、feature 变更一起带进去,比攒着一次大改要稳。填完之后生成,产物就是Synopsys.dat。

有一点要提前说清楚:如果所需工具里带project_id,得回到Synopsys.src把里面的 PID 改成对应的值,再重新生成。这一步漏了,后面lmgrd日志里会出现 feature 找不到的报错,而且报错信息不会直接告诉你"PID 不对",只会说某个 feature 不存在,很容易误判成 src 缺行。

3.3 第 2 行 DAEMON:指向本地 snpslmd

生成出来的Synopsys.dat第二行是 daemon 声明,必须改成 Linux 上真实存在的snpslmd绝对路径,否则lmgrd启动时找不到守护进程,直接退出。

# 用 sed 直接改第二行,路径换成 2.1 里确认过的那个 sed -i '2s|.*|DAEMON snpslmd /usr/Synopsys/scl/2021.03/linux64/bin/snpslmd|' Synopsys.dat # 改完立刻回读确认 sed -n '1,3p' Synopsys.dat

2s|.*|...|的意思是锁定第 2 行、整行替换,用|当分隔符是因为路径里有/,用/当分隔符就得转义一堆。sed -n '1,3p'是把前三行打出来核对,正常应该看到第一行是 SERVER 声明(带 hostid 和端口),第二行是刚写进去的 DAEMON,第三行开始才是 FEATURE。如果第二行还是原来的内容,多半是行号错位了,有的生成器会在文件头多插一行注释,这时候先grep -n DAEMON Synopsys.dat定位真实行号再改。

4. fix.bat 与手工补 SIGN:让 lmgrd 认这份文件

Synopsys.dat生成出来还不能直接用,每行 FEATURE 结尾的地方需要补一段 SIGN 串,fix.bat就是干这个的。它跑成功了皆大欢喜,跑失败就得手工补,而手工补这一步是整篇流程里最容易翻车的地方——少一个空格,lmgrd就报语法错。

4.1 fix.bat 干了什么,什么时候会失败

fix.bat做的事情很固定:把每行结尾的) }替换成一段带SIGN="..."的长串,同时把第 7 行改成SN=RK:0:0:1 SIGN="..."的形式,输出一个新文件fix_Synopsys.dat。成功跑完,目录里会多出这个文件,直接拿走用就行。

它会失败的情况主要有三类:一是 Windows 上路径带中文或空格,批处理里的相对路径找不到文件;二是Synopsys.dat还没生成,或者生成在了别的目录;三是权限问题,某些目录下批处理写不进新文件。判断方法很简单——看目录里有没有fix_Synopsys.dat这个文件,没有就是没成功,别管命令行窗口一闪而过显示了什么。

4.2 手动替换的正确写法与空格坑

fix.bat不成功就手工改,规则照原始记录:把Synopsys.dat里所有的) }替换成SIGN="0000 ... DDDD") }的形式,再把第 7 行改成SN=RK:0:0:1 SIGN="0000 ... DDDD"。原始记录里第 7 行本来就没有) },所以是直接追加,不是替换。手工一行行改几十上百行不现实,用脚本处理更稳:

# 逐行处理 license 文件:给每行补 SIGN 尾串,单独处理第 7 行的 SN SIGN_STR = ('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"') with open("Synopsys.dat", "r", encoding="utf-8", errors="ignore") as f: lines = f.read().splitlines() out = [] for i, line in enumerate(lines, start=1): if i == 7: # 第 7 行单独处理:前置一个空格再接 SN,原行没有 ) } out.append("SN=RK:0:0:1 " + SIGN_STR) elif line.rstrip().endswith(") }"): # 其余行:去掉结尾的 ) },接一个空格 + SIGN,再把 ) } 补回去 out.append(line.rstrip()[:-3] + " " + SIGN_STR + ") }") else: out.append(line) with open("fix_Synopsys.dat", "w", encoding="utf-8", newline="\n") as f: f.write("\n".join(out) + "\n")

这段脚本的逻辑是逐行判断:行号等于 7 就整行重写成SN=RK:0:0:1加 SIGN;其他行先判断结尾是不是) },是的话切掉这三个字符,插入一个空格再拼 SIGN,最后把) }补回来;不匹配的行原样保留。三个细节决定成败——rstrip()先去尾部空白,防止原文件带了\r导致判断失败;插入时前后各留一个空格,SIGN 前面没空格是解析报错的头号原因;写文件时newline="\n"强制 LF,因为这份文件最终要在 Linux 上用,Windows 的 CRLF 偶尔会让lmgrd在行尾解析上出岔子。

改完抽几行核对,重点看 SIGN 前面有没有空格、结尾的) }还在不在:

sed -n '7p' fix_Synopsys.dat grep -c 'SIGN="0000' fix_Synopsys.dat grep -c ') }' fix_Synopsys.dat

第一条单独看第 7 行的形态;后两条数一下带 SIGN 的行数和结尾) }的行数,两者应该基本对得上(第 7 行除外)。数字差太多说明有行的结尾格式不统一,回去手工找出来补。

4.3 拷到 Linux 并首次启动 lmgrd

文件改好之后拷到 Linux,放在一个固定目录里,别散落在 home 下。我一般用/opt/synlic:

# 建目录、放文件、给读权限,license 文件不需要可执行位 mkdir -p /opt/synlic cp fix_Synopsys.dat /opt/synlic/ chmod 644 /opt/synlic/fix_Synopsys.dat # 前台启动,-c 指定 license,-l 指定日志;先别加 -2 -p,出问题好看输出 /usr/Synopsys/scl/2021.03/linux64/bin/lmgrd \ -c /opt/synlic/fix_Synopsys.dat \ -l /opt/synlic/lmgrd.log

-c是 license 文件路径,-l是日志路径,这两个参数必须写绝对路径,相对路径在切用户或者开机自启时经常找不到。第一次启动建议前台跑,眼看着它把LICENSE服务拉起来、打印UP再按 Ctrl+C 停掉,确认没问题之后再考虑后台常驻和开机自启。

停服务用lmdown,别直接kill:

# 优雅关闭,让 lmgrd 把状态写回文件 /usr/Synopsys/scl/2021.03/linux64/bin/lmdown -c /opt/synlic/fix_Synopsys.dat

直接kill -9有时候会留下锁文件,下次启动报端口占用或者Failed to initialize,还得手工去清。

5. 避坑:lmgrd 起不来、feature 找不到的排查清单

这一章全是我自己踩过或者帮别人救过的场景,按「现象 → 原因 → 解决」写。真出问题时别急着重新生成,先看日志——lmgrd.log和Synopsys.dat.log两个都要看,前者记录服务本身启停,后者记录 feature 级别的请求,光看一个经常得出错误结论。

5.1 现象:日志里报某个 feature 找不到

现象是lmgrd起来了,lmstat也能连上,但一用工具就报某个 feature 不可用,日志里出现Unable to find feature或者Invalid feature name。原因通常是Synopsys.src里根本没有这一行,生成器只按 src 里有的 feature 产出,工具要的它没写,自然就找不到;另一种情况是工具带project_id,而 src 里的 PID 没跟着改,feature 名字对得上但校验不过。

解决方法是回Synopsys.src补行。先确认工具到底要哪个 feature,再照着已有行的格式加一行,年份字段跟其他行保持一致(也就是 3.1 里改成 2018 的那个),保存后回到第 3.2 步重新生成Synopsys.dat,再走一遍 3.3 和第四章的补 SIGN 流程。注意是重生成,不是直接在Synopsys.dat上手动加行——手工加的行没有 SIGN 串,lmgrd一样不认。PID 的问题更隐蔽,改完 PID 必须重新生成,改完现有 lic 文件无效。

5.2 现象:换台机器就失效,或者提示 hostid 不对

现象是同一份fix_Synopsys.dat在这台机器上正常,拷到另一台立刻报Invalid hostid或Wrong host。原因几乎都是生成时 hostid 取错了:取了 docker0、virbr0 或者无线网卡的 MAC,而不是state UP的那块物理网卡;还有一种是用笔记本生成后换了网络环境,MAC 变了。

解决办法就一个:在目标机器上重新取 MAC,重新生成。不要试图在 lic 文件里手工改 hostid 字符串,改了之后 SIGN 串就跟内容不匹配,校验直接失败。顺带提醒,容器里跑这套东西要格外小心,容器重启后 MAC 和 hostname 都可能变,license 立刻失效,最好把容器网络固定住。

5.3 现象:端口占用、启动即退出

现象是lmgrd一启动就退出,日志尾部写着Address already in use或者Failed to bind。原因是 27000 端口被别的 license 服务占了,或者上一次次启动没关干净,进程还在。

排查顺序是先看谁占着端口,再决定是换端口还是杀进程:

# 看 27000 端口被谁占了 ss -lntp | grep 27000 # 看有没有残留的 lmgrd / snpslmd 进程 ps -ef | grep -E "lmgrd|snpslmd" | grep -v grep

ss -lntp里-l是监听态、-n数字显示端口、-tTCP、-p显示进程,输出会直接告诉你进程名和 PID。如果是别的 license 服务占着,最省事的做法是换端口——生成时 Port 填 27001,整个流程重走一遍,比去协调别人的服务快得多。如果是自己的残留进程,先lmdown,不行再kill掉,然后清掉目录里的.lic锁文件再启动。

5.4 现象:license 时好时坏,重启一次结果就变

现象最邪门:同一份文件、同一台机器,这次lmgrd起得来工具能用,下次重启就报 license 无效,日志里也没什么明确的错误。原因基本可以锁定在Synopsys.src的年份字段还留着 2004——这个版本在部分 SCL 上校验路径不稳定,表现出来就是随机失败。

解决方法是按 3.1 把年份统一改成 2018,重新生成、重新补 SIGN、重新部署,一整套走完。改完如果还偶发失败,去核对签名串的长度和格式是不是每行都一致,有的行被手工改过、SIGN 长度和别人不一样,也会出现这种间歇性异常。

5.5 现象:解析直接报语法错,服务根本起不来

现象是lmgrd连启动阶段都过不去,日志里一行Syntax error或者Invalid license file。原因九成是 4.2 里的空格问题:SIGN 前面少了一个空格,或者SN=RK:0:0:1和 SIGN 之间粘连了,或者结尾的) }被脚本吃掉了没补回来。

解决办法是拿一份确认能用的文件做对照,逐行 diff:

# 对比两份文件的差异,只看前 20 行 diff <(sed -n '1,20p' fix_Synopsys.dat) <(sed -n '1,20p' good_Synopsys.dat)

看到差异集中在行尾,就是空格和括号的问题,回 4.2 的脚本重新跑一遍,别手工一行行修。跑完再用sed -n '7p'单独确认第 7 行的形态。

6. 验证:三条命令确认 license 真的活着

装完不算完,能验证跑通才算。我验证这套东西的习惯是三步:先看服务在不在,再看 feature 有没有被认到,最后起一个真工具打一次请求。三步都过,这份 license 才算落地。

6.1 lmstat 看服务与 feature 状态

lmstat是最直接的体检工具,服务起来之后立刻跑一次:

# -a 看全部,-c 指定同一份 license 文件 /usr/Synopsys/scl/2021.03/linux64/bin/lmstat \ -c /opt/synlic/fix_Synopsys.dat -a

输出里先看头部有没有License server UP,这是服务层通了;再往下逐个 feature 看状态,正常是Users of xxx: (Total of N licenses issued; Total of 0 licenses in use)。如果某个 feature 显示cannot find或者压根没出现在列表里,回到 5.1 补 src 重生成。这里的-c必须和lmgrd启动时用的是同一个文件,指向不同文件会得到完全不同的结果。

6.2 起一个真工具打一次请求

lmstat通过不代表工具能用,得让工具自己发一次请求。随便起一个依赖 license 的命令行工具,看它加载时有没有打印 license 获取成功,或者干脆等它进到交互提示符。这一步的目的是验证 hostname、端口、feature 三者在真实请求路径上都对得上——lmstat走的是本地文件读取,工具走的是网络请求,两条路径的校验点不完全一样。

同时盯一下Synopsys.dat.log,工具发起请求的瞬间这里会多出几行记录,能看到请求了哪个 feature、授权给了哪个用户、用了多少。有这几行记录,说明整条链路是通的。

6.3 结果对照表

把常见输出和结论对一下,省得每次都要猜:

现象大概率原因下一步
lmstat报连不上服务lmgrd没起或端口不对看lmgrd.log,核对端口
服务 UP 但 feature 列表为空Synopsys.dat里的 feature 行没被解析查 SIGN 和) }
feature 在列表但工具拿不到PID 不匹配或 hostname 不一致改 src 里 PID 重生成
工具报 hostid 不对生成时 MAC 取错目标机重新取 MAC 重生成
隔天用不了过期时间到了或机器重启后服务没起检查过期字段与自启配置

这套流程我从第一次照着别人的笔记瞎改,到现在固定成"先确认 SCL 版本 → 备份 src → 改年份 → 取 MAC → 生成 → 补 SIGN → 前台起一次 → lmstat 验 → 工具验"的顺序,中间任何一步跳过都会在后面某个环节找回来。从那以后我每次动 license 文件之前都强制先cp一份带日期的备份,改完先前台跑一遍再考虑常驻——这个习惯救过我至少三次。整个包就在网盘分享的ocad.tar.gz里,解压出来按上面的顺序走一遍就行,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询