Synopsys license生成、lmgrd启动与故障排查实战
简介面向 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.exeLinux 侧改 DAEMON 路径、用lmgrd -c起服务。定位是仅限学习使用的自建测试环境正式商用请走厂商授权。下面按我实际装过的顺序走一遍版本差异和翻车点都写进去。2. 环境准备Windows 出文件Linux 跑服务这套流程最容易被忽略的一点是生成和运行不在同一台机器上甚至不在同一个操作系统上。Windows 只负责把Synopsys.dat造出来Linux 只负责把它挂成服务。两边的版本、路径、主机标识必须对得上否则生成出来的文件在 Linux 上就是一张废纸。2.1 两端各装什么、版本怎么对先把两端的分工列清楚我一般会照下面这张表逐项核对缺一项就别往下走位置需要的东西从哪来关键点Windows解包工具系统自带 tar 或 7-Zipocad.tar.gz是 tar 包不是 zipWindowssynlic.gen目录解包后自动出现内有scl_keygen.exe、Synopsys.src、fix.batWindows文本编辑器记事本、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 UPhostname输出什么就填什么别自作主张加域名后缀。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 换 2018Synopsys.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.srcsed -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.dat2s|.*|...|的意思是锁定第 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 行改成SNRK:0:0:1 SIGN...的形式输出一个新文件fix_Synopsys.dat。成功跑完目录里会多出这个文件直接拿走用就行。它会失败的情况主要有三类一是 Windows 上路径带中文或空格批处理里的相对路径找不到文件二是Synopsys.dat还没生成或者生成在了别的目录三是权限问题某些目录下批处理写不进新文件。判断方法很简单——看目录里有没有fix_Synopsys.dat这个文件没有就是没成功别管命令行窗口一闪而过显示了什么。4.2 手动替换的正确写法与空格坑fix.bat不成功就手工改规则照原始记录把Synopsys.dat里所有的) }替换成SIGN0000 ... DDDD) }的形式再把第 7 行改成SNRK:0:0:1 SIGN0000 ... DDDD。原始记录里第 7 行本来就没有) }所以是直接追加不是替换。手工一行行改几十上百行不现实用脚本处理更稳# 逐行处理 license 文件给每行补 SIGN 尾串单独处理第 7 行的 SN SIGN_STR (SIGN0000 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, encodingutf-8, errorsignore) as f: lines f.read().splitlines() out [] for i, line in enumerate(lines, start1): if i 7: # 第 7 行单独处理前置一个空格再接 SN原行没有 ) } out.append(SNRK: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, encodingutf-8, newline\n) as f: f.write(\n.join(out) \n)这段脚本的逻辑是逐行判断行号等于 7 就整行重写成SNRK:0:0:1加 SIGN其他行先判断结尾是不是) }是的话切掉这三个字符插入一个空格再拼 SIGN最后把) }补回来不匹配的行原样保留。三个细节决定成败——rstrip()先去尾部空白防止原文件带了\r导致判断失败插入时前后各留一个空格SIGN 前面没空格是解析报错的头号原因写文件时newline\n强制 LF因为这份文件最终要在 Linux 上用Windows 的 CRLF 偶尔会让lmgrd在行尾解析上出岔子。改完抽几行核对重点看 SIGN 前面有没有空格、结尾的) }还在不在sed -n 7p fix_Synopsys.dat grep -c SIGN0000 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再按 CtrlC 停掉确认没问题之后再考虑后台常驻和开机自启。停服务用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 grepss -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 前面少了一个空格或者SNRK: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里解压出来按上面的顺序走一遍就行希望帮到你。本文还有配套的精品资源点击获取