简介面向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.srclicense 模板含 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_FILE27000eda-node01 # 或者用 LM_LICENSE_FILE多个源用冒号分隔 export LM_LICENSE_FILE27000eda-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-port27000/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 \ SIGN0000 1111 2222 3333 4444 5555 # 第四段INCREMENT 行增量授权格式类似 FEATURE INCREMENT VCSRuntime snpslmd 2018.03 31-dec-2030 5 \ SIGN0000 1111 2222 3333 4444 5555FEATURE的字段顺序是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 与 SNfix.bat干的事情很简单把Synopsys.dat里所有) }结尾的行替换成带SIGN...的形式再给第 7 行补上SNRK: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 \ 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) } # 第 7 行单独处理本来没有 ) }直接补 SNRK:0:0:1 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行数一多手工改不现实写个脚本批量处理更稳妥#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 把 Synopsys.dat 里所有 ) } 结尾的行补上 SIGN 段并处理第 7 行的 SN import re import sys SIGN (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) 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, encodingutf-8, errorsignore) as f: lines f.readlines() out [fix_line(l) for l in lines] # 第 7 行下标 6补 SN如果已经带了 SN 就跳过 idx 6 if idx len(out) and SNRK:0:0:1 not in out[idx]: out[idx] SNRK:0:0:1 SIGN \n with open(path, w, encodingutf-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 27000eda-node01lmstat输出里能看到每个 feature 的总数、已用、以及是哪个用户哪个进程占着。如果某个 feature 显示Total of 0 licenses或者压根不出现说明 license 文件里没有这一行回第 3 章补 src。服务起来但工具连不上先看客户端的环境变量是不是指向了正确的porthost。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 foundsrc 里少了一行或 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 pid5.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] DescriptionSynopsys License Server (learning lab only) Afternetwork-online.target Wantsnetwork-online.target [Service] Typeforking Userlicadmin 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 Restarton-failure RestartSec10 [Install] WantedBymulti-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 能起来四步全过才算配好。几个参数值得记住为什么这么设Typeforking是因为 lmgrd 自己会 fork 到后台不这么写 systemd 会以为进程退了Afternetwork-online.target保证端口绑定前网络已就绪RestartSec10给端口释放留缓冲设太短会出现重启时端口还在 TIME_WAIT 的翻车。注意这份配置只用于课程实验和学习验证环境。真到生产或商业项目license 必须走正规授权工具厂商的授权管理有审计手段省这一步的代价远高于省下来的成本。我现在的习惯是任何一台新机器配完 license先跑一遍precheck.sh再手工lmstat -a确认 feature 数量和工具要求对得上最后才敢开图形界面。这个顺序是被Feature not found折腾到半夜之后定下来的——日志一行行翻太慢把检查前置成脚本出问题第一秒就知道卡在哪。希望帮到你。本文还有配套的精品资源点击获取