RUNBOOK — FlexLM License 服务(Cadence)¶
服务主机:
192.168.31.29(主机名Flexlm);软件:Flexeralmgrdv11.16.4.0 +cdslmd(Cadence vendor daemon) 服务目录:/opt/FlexLM/Cadence/;变更档案见同目录SOP.md(现行版本为变更 3:新 floating license 装载) 当前状态:运行中(2026-09-26 22:30 起)
目录¶
1. 服务概览¶
为 Cadence 客户端(IC617/Virtuoso、MMSIM 等)发放 floating license 的 FlexLM 许可服务器。
| 项 | 内容 |
|---|---|
| 组件 | lmgrd(license manager,监听 5280)+ cdslmd(Cadence vendor daemon,固定 5281,由 license 的 DAEMON 行 port=5281 指定) |
| 主机 | 192.168.31.29 / Flexlm,Rocky Linux 9.8,MAC 52:54:00:31:0e:02(= license SERVER 行绑定的 HostID) |
| 依赖 | 无外部依赖;不依赖 NFS 与 module load |
| 异常影响 | 服务中断 → 全部客户端无法启动 Cadence 工具(提示找不到 license server) |
| 重要性 | 高(单点,无冗余) |
| 当前状态 | 2026-09-26 22:30 起运行中:lmgrd(5280)+cdslmd(5281) 常驻;license 为 /opt/FlexLM/Cadence/cds.license.dat = 2 行头 + 605 条 floating FEATURE(permanent uncounted HOSTID=ANY,版本字段 2100.000,SERVER 行写 IP)。装载过程见 SOP.md 变更 3 |
| 已知限制 | ① 已由 systemd 托管(flexlm-cadence.service,开机自启 + 异常重启),运维见 ../../../Synopsys/flexlm_systemd_20260928/docs/RUNBOOK.md;② 尚未做真实 checkout(客户端工具未装);③ Calibre/Mentor license 未装载(缺 mgcld,且现有 Calibre license 绑的是别的 MAC,需先解决 MentorKG.exe 运行环境) |
2. 接入与凭据¶
- 登录:本地 root 免密 SSH 到
root@192.168.31.29(密钥见管理员本机~/.ssh/,凭据不入文档)。 - 客户端接入:已由 modulefile 提供——
module load cadence …自动设置CDS_LIC_FILE=LM_LICENSE_FILE=5280@192.168.31.29(来源:slurm_ins 的config/slurm_deploy.yaml)。 非 Lmod 场景手工兜底:
export CDS_LIC_FILE=5280@192.168.31.29
export LM_LICENSE_FILE=5280@192.168.31.29
-
SERVER行已写 IP(SERVER 192.168.31.29 525400310e02 5280,变更 3 起生效),客户端不再需要解析主机名Flexlm; 历史上的lmgrd is not running (-96)(场景 E)由主机名解析失败引起,现已消除。 -
客户端连通性自检(无需 Cadence 工具):
nc -vz 192.168.31.29 5280 # 预期 succeeded
nc -vz 192.168.31.29 5281 # 预期 succeeded
服务当前运行中,本自检应成功;失败即转 场景 A。
3. 日常速查表¶
| 目的 | 命令 |
|---|---|
| 看进程 | ssh root@192.168.31.29 'pgrep -ax lmgrd; pgrep -ax cdslmd' |
| 看端口 | ssh root@192.168.31.29 'ss -lntp \| grep -E ":5280\|:5281"' |
| 看日志尾部 | ssh root@192.168.31.29 'tail -30 /opt/FlexLM/Cadence/lmgrd.log' |
| 扫日志错误 | ssh root@192.168.31.29 'grep -inE "error\|invalid\|fail\|signature\|denied\|wrong" /opt/FlexLM/Cadence/lmgrd.log \| tail -20' |
| 启动(先归档旧日志) | ssh root@192.168.31.29 'cp -p /opt/FlexLM/Cadence/lmgrd.log /root/lmgrd.log.$(date +%Y%m%d-%H%M%S); setsid nohup /opt/FlexLM/Cadence/lmgrd -c /opt/FlexLM/Cadence/cds.license.dat -l /opt/FlexLM/Cadence/lmgrd.log </dev/null >/dev/null 2>&1 &' |
| 停止 | ssh root@192.168.31.29 'pkill lmgrd; pkill cdslmd'(lmdown 无执行位,调用会报 Permission denied) |
| 备份 license | scp root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat ./cds.license.dat.bak.$(date +%Y%m%d-%H%M%S) |
| 看已发许可证数 | ssh root@192.168.31.29 'grep -c "OUT:" /opt/FlexLM/Cadence/lmgrd.log' |
| 看防火墙放行 | ssh root@192.168.31.29 'firewall-cmd --list-ports'(预期 5280/tcp 5281/tcp) |
| 客户端查服务 | 客户端有 lmutil 时:lmutil lmstat -c 5280@192.168.31.29 -a |
4. 日常操作¶
检查状态¶
ssh root@192.168.31.29 'pgrep -ax lmgrd; pgrep -ax cdslmd; ss -lntp | grep -E ":5280|:5281"'
预期:两条进程记录(cdslmd 的父进程为 lmgrd);*:5280、*:5281 均 LISTEN。
不符:缺 cdslmd → 见 场景 B。
坑(别用 ps -ef | grep):通过 SSH 执行时,脚本自身命令行含 lmgrd|cdslmd 字样,ps -ef | grep 会把它当成进程列出来(假阳性);
判断进程一律用 pgrep -x(按进程名精确匹配)。
启动¶
先查是否已在运行(重复启动会报端口占用),并归档旧日志——lmgrd -l 启动时会把日志文件截断重写,不归档则历史日志即丢失。
ssh root@192.168.31.29 '
cp -p /opt/FlexLM/Cadence/lmgrd.log /root/lmgrd.log.$(date +%Y%m%d-%H%M%S) 2>/dev/null
setsid nohup /opt/FlexLM/Cadence/lmgrd \
-c /opt/FlexLM/Cadence/cds.license.dat \
-l /opt/FlexLM/Cadence/lmgrd.log </dev/null >/dev/null 2>&1 &
sleep 8
pgrep -ax lmgrd; pgrep -ax cdslmd'
预期:8 秒内出现两个进程;日志出现 Server started on 192.168.31.29 for: 与 feature 名列表。
不符:进程未起 → 看日志,转 场景 A。
坑(后台进程被回收):必须 setsid nohup … & 且 stdin/stdout/stderr 全部重定向,否则进程随会话结束被杀。
停止 / 重启¶
ssh root@192.168.31.29 'pkill lmgrd; pkill cdslmd; sleep 3; pgrep -x lmgrd; pgrep -x cdslmd'
注意:
- 停服会断开全部客户端连接,正在跑的 Cadence 作业可能随即失败——先确认无人正在用(问用户 / 看日志 OUT: 计数是否归零),再执行;重启即重新执行「启动」节。
- 不要用 pkill -f 加完整路径:-f 会匹配到承载 SSH 脚本的 shell 自身,导致会话被杀(返回码 255、无输出)。按进程名 pkill lmgrd / pkill cdslmd 即可。
- lmdown 文件权限为 644(无执行位),调用会报 Permission denied,用 pkill 代替。
日志查看¶
日志固定为 /opt/FlexLM/Cadence/lmgrd.log(启动时 -l 指定)。
ssh root@192.168.31.29 'tail -50 /opt/FlexLM/Cadence/lmgrd.log'
ssh root@192.168.31.29 'grep -inE "OUT:|IN:|DENIED|error|invalid" /opt/FlexLM/Cadence/lmgrd.log | tail -30'
关键特性:lmgrd -l 每次启动都会截断重写该文件,日志内容只覆盖"本次启动至今"。需要跨启动保留历史,须在启动前手工归档(见「启动」节)。
5. 配置管理¶
| 配置 | 位置 | 说明 |
|---|---|---|
| license 文件 | /opt/FlexLM/Cadence/cds.license.dat |
唯一配置源。当前形态:2 行头 + 605 条 FEATURE(floating:HOSTID=ANY、permanent uncounted、版本字段 2100.000);头行为 SERVER 192.168.31.29 525400310e02 5280 与 DAEMON cdslmd /opt/FlexLM/Cadence/cdslmd port=5281;sha256 128c93291de95e4d32eb03e866c344e79c5ddfa330e66578eb5ead6bb103bb3b(266661 字节) |
| daemon 路径 | license 内 DAEMON 行 |
必须是绝对路径且与该二进制实际位置一致;移动目录会导致启动失败 |
| 解释器链接 | /lib64/ld-lsb-x86-64.so.3 → /lib64/ld-linux-x86-64.so.2 |
二进制的 ELF interpreter,缺失时 lmgrd 报 No such file or directory(RC=127) |
| 日志文件 | /opt/FlexLM/Cadence/lmgrd.log |
启动参数 -l 指定;每次启动被截断重写 |
| 状态目录 | /opt/FlexLM/Cadence/.cadence/ |
cdslmd 自动创建(权限 777);license 文件所在目录必须可写,回滚时一并清理 |
修改 license 的流程:先备份(scp 回本机)→ 改文件 → 校验结构(wc -l 与 grep -c "^FEATURE")→ 归档旧日志 → 重启 → 查日志零错误。
改 SERVER 行的 HostID 或主机名会导致 HostID 不匹配、服务起不来(本机 MAC = 525400310e02)。
易错点:
- 行首关键字必须完整(SERVER/DAEMON/FEATURE);历史上出现过 EATURE 截断(见 SOP.md 变更 1 步骤 4)。
- 该 license 由 lmcrypt -r 生成,一条 FEATURE 记录跨多物理行、行尾以 \ 续行(605 条 = 4827 物理行)。这是合法写法,不要手工压行;也不要让编辑器把行尾 \ 后的空白吃掉。
- 从 Windows 侧取文件时注意 CRLF,落盘前 tr -d '\r'。
6. 备份与恢复¶
- 备份策略:仅在修改 license 前手工备份;无定期任务。
- 备份位置:本机
license_srv_20260926/backup/opt/FlexLM/Cadence/,台账见license_srv_20260926/backup/README.md。 - 手工备份:
TS=$(date +%Y%m%d-%H%M%S)
scp root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat "cds.license.dat.bak.$TS"
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat' # 与本地 sha256sum 比对
- 恢复:
scp cds.license.dat.bak.<TS> root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat
ssh root@192.168.31.29 'pgrep -ax lmgrd; pkill lmgrd; pkill cdslmd; sleep 3'
# 再按第 4 章「启动」拉起,并确认日志无错误
- 验证恢复:
grep -c "^FEATURE" /opt/FlexLM/Cadence/cds.license.dat为 605(wc -l为 4829),且进程/端口正常。 - 演练记录:暂无真实恢复演练;2026-09-26 变更 3 做过备份+哈希比对与旁路试读(
SOP.md变更 3 步骤 3)。
7. 监控与告警¶
当前无监控、无告警,只能人工巡检。建议至少每日一次:
| 指标 | 命令 | 正常值 |
|---|---|---|
| 进程 | ssh root@192.168.31.29 'pgrep -cx lmgrd; pgrep -cx cdslmd' |
两个 1 |
| 5280/5281 监听 | ssh root@192.168.31.29 'ss -lnt \| grep -cE ":5280\|:5281"' |
2 |
| 日志错误 | ssh root@192.168.31.29 'grep -icE "error\|invalid\|signature\|wrong" /opt/FlexLM/Cadence/lmgrd.log' |
0 |
| HostID | ssh root@192.168.31.29 'grep -i "HostID" /opt/FlexLM/Cadence/lmgrd.log \| tail -2' |
两行均为 525400310e02 |
| feature 注册量 | ssh root@192.168.31.29 'awk "/Server started on/{f=1;next} f&&/\(cdslmd\)/&&!/SLOG/{sub(/^[0-9:]+ \(cdslmd\)/,\"\"); n+=NF} END{print n}" /opt/FlexLM/Cadence/lmgrd.log' |
约 605(含少量说明词时略高) |
后续可接 systemd + 简单探测告警(见第 11 章待办)。
8. 故障处置¶
场景 A:客户端连不上 5280¶
症状:客户端工具报 Cannot connect to license server / License server machine is down;nc -vz 192.168.31.29 5280 失败或超时。
诊断
ssh root@192.168.31.29 'pgrep -ax lmgrd; pgrep -ax cdslmd' # 预期两条进程
ssh root@192.168.31.29 'ss -lntp | grep -E ":5280|:5281"' # 预期两条 LISTEN
ssh root@192.168.31.29 'getenforce; firewall-cmd --list-ports 2>/dev/null' # 预期 Enforcing;5280/5281 已放行
处置:进程缺失 → 按第 4 章「启动」拉起;端口未放行 → firewall-cmd --add-port=5280/tcp --permanent && firewall-cmd --reload(需用户批准);主机不可达 → 检查虚拟机与网络。
验证:nc -vz 192.168.31.29 5280 成功,日志尾部出现客户端连接记录。
场景 B:cdslmd 反复重启或缺失¶
症状:只有 lmgrd 进程,5280 在监听但客户端报 vendor daemon down;日志里 cdslmd 反复启动。
诊断
ssh root@192.168.31.29 'grep -inE "cdslmd|restart|expire|invalid|signature|FEATURE|Wrong hostid" /opt/FlexLM/Cadence/lmgrd.log | tail -30'
ssh root@192.168.31.29 'grep -c "^FEATURE" /opt/FlexLM/Cadence/cds.license.dat; wc -l /opt/FlexLM/Cadence/cds.license.dat'
处置:日志提示某 FEATURE 行格式错误 → 按 SOP.md 变更 1 步骤 4 定点修复(先备份);提示 signature/expired → license 本身不可用,需换发;提示 Wrong hostid on SERVER line → SERVER 行 HostID 与主机 MAC 不符,核对 525400310e02。
验证:cdslmd 稳定在跑,日志无 restart 循环。
场景 C:lmgrd 起不来,报 No such file or directory(RC=127)¶
症状:lmgrd -v 报 bash: /opt/FlexLM/Cadence/lmgrd: No such file or directory,但文件明明存在(ls -l 可见且可执行)。
诊断
ssh root@192.168.31.29 'readelf -l /opt/FlexLM/Cadence/lmgrd | grep -i interpreter; ls -l /lib64/ld-lsb-x86-64.so.3'
处置:这是 ELF interpreter 缺失(系统升级或误删链接导致):
ssh root@192.168.31.29 '[ -e /lib64/ld-lsb-x86-64.so.3 ] || ln -s /lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3'
验证:/opt/FlexLM/Cadence/lmgrd -v 输出版本号(lmgrd v11.16.4.0 …),再按第 4 章启动。
场景 D:客户端报 version 或 feature 不存在¶
症状:license server 可达,但工具报 License server does not support this version of this feature 或 Feature not found。
诊断
ssh root@192.168.31.29 'grep -m1 "^FEATURE" /opt/FlexLM/Cadence/cds.license.dat | cut -c1-90'
ssh root@192.168.31.29 'grep -inE "DENIED|OUT:|version" /opt/FlexLM/Cadence/lmgrd.log | tail -20'
处置:当前 license 的版本字段为 2100.000(版本上限,远高于 IC617/IC25.10,方向安全),故此场景在新 license 下基本不会由"版本过低"引起;
若仍报错,优先排查 feature 名拼写或工具所需 feature 不在 605 条清单内(grep -i "<feature 名>" cds.license.dat 确认)。
验证:客户端启动一次工具(如 virtuoso -version)不再报 license 错误。
场景 E:客户端报 lmgrd is not running ... (-96,7:2 "No such file or directory")¶
状态注(2026-09-26 变更 3 后):本场景的历史根因是 license 的
SERVER行用主机名Flexlm而客户端无法解析;新 license 的SERVER行已改为 IP,该问题不再存在。本节保留作为同类问题(改了主机名/地址后客户端不可达)的排查参考。
症状:端口能连通,服务端 ss 也显示 LISTEN,但客户端 lmstat 报 lmgrd 未运行,错误里夹着 No such file or directory。
诊断
ssh root@192.168.31.29 'pgrep -ax lmgrd; ss -lntp | grep -E "5280|5281"'
ssh root@192.168.31.18 'getent hosts Flexlm || echo "Flexlm 无法解析"'
根因:license 的 SERVER 行写主机名,而客户端解析失败 → 判定服务不可达。
处置:把 SERVER 行改为 IP(当前已是 192.168.31.29,无需处理);或在各客户端 /etc/hosts 补 192.168.31.29 Flexlm(注意集群 hosts 的 slurm-deploy 块由部署器管理,勿手改块内内容)。
验证:客户端 lmutil lmstat -c 5280@192.168.31.29 -a 输出 license server UP (MASTER) 与 cdslmd: UP。
场景 F:checkout 被拒,报 Invalid host / -9,57¶
状态注(2026-09-26):触发本场景的旧 node-locked license 已于变更 2 清除;新 license 为
HOSTID=ANYfloating,理论上不再出现该错误。本节保留作换证与同类排障参考。
症状:lmstat 显示服务正常、feature 席位存在;但客户端 lmdiag -c 5280@192.168.31.29 -n <feature> 报
This license cannot be checked out because: Invalid host,FlexNet Licensing error:-9,57。
诊断
# 看 FEATURE 行是否带 HOSTID=<MAC>(带 = node-locked,只认该 MAC 的机器)
ssh root@192.168.31.29 'grep -m1 "^FEATURE" /opt/FlexLM/Cadence/cds.license.dat | cut -c1-90'
根因:FEATURE 行带 HOSTID=<MAC> 即 node-locked,许可只发给该 MAC 的机器,集群客户端结构上无法使用;服务端配置无法绕过。
处置:换发 floating 版本(FEATURE 行 HOSTID=ANY,SERVER 行的 hostid 仍用于保护文件)。
验证:换发后在客户端 lmdiag -c 5280@<server> -n <feature> 应输出 This license can be checked out。
9. 安全与权限¶
- 服务以 root 运行(FlexLM 传统部署),
/opt/FlexLM/Cadence/属主 root,权限 755/644;.cadence/为 777(cdslmd 自动创建)。 - license 文件含 HostID 与签名段,属敏感信息:不外传、不贴公开渠道;备份只留管理员本机。
- 无独立账号体系;访问控制依赖主机 SSH 权限(root 免密,仅管理员本机)。
- 需放行
5280/tcp、5281/tcp供客户端访问(当前已固定放行);若后续新增 vendor daemon(如 Calibre 的mgcld),须为其DAEMON行固定端口并同步放行。
10. 容量与性能¶
- 资源占用极低:两个进程常驻,内存合计约几十 MB;
/余量约 18G。 - 并发上限:当前 605 条
FEATURE全部为uncounted(不限席位),不存在"席位耗尽"问题;permanent表示不过期。 - 扩容触发:仅在换用 counted 形态 license 时才会出现
Licensed number of users already reached,届时更换 license 即可,无需改服务配置。 - 已知瓶颈:单点部署,无冗余;服务中断即全体客户端不可用。
11. 附录¶
- 相关文档:
license_srv_20260926/docs/SOP.md(变更档案,现行变更 3)、license_srv_20260926/backup/README.md(备份台账)、license_srv_20260926/logs/(启动日志留档)。 - 关联工程:
ic25_install_20260924/(IC25.10,已卸载);旧版工具链介质Cadence安装软件包/(IC617/MMSIM15/ASSURA/Calibre2015,待安装)。 - 待办(2026-09-26 变更 3 后):
- ~~客户端 modulefile 补 license 变量~~ 已完成(slurm_ins 渲染
CDS_LIC_FILE/LM_LICENSE_FILE); - ~~放行防火墙 5280/5281~~ 已完成;
- ~~旧 node-locked license 客户端被拒~~ → 已于变更 2 清除,变更 3 装载 floating license,问题消解;
- 视需要补 systemd 常驻与开机自启(当前主机重启后服务丢失);
- 真实 checkout 验证:IC617 装好后用
lmutil lmstat/lmdiag实测 feature 能否取到; - Calibre/Mentor license:已获 floating 版(88 条 FEATURE 全
HOSTID=ANY、无SERVER行、uncounted)⇒ 形态可用于集群,且按 FlexNet 规则不需 license 服务与mgcld;待 Calibre 工具安装后做客户端直读验证(放$CALIBRE_HOME/shared/license/license.dat或设MGLS_LICENSE_FILE)。若实测必须走服务端,则需装 Calibre 取mgcld并另起独立实例。详见SOP.md变更 3 §3.9.1。 - 修订记录:
- 2026-09-26 首次建立(服务首次启动后);
- 2026-09-26 17:24 修订:旧 node-locked license 清除、服务停止(对应
SOP.md变更 2); - 2026-09-26 22:30 修订:装载 floating license、服务恢复运行、
SERVER行改为 IP、命令改pgrep -x、日志截断与.cadence状态目录两条特性入册(对应SOP.md变更 3)。 - 2026-09-26 22:45 修订:记录 Calibre license 核实结论(单机 node-locked、不适用于集群),第 11 章待办 6 同步更新(对应
SOP.md变更 3 §3.9)。 - 2026-09-26 22:50 修订:Calibre license 换为 floating(
HOSTID=ANY)版并核实通过,待办 6 更新为"待工具安装后验证客户端直读"(对应SOP.md变更 3 §3.9.1)。
来源:
/home/rain/Documents/eda_tools_ins/Cadence/license_srv_20260926/docs/RUNBOOK.md| 最后更新:2026-09-28 13:26(由build/sync.py同步,请勿在站点侧修改)