ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Synopsys工具License配置与故障排查完整指南

Synopsys工具License配置与故障排查完整指南

简介:这份关于Synopsys工具license管理的资料,面向需要配置或修复license的EDA工具使用者,以文档形式梳理了从文件获取、格式调整到特征添加与参数修改的完整流程,并强调仅供学习使用。包内为单个docx说明文档,约269KB,浓缩了关键操作要点,适合已有一定工具使用基础、希望自主排查license问题的学习者。目前已有581人学习下载。内容针对Windows下生成、Linux下使用的方式展开,涵盖用scl_keygen.exe生成Synopsys.dat、修改时间戳避免过期、添加snpslmd本地路径、执行fix.bat添加签名等核心环节;同时给出lmgrd报错时回补feature、修正project_id等排错思路,可帮助读者减少试错成本,快速形成可用的测试license。

1. 为什么 Synopsys 工具的授权配置能卡住一整个项目组

做数字前端或后端的人几乎都遇到过这种场景:项目组新来了同事,环境变量明明照着前辈的.bashrc抄了,启动 VCS 或 Design Compiler 时却弹出一行Invalid license,然后整组人开始围着lmstat和 license 文件排查。Synopsys 工具链的 license 一直是个“黑匣子”,不像开源工具那样环境变量配好就完事,它涉及 license server 的启动、hostid 绑定、feature 的 checkout 与归还、甚至新旧版本工具的兼容性。这篇内容围绕“synopsys工具license资源”这个方向,把从拿到授权文件到最终稳定跑通的完整路径讲清楚,包括配置方法、参数取舍和常见的翻车点,适合正在搭建 EDA 环境或接管 license 维护的工程师参考。

2. 先搞懂 license 资源在 Synopsys 工具链里的三层结构

2.1 一层是授权文件本身:license.dat 里到底写了什么

拿到任何一套 Synopsys 授权资源,第一件事不是配环境变量,而是先拆开看文件结构。一个标准的 license 文件通常由两块组成:一块是SERVER和DAEMON开头的服务端描述,另一块是若干个FEATURE开头的功能授权条目。SERVER行决定这台机器能不能作为 license server,DAEMON行指向 Synopsys 专用的 vendor daemon(通常是snpslmd),而每条FEATURE则对应一个工具或一个模块的可用时长、可用数量、绑定网卡地址。很多人只把FEATURE行当成全部,忽略了SERVER行与系统 hostid 的绑定关系。后者的校验一旦失败,后面所有 feature 都不会被解析。

拿到文件后建议先做一次静态清理。由于 license 文件会通过邮件、压缩包或者截图文字识别的方式流转,最常见的坑是行尾换行符被改变、引号被替换成全角字符、或者粘贴过程把SERVER行截断了。我一般会用file命令确认文本格式,再用head -n 20看前 20 行结构是否完整。常见做法是先把文件转成 Unix 换行符再放到服务器上,而不是直接在 Windows 编辑器里另存为默认格式。如果看到Invalid license file的提示但关键词没有被系统日志记录,大概率就是文件格式出了问题。

file license.dat head -n 20 license.dat dos2unix license.dat awk '{ if (NF > 10) print NR ": " $0 }' license.dat | head

第一行file用于确认编码和换行方式,第二行看授权文件的前 20 行结构是否包含完整的SERVER、DAEMON和首条FEATURE。第三行dos2unix解决 Windows 换行导致的解析失败,这是出现频率最高的低级错误。最后一行awk的作用是检查是否存在异常超长行,通常 FEATURE 行内部会被截断或合并,超长行往往是内容损坏的信号。静态检查不通过时,后续所有配置都没有意义。

2.2 二层是服务进程:lmgrd 与 snpslmd 各自承担什么职责

Synopsys 的授权服务不是单一进程,而是父子两层。lmgrd是 FlexNet 的通用守护进程,负责读取 license 文件、启动 vendor daemon、维护端口通信;snpslmd是 Synopsys 自己的 vendor daemon,负责具体 feature 的 checkout、check-in 和过期判断。这两个进程缺一个都不行。很多人只启动了lmgrd就以为服务起来了,结果lmstat -a显示snpslmd是 down 的状态,所有工具依然抓不到授权。

启动时需要关注lmgrd的-c参数指向哪个 license 文件、-l参数写日志到哪里。日志文件比终端输出重要得多,因为 EDA 工具查 license 时在客户端看不到的原因最后都要回到 server 日志里找。另外,端口选择也有讲究。license 文件里的SERVER行会写死一个端口号,如果这个端口被防火墙挡了或者被其他进程占用了,客户端就会出现Cannot connect to license server。常见做法是把端口固定下来而不是用默认的 27000,方便防火墙放行。比如在SERVER行指定27001,然后启动时通过-lm参数确保 lmgrd 通知 snpslmd 也走这个端口段。

lmgrd -c /opt/synopsys/license/license.dat -l /var/log/synopsys/license.log lmstat -a -c 27001@localhost tail -n 100 /var/log/synopsys/license.log

lmgrd启动命令里-l指定日志路径是必须的,否则启动会在前台挂住。第二条lmstat是验证服务是否可用的最直接手段,27001@localhost里的27001必须和SERVER行写死的端口一致。第三种tail看日志是排查问题的标准动作,服务启动失败时日志里会直接写出是 hostid 不匹配还是端口冲突。注意lmstat的返回值,如果一瞬间返回不能说明授权可用,要看到 feature 列表正常打印才算真正起来。

2.3 三层是环境变量:客户端如何找到 license 资源

服务端把 license 服务跑起来之后,客户端的配置同样有讲究。Synopsys 工具查找授权的路径有两个关键变量:SNPSLMD_LICENSE_FILE和LM_LICENSE_FILE。前者是 Synopsys 工具专用,后者是 FlexNet 全体系通用,但 Synopsys 的工具在部分版本里只读前者,把只看LM_LICENSE_FILE当成习惯的人会在混合使用第三方 IP 授权时误判故障原因。常见做法是两个变量都设置,且SNPSLMD_LICENSE_FILE优先指向 Synopsys 的 server,LM_LICENSE_FILE指向第三方 vendor daemon 的 server 时要注意格式冲突。

环境变量不仅可以写27001@hostname这种 server 指向形式,也可以直接指向本地的 license 文件。对于没有任何浮动授权、只有节点锁定授权的工作机,SNPSLMD_LICENSE_FILE写 license 文件路径反而比写端口更稳。对于浮动授权,建议写端口和主机名而不是 IP,因为有些工具在解析时会反查主机名,直接写 IP 会造成 hostname 不匹配。还有一个很容易忽略的点是license.dat与synopsys.dat的区分,一些定制化的授权文件会把 feature 拆到多个文件里,这时要在 license 文件里用INCREMENT配合VENDOR行的多个 daemon 来管理,而不是试图把所有内容并进一个文件。

export SNPSLMD_LICENSE_FILE=27001@license-server export LM_LICENSE_FILE=27001@license-server echo $SNPSLMD_LICENSE_FILE

三条命令分别完成设置、备用设置和验证。注意echo时如果输出为空,说明当前 shell 没有继承到环境变量,要检查.bashrc是否真的在登录 shell 中被 source 了。不要去修改系统级的/etc/profile.d里的变量指向来覆盖用户级设置,否则后面换了 license server 很难排查为什么工具还是连到旧机器。

3. 落地一步:把一套 Synopsys 授权资源在本地跑通的最小步骤

3.1 规划目录、用户和自启动脚本

把 license 资源真正用起来之前,先规划好目录布局和运行用户。常见做法是把 license 文件和启动脚本统一放到/opt/synopsys/license下,不要散落在各工具目录中。文件布局上我习惯维护三个文件:原始授权的license.dat、用于备份的license_$(date +%Y%m%d).bak、以及包装启动和停止逻辑的license_ctl.sh。做一个单独的license系统用户来跑服务,能避免 root 启动带来的权限风险,也能防止误改其它 EDA 工具的环境变量。

自启动脚本要考虑重启场景。服务器一旦重启,license 服务不会自动恢复,每次手动lmgrd启动容易漏掉日志路径参数。常见的做法是写一个包含了 start、stop、status 三个子命令的脚本,把lmgrd的启停参数固定在里面。针对 license 服务,stop动作不能直接 kill 掉lmgrd主进程就结束,要先把snpslmd正确处理掉,否则下次启动时端口未必能被立即释放。脚本里用lmutil lmdown是比kill更优雅的方式,它会告知所有客户端退出并释放当前占用的授权。

下面的脚本是一个在实际环境里跑过的模板,重点在参数固定化和状态输出。第一遍跑的时候建议加-debug参数观察输出,方便回滚问题。

#!/bin/bash export LM_LICENSE_FILE=/opt/synopsys/license/license.dat export SNPSLMD_LICENSE_FILE=$LM_LICENSE_FILE LICENSE_LOG=/var/log/synopsys/license.log LMGRD=/opt/synopsys/bin/lmgrd VENDOR=/opt/synopsys/bin/snpslmd case "$1" in start) $LMGRD -c $LM_LICENSE_FILE -l $LICENSE_LOG sleep 2 lmstat -a ;; stop) lmutil lmdown -c $LM_LICENSE_FILE -q ;; status) lmstat -a -c $LM_LICENSE_FILE ;; *) echo "Usage: $0 {start|stop|status}" ;; esac

脚本里LMGRD和VENDOR的路径要替换成实际安装位置。snpslmd在这里虽然没有被直接调用,但 lmgrd 在启动时读取 license 文件里的DAEMON snpslmd行就会去指定路径找它,路径不对时授权服务依然无法启动。lmutil lmdown对 Synopsys 的授权进程是安全的,因为 flexnet 的 daemon 设计时已经实现了优雅退出,不会导致 feature 计数残留。

3.2 验证授权文件绑定:hostid 和 server hostname 的坑

Synopsys 的浮动授权文件里SERVER行的第三列是网卡 MAC 地址(某些新版本也接受 hostid 的混合格式),启动时 lmgrd 会把这台机器的实际 MAC 和该字段逐位比对,不一致直接拒绝启动。“我用 ifconfig 看到的 MAC 和文件里写的一样但启动还是失败”是常见求助帖,往往是机器有多块网卡,lmgrd 取的是第一块,而用户比对的是另一块。另一个坑是 server 的 hostname 解析问题。SERVER行通常写的是主机名而不是 IP,如果/etc/hosts里主机名被解析到127.0.0.1,客户端连不上是必然的。要确保hostname命令的输出和SERVER行的字段完全一致,并且该名字能够被解析到一个合法的内网 IP。

如果你一开始拿到的授权文件里SERVER行写的主机名是老机器的机器名,拿到新服务器上用的时候必须同步修改/etc/hosts或把新的机器重命名成老名字。这属于“玄学”问题里最典型的场景——license 文件在旧机器上明明跑得好,但换机器后 lmgrd 启动失败。排查路径先说结论:先看日志,日志中出现Machine hostid mismatch时去对 MAC,出现hostname not found时去改/etc/hosts。

hostname ip link show | grep ether awk '/^SERVER/{print}' /opt/synopsys/license/license.dat cat /etc/hosts | grep $(hostname)

hostname的第一行输出要和/etc/hosts里配置的名字对上。ip link输出中ether后的值是用来和SERVER行第三列做比对的。awk单独抽出SERVER行便于复制比对,不污染屏幕。最后一条grep用于确认主机名解析不是指向 127.0.0.1。每一条都指向最直接的问题,不要在网卡绑定问题上反复重启服务。

3.3 客户端侧最容易被忽略的 .bashrc 细节

服务端一切正常,但新开的终端里跑vcs依旧拿不到许可,这是另一类高频问题。原因通常是环境变量写在了某个只被执行一次的脚本里,或者当前 shell 是非交互模式。Synopsys 工具通常通过 shell 判断环境变量,非登录 shell 不读.bash_profile而读.bashrc是很常见的差异。如果公司统一走 LDAP 或集中式用户环境,还可能因为 profile 脚本的加载顺序导致变量被后置覆盖。

这个地方建议在.bashrc里用一个显式的判断块,把 Synopsys 相关变量做一个分组。不要用export连带别名和路径设置一锅炖,因为后面新增工具时你根本不知道是该改这个文件还是改工具自带的脚本。另外,部分独立运行的 Synopsys 软件不能完全信任.bashrc,比如一些 GUI 工具从桌面环境启动时不会继承 shell 变量,这时要单独写一个 wrapper 脚本在启动前设置环境变量。

# in ~/.bashrc if [ -f /opt/synopsys/synopsys.sh ]; then source /opt/synopsys/synopsys.sh fi

这个片段是推荐的做法:把 Synopsys 相关的环境变量集中放到/opt/synopsys/synopsys.sh,.bashrc只负责加载。好处是之后修改授权指向时只需改一个文件,不会污染用户级配置。synopsys.sh里写的SNPSLMD_LICENSE_FILE指向哪个 server,所有新终端就会继承哪个 server。写完脚本后用bash -lc 'echo $SNPSLMD_LICENSE_FILE'验证是否与预期一致,避免在交互环境看起来配好、实际非交互任务却拿不到环境变量。

4. 授权资源的常见故障排查:从日志关键字到边界场景

4.1 日志里出现Feature expired但不一定是时间过期

Feature expired是 license 问题里最具迷惑性的错误之一。很多工程师看到 expired 第一反应是去检查系统日期,但更常见的原因是 feature 的版本号低于工具需要的版本。Synopsys 的工具发布后通常会要求 license 里的 feature 的版本大于等于某个值,如果旧版本的授权文件里写的是FEATURE VCS v2019.10,而新装工具是 2023 版本,checkout 时会直接报过期。这种现象会让新手误判为时间问题,反复校准系统时间而毫无改善。

另一种可能是在使用浮动 license 时,某些 feature 的授权数量是 0。数量为 0 的 feature 不代表不可用,有的代表“此模块不授权”,有的代表“需要从外部 token 兑换”,对应的报错也会贴在 feature 条目之后。处理方式很直接:看日志里的EXPIRED字段前面的日期与VERSION字段,而不是凭印象判断。日期确实没到但依然报 expired,就把重点转向版本兼容性。

4.2 checkout 报Cannot connect to license server:先把端口段搞清楚

Cannot connect to license server是网络层的失败,但根源往往不是网络,而是端口配置不一致。Synopsys 浮动授权常用的端口范围包括SERVER行的主端口和 vendor daemon 自己监听的第二个端口。很多 license 文件里SERVER行只写了一个端口,但 lmgrd 会额外分配一个端口给 snpslmd 使用。如果防火墙只放行了SERVER行里的那个端口,客户端连上 lmgrd 后获取 snpslmd 端口时依然会被防火墙拦截,导致连接失败。这个问题在跨网段、跨防火墙的环境中尤其常见。

常见做法是强制 snpslmd 和 lmgrd 使用同一个端口或连续端口段。lmgrd 的参数-lm可以指定 snpslmd 监听的端口,例如-lm 27002,或者在 license 文件里通过VENDOR snpslmd行末尾的port=27002来固定。这样防火墙规则就只需要开两个固定端口,而不需要动态放行一段范围。排查时用lmstat -a看 snpslmd 对应的端口号,再回去比对防火墙策略,不要在抓包上浪费时间。

ss -lntp | grep lmgrd ss -lntp | grep snpslmd

ss的两条命令分别查看 lmgrd 和 snpslmd 当前监听的端口。实际排查时经常会看到 snpslmd 绑定了一个和 license 文件里完全不同的随机端口,这就是连接失败的根源。比较理想的收敛结果是两个进程分别监听固定的静态端口。通过这两条命令能确认端口是否符合防火墙放行预期。

4.3 新版本工具指向旧授权:版本号不匹配的三种表现

Synopsys 的工具迭代节奏很快,新版本工具往往要求更新的 license feature 支持。如果资源只有旧版本的 license,可能出现三种典型表现。第一种是启动时直接报Invalid feature;第二种是工具能启动但在跑特定流程时报Feature not licensed;第三种是界面能打开但综合或仿真时立即退出。三种表现的原因可能是同一件事:授权文件里缺少新 feature 或者在老 feature 上被设置为不支持。

遇到这种问题,第一选择不是立刻找新授权,而是先确认当前工具需要的是哪些 feature。Synopsys 的工具在启动时通常会在控制台打印出它试图 checkout 的 feature 名称和版本,看到类似Checking out feature: DesignCompiler的输出,比对 license 文件里有没有对应条目。另一种做法是用lmstat -a查看 license server 上所有可用的 feature 列表,用 grep 提取工具名,确认缺失的具体条目,再决定是申请新增 feature 还是降级工具版本。新版本工具指向旧授权时,不要尝试去修改 FEATURE 行里的版本号来“绕过检查”,那只会导致启动后段错误或invalid license的随机崩溃,而且这类修改后的文件在重新部署时会把环境搞得更不可维护。

4.4 多套授权资源合并的冲突与优先级

项目组通常不会只有一套 Synopsys license。公司买了一套数字实现工具的授权,部门又另有一套验证工具的授权,第三套可能是第三方 IP 核的 FlexNet 授权。把所有资源合并到一个 license 文件的做法需要非常谨慎。SERVER行在同一个文件里只能出现一次,多套 license 合并时如果各自有不同 server 行,必须在同一个文件里用VENDOR和DAEMON行组织好,否则后读的SERVER行会覆盖先读的,导致整个文件失效。

更稳妥的做法是分开配置多个 server,通过客户端环境变量同时指定多个port@host,用冒号分隔。例如SNPSLMD_LICENSE_FILE=27001@lic1:27002@lic2。这样做的好处是互不干扰,缺点是一旦某个 server 挂了,工具在尝试连接时会按顺序逐个尝试,前面的超时会影响整体启动速度。优先级控制也需要经验:把 Synopsys 自家授权写在前、第三方写在后,可以避免第三方 daemon 抢占式阻塞。不要把所有授权都塞进一个 license 文件去追求“统一”,统一维护的代价是排错范围变大,出问题更难定位。

5. 用 lmstat 和 feature 粒度把握授权资源的使用状态

5.1 做一个 30 秒的 license 健康检查

做 EDA 环境维护的人,最需要练就的能力不是启动 license,而是在工具报错时能 30 秒内判断问题是出在授权链路还是出在工具本身。掌握lmstat的常用参数就是一个可靠路径。lmstat -a能输出 server 状态、vendor daemon 状态、feature 列表、当前用户占用情况,但输出很长,用的时候要配合 grep 切片,避免在一屏刷不完的信息里迷失。

我自己习惯用一个简短的检查脚本,把核心信息过滤出来:license server 是否 up、snpslmd 是否 up、目标 feature 是否 available、当前是否有用户 checkout。检查脚本只需要几行命令,但它能把 30 秒的排查压缩成一眼判断。这个脚本不要放在 interactive shell 里频繁手动敲,而是写好后放到 cron 里定期执行,或者在出问题时第一时间跑一次。

lmstat -a -c 27001@license-server 2>/dev/null | grep -E "License server status|vendor daemon status|feature|Users" lmstat -a -c 27001@license-server 2>/dev/null | grep -c "UNCASED"

第一行把 server 和 daemon 的状态以及 feature 和用户占用情况一次性过滤出来。第二行的grep -c用于统计一个临时 feature 的 available 数量,UNCASED是某个测试用 feature 名,实际使用时应换成目标 feature 名。这个技巧对验证授权文件里数量字段是否有误很有用,比如授权数量显示为 0 但明明文件里写的是 10,那就要怀疑是不是 vendor daemon 解析时出了问题。

5.2 feature 粒度观察:哪些工具在真正常用授权

维护 license 资源不能只看服务起没起来,还要看授权使用率。lmstat -a的用户列表会显示谁 checkout 了哪个 feature、从哪个客户端来的。通过定期采集这些数据,能知道项目组里哪些工具被高频使用、哪些 feature 的数量不足、哪些 feature 常年闲置。这些统计对于向公司申请扩容比口头描述“我们 license 不够用”有说服力得多。

用命令行做统计比写完整监控系统轻量。假设目标 feature 是VCS,先确认当前被 check out 的数量,再用awk提取 user 字段排序,就能得到一张临时的占用排行。不需要引入额外的监控工具,维护一台服务器时这种脚本足够用。如果项目组规模变大、需要历史趋势,再考虑部署完整的监控服务。不要一开始就把统计做成复杂系统,否则维护成本比 license 本身问题还高。

5.3 许可证资源投入的建议:先评估再跟厂商谈

聊到 license 资源,最终绕不开的是成本问题。EDA 工具的授权采购通常不便宜,但盲目压缩预算导致核心工程师等 license 的损失更大。如果发现高频 feature 常年耗尽,而冷门 feature 几乎没人用,可以考虑两类调整:一是把闲置 feature 的授权数量转投到高频模块上,二是推动项目组错峰运行。把授权资源和项目排期结合,而不是简单加预算,往往是更实际的切入方式。

验证一套授权资源是否够用,除了人工观察,也可以利用工具自带的 log 分析。Synopsys 的 license 日志只要开启时间戳记录,就能通过awk统计每个 feature 的峰值占用。自己先做一轮数据摸底再去谈采购,能避免被供应商的初始报价带偏。总之,维护 Synopsys 授权资源的核心不是“能启动”,而是“够用、稳定、可排查”,这也是这一节最想传达的判断标准。最后说一个我自己的习惯:每次改完 license 配置,我都先跑一遍lmstat -a并把输出存一份带日期的快照,出问题时用 diff 对比当前状态和上次正常状态,往往一眼就能定位翻车点。希望帮到你。

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

返回列表