跳转至

SOP — FlexLM License 服务启动(192.168.31.29)

变更目录:license_srv_20260926/;执行日期 2026-09-26;执行人:Agent(用户确认后执行) 关联工程:ic25_install_20260924/(Cadence IC25.10 安装);本变更闭合其 HANDOFF 待办 #1 的"服务端就绪"部分

本文件按变更累积:以下 1–8 章及附录为「变更 1」(服务首次启动,2026-09-26 14:54~15:05); 其后依次为「变更 2」(旧 node-locked license 清除,2026-09-26 17:24)与「变更 3」(新 floating license 装载,2026-09-26 22:30)。 服务当前状态:运行中(lmgrd 监听 5280、cdslmd 固定 5281,license 为 605 条 floating FEATURE)。

1. 背景

Cadence IC25.10 已安装并在六台客户端就绪,但一直缺 license 服务(ic25_install_20260924/docs/HANDOFF.md 待办 #1:独立服务节点 + FlexLM)。

2026-09-26 用户提供 license 主机:192.168.31.29(主机名 Flexlm),/opt/FlexLM/Cadence/ 下有 lmgrd、cdslmd、lmdown、cds.license.dat,要求验证能否启动。本次为首次试启动,目标是把服务跑起来并验证,不含开机自启。

2. 目标

变更完成后应达到:

  1. lmgrd 与 cdslmd 进程常驻运行;
  2. lmgrd 监听 5280/tcp(license 端口),cdslmd 监听动态端口;
  3. lmgrd.log 中无 error / invalid / fail / signature 类记录;
  4. cds.license.dat 格式合法(268 条 FEATURE,行数 270),宿主 HostID 与 license 一致。

不在本次范围:开机自启(systemd)、客户端 module load 变量补写、真实 checkout 验证。

3. 前置条件

  • root 免密 SSH 至 192.168.31.29 可用(实测通过,无需密码);
  • 远端 /opt 可写(root);
  • 本机可写交付物目录 license_srv_20260926/;
  • 该机未承载其他服务,无在跑作业,无需停服;
  • 无需新增软件包(dnf provides /lib64/ld-lsb-x86-64.so.3 实测无匹配,见步骤 3)。

4. 影响范围

项 内容
主机 单机 192.168.31.29(Flexlm),无冗余节点
新增监听 5280/tcp(lmgrd+cdslmd 共用)、59583/tcp(cdslmd 动态端口)
系统文件改动 新增符号链接 /lib64/ld-lsb-x86-64.so.3;/opt/FlexLM/Cadence/cds.license.dat 第 126 行
是否停服 否(该机此前无 license 服务在跑,5280 空闲)
窗口期 无限制——当前无任何客户端依赖该服务(客户端 license 变量尚未配置)
回滚成本 低:删符号链接 + 还原 license + kill 两个进程

5. 分步操作

步骤 1:只读摸底

确认目录内容、进程与端口占用、二进制可执行性。坑:ldd 对 interpreter 缺失的二进制会输出"全部解析成功"(它绕过 ELF interpreter 手动解析),是假阳性;判断可执行性必须用 readelf -l | grep interpreter 看解释器路径并在目标机上确认该文件存在,或直接试运行看 No such file or directory(RC=127)。

ssh root@192.168.31.29 'hostname; date; ls -la /opt/FlexLM/Cadence/'
ssh root@192.168.31.29 'ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep; ss -lntp | head -20'
ssh root@192.168.31.29 'file /opt/FlexLM/Cadence/lmgrd; readelf -l /opt/FlexLM/Cadence/lmgrd | grep -i interpreter'
ssh root@192.168.31.29 'ls -l /lib64/ld-lsb-x86-64.so.3; getenforce'

预期:目录含 4 个文件;无 lmgrd/cdslmd 进程;5280 未监听;readelf 显示解释器为 /lib64/ld-lsb-x86-64.so.3,而该文件不存在(本次实测即如此)。 失败判断:SSH 不通或 /opt/FlexLM 不存在 → 中止,向用户核对主机与路径。

步骤 2:备份 license 文件(高危动作前置)

修改 license 前先备份到交付物目录,并做 sha256 双向比对。

TS=$(date +%Y%m%d-%H%M%S)
mkdir -p license_srv_20260926/backup/opt/FlexLM/Cadence license_srv_20260926/logs license_srv_20260926/docs
scp root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat \
    "license_srv_20260926/backup/opt/FlexLM/Cadence/cds.license.dat.bak.$TS"
sha256sum "license_srv_20260926/backup/opt/FlexLM/Cadence/cds.license.dat.bak.$TS"
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat'

预期:两个 sha256 一致(本次:61e338285223bba19572a696bc1e4459cb3e4e3c3dfda2486142e04866b09429)。 失败判断:哈希不一致 → 重新拉取,不得继续后续修改步骤。

步骤 3:补 ELF interpreter 符号链接

lmgrd/cdslmd 为 Flexera 2021 年构建的 x64_lsb 二进制,解释器写死为 /lib64/ld-lsb-x86-64.so.3;Rocky 9 已移除 lsb 相关包(RHEL9 起不再提供),故执行报 bash: ./lmgrd: No such file or directory、rc=127。

坑:该报错信息具有误导性——文件明明存在且有 -rwxr-xr-x,真正缺的是解释器。dnf provides "*/ld-lsb-x86-64.so.3" 在 Rocky 9 仓库无匹配(实测),不要在这条路上耗时;标准做法是建符号链接指向系统真实解释器。本步骤幂等:已存在则跳过。

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
ls -l /lib64/ld-lsb-x86-64.so.3
/opt/FlexLM/Cadence/lmgrd -v'

预期:ld-lsb-x86-64.so.3 -> ld-linux-x86-64.so.2;lmgrd -v 输出版本号(本次:lmgrd v11.16.4.0 build 252457 x64_lsb)且 rc=0。 失败判断:仍报 127 或 Permission denied(SELinux Enforcing)→ 检查 getenforce 与文件 context(ls -Z),本机 root 为 unconfined 域时正常,若被拒则先 restorecon 再试;连续两次失败即停并回报。

步骤 4:修复 license 第 126 行截断

license 第 126 行为 EATURE Phys_Ver_Sys_ADP_Ex_Opt ...,缺首字母 F(前后 125、127 行均为完整 FEATURE)。FlexLM 解析到该行会报格式错误,导致 feature 丢失或 daemon 启动失败。

坑:只改行首一个字符,不动行内其余内容——SIGN2 签名段随之保持原样;用 sed 定点替换而非重排全文。改后必须复核行数与 feature 计数。

ssh root@192.168.31.29 '
F=/opt/FlexLM/Cadence/cds.license.dat
sed -n "126p" "$F" | grep -q "^FEATURE" || sed -i "126s/^EATURE/FEATURE/" "$F"
sed -n "126p" "$F" | cut -c1-40
echo "FEATURE_COUNT=$(grep -c "^FEATURE" "$F")  LINES=$(wc -l < "$F")"
sha256sum "$F"'

预期:第 126 行以 FEATURE Phys_Ver_Sys_ADP_Ex_Opt 开头;FEATURE_COUNT=268、LINES=270(本次实测值)。 失败判断:计数不足 268 → 说明还有其它截断行,用 grep -nE "^[^FD#]" 定位后再修;不确定即回滚(第 7 章)并回报。

步骤 5:启动服务

坑:本工程的执行通道会回收 nohup 起的进程,必须 setsid nohup ... & 且把 stdin/stdout/stderr 全部重定向为 /dev/null,否则 SSH 会话挂住或进程被连带杀死。日志用 -l 指定固定文件(lmgrd 默认把日志写 stdout),便于后续取证与运行期排障。

ssh root@192.168.31.29 '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 6
ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep
ss -lntp | grep -E "lmgrd|cdslmd"'

预期:两个进程(lmgrd 与 cdslmd,后者父进程为 lmgrd);*:5280 由 cdslmd+lmgrd 共同监听,另有 cdslmd 动态端口(本次 59583)。 失败判断:只有 lmgrd 无 cdslmd,或 5280 未监听 → 看第 6 章的日志判据,按第 7 章回滚。

步骤 6:日志取证与本地留档

ssh root@192.168.31.29 'grep -inE "error|invalid|fail|signature|denied|cannot|expire|not supported|WARNING" /opt/FlexLM/Cadence/lmgrd.log | head -12'
scp root@192.168.31.29:/opt/FlexLM/Cadence/lmgrd.log \
    "license_srv_20260926/logs/lmgrd-startup-$(date +%Y%m%d-%H%M%S).log"

预期:过滤结果为空;日志含 HostID node-locked in license file: 525400310e02 与 HostID of the License Server: 525400310e02(一致)。 失败判断:出现 Invalid license / signature / version 类记录 → 服务不可用,按第 7 章回滚 license 修改并回报用户。

6. 验证

判据 命令 本次实测结果
进程存活 ps -ef \| grep -E "lmgrd\|cdslmd" lmgrd pid 14761、cdslmd pid 14763 在跑
端口监听 ss -lntp \| grep -E "lmgrd\|cdslmd" *:5280、*:59583
日志零错误 grep -inE "error\|invalid\|fail\|signature" /opt/FlexLM/Cadence/lmgrd.log 无匹配
HostID 匹配 同上日志 grep HostID license 525400310e02 = 本机 ens2 MAC
license 结构 grep -c "^FEATURE" cds.license.dat、wc -l 268 / 270

未做的验证(属待办,见第 8 章):真实 checkout(需客户端工具)、开机自启、客户端环境变量接入。

7. 回滚

备份位置:license_srv_20260926/backup/(台账见 license_srv_20260926/backup/README.md)。

# 1) 停服务(lmdown 优先,失败再 kill)
ssh root@192.168.31.29 '/opt/FlexLM/Cadence/lmdown -c /opt/FlexLM/Cadence/cds.license.dat -all -force'
ssh root@192.168.31.29 'pkill -f "/opt/FlexLM/Cadence/lmgrd"; pkill -f cdslmd; sleep 2; ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep'

# 2) 还原 license 文件(用步骤 2 的实际备份文件名)
scp license_srv_20260926/backup/opt/FlexLM/Cadence/cds.license.dat.bak.<TS> \
    root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat'   # 期望回到 61e33828...429

# 3) 撤销解释器符号链接(可选:该链接本身无害,保留不影响任何系统行为)
ssh root@192.168.31.29 'rm -f /lib64/ld-lsb-x86-64.so.3'

回滚后验证:进程与 5280 端口均无残留;license 文件 sha256 回到原值。注意:撤销符号链接后 lmgrd 将无法执行,若只想停服务不改文件,跳过第 3 步。

8. 风险说明

风险 说明 缓解
license 签名可疑 268 条 FEATURE 的 SIGN2 均为 0000 1111 2222 … 占位串,非真实签名形态 已实测 cdslmd 接受该文件(启动无 signature 报错);仍需真实 checkout 验证(待办)
版本字段偏低 FEATURE 版本字段 2020.12,而实际工具为 IC25.10,该字段是版本上限,客户端可能报 "version too new" 服务端无法解决;须用客户端做真实 checkout 确认,失败则向用户索取匹配版本的 license
无开机自启 本次按用户选择仅试启动,进程由 setsid nohup 拉起,主机重启后丢失 后续如需常驻,补 systemd unit(另立变更)
单点 该机无冗余,license 服务中断将导致全部客户端无法启动工具 记录本 RUNBOOK 的故障处置章;重要窗口期前检查进程
license 明文在交付目录 备份含 HostID 等信息 备份仅留在本机交付目录,不外传;清理见 backup/README.md

附录:交付物清单

路径(相对 license_srv_20260926/) 内容
docs/SOP.md 本文件(变更档案)
docs/RUNBOOK.md 服务运行与使用手册
backup/opt/FlexLM/Cadence/cds.license.dat.bak.20260926-145405 修改前 license 原文件(sha256 61e33828…429)——已按变更 2 清除
backup/README.md 备份台账——已按变更 2 清除
logs/lmgrd-startup-20260926-145442.log 启动日志留档(远端同文件:/opt/FlexLM/Cadence/lmgrd.log)——已按变更 2 清除

变更后远端关键值:license sha256 ed631b9a31479336e0943adc4a91ed6139b37fe79ca5ae2e60c6188fa8727ba2;进程 lmgrd pid 14761 / cdslmd pid 14763;端口 5280、59583。 (注:变更 2 删前实测 sha256 为 8c222714b076dca790f851d97fd0e36536e14f8a588a4871a1a02a1969694bad,与本行记录不一致——本行数值系变更 1 当时的记录,实际以变更 2 第 5 章步骤 1 的删前实测为准。)


变更 2 — 旧 node-locked license 清除(2026-09-26 17:24)

执行人:Agent(用户确认后执行);范围与口径由用户明确指定: ① 远端停服务 + 删 license 文件(保留二进制与目录);② 本机备份与日志一并清除。

2.1 背景

  • 变更 1 启动的服务所加载 license 为 node-locked(FEATURE 行带 HOSTID=525400310e02),集群客户端 checkout 被拒 Invalid host (-9,57),仅服务端本机可用(见变更 1 与 RUNBOOK.md 场景 F)。
  • 2026-09-26 用户提供旧版工具链介质 Cadence安装软件包/(IC617 + MMSIM15.10 + ASSURA04.15 + Calibre2015)及配套 08.cadence_license.zip(license.dat:605 条 FEATURE、HOSTID=ANY、permanent uncounted、版本字段 2100.000)—— 形态为 floating,可解 node-locked 之困,旧 license 无保留价值。
  • 用户决策:清除旧 license,后续装载新 license 前先讨论路线。

2.2 目标

  1. lmgrd 与 cdslmd 进程停止,5280/5281 无监听;
  2. 远端 /opt/FlexLM/Cadence/cds.license.dat 不存在,lmgrd/cdslmd/lmdown/lmgrd.log 保留;
  3. 本机 license_srv_20260926/ 下仅余 docs/(备份与日志已清)。

2.3 前置条件

  • root 免密 SSH 至 192.168.31.29 可用;
  • 该机未承载其他服务、无在跑作业;客户端依赖该服务者为零(Cadence 工具链已卸载);
  • 删前取证完成(第 5 章步骤 1),确保"清除了什么"可复现。

2.4 影响范围

项 内容
主机 单机 192.168.31.29(Flexlm),无冗余节点
停服 是:lmgrd + cdslmd 停止(无客户端在用)
释放监听 5280/tcp、5281/tcp(firewalld 放行保留,供新 license 复用)
远端删除 /opt/FlexLM/Cadence/cds.license.dat(66301 字节)
本机删除 backup/(含备份与台账)、logs/(启动日志)
数据损失 旧 license 与启动日志无任何副本,不可回滚(用户明确决策)
保留 /opt/FlexLM/Cadence/{lmgrd,cdslmd,lmdown,lmgrd.log}、符号链接 /lib64/ld-lsb-x86-64.so.3、firewalld 放行

2.5 分步操作

步骤 1:删前只读取证

先固定"删除前是什么样",否则事后无法复现结论。

ssh root@192.168.31.29 'ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep
ss -lnt | grep -E ":5280|:5281"
stat -c "%n type=%F size=%s mode=%a mtime=%y" /opt/FlexLM/Cadence/cds.license.dat
sha256sum /opt/FlexLM/Cadence/cds.license.dat
grep -c "^FEATURE" /opt/FlexLM/Cadence/cds.license.dat; wc -l < /opt/FlexLM/Cadence/cds.license.dat'

预期:两个进程在跑;5280/5281 处于 LISTEN;文件为 regular、mode=644; 计数 268 / 行数 270。 失败判断:SSH 不通或目录不存在 → 中止,与用户核对主机与路径。

本次实测:lmgrd pid 15351、cdslmd pid 15353;两端口 LISTEN;文件 66301 字节、mode=644、 mtime 2026-09-26 14:59:24;268/270; sha256 = 8c222714b076dca790f851d97fd0e36536e14f8a588a4871a1a02a1969694bad。

步骤 2:停服务(高危)

先走正规 lmdown,失败再 pkill 兜底。

坑:本机 lmdown 权限为 644(无执行位,见步骤 1 的目录清单),直接调用报 bash: /opt/FlexLM/Cadence/lmdown: Permission denied —— 此时不要改权限(那会引入额外变更), 直接 pkill 发 SIGTERM 即可,退出码与关停日志照样可信。

坑:本工程的执行通道会回收普通后台进程,故服务必须 setsid nohup … & 拉起(变更 1 步骤 5); 反之,停止用 pkill 精确匹配绝对路径,避免误杀同名进程。

# 高危:停服
ssh root@192.168.31.29 '
D=/opt/FlexLM/Cadence
"$D/lmdown" -c "$D/cds.license.dat" -all -force     # 无执行位时会 Permission denied,可忽略
pkill -f "$D/lmgrd"; pkill -f "$D/cdslmd"; sleep 2
ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep || echo 无残留
ss -lnt | grep -E ":5280|:5281" || echo 无监听'

预期:无残留、无监听;远端日志 /opt/FlexLM/Cadence/lmgrd.log 追加 cdslmd Shutdown requested / EXITING DUE TO SIGNAL 15。 失败判断:仍有进程或端口 LISTEN → 再执行一次 pkill;仍不消失则停手回报(连续 2 次失败即停)。

本次实测:lmdown 报 Permission denied;pkill 后 无残留、无监听; 日志尾部 17:24:24 (cdslmd) Shutdown requested → 17:24:24 (lmgrd) EXITING DUE TO SIGNAL 15。

步骤 3:删除远端 license 文件(高危)

删除前做路径白名单校验(精确路径 + 普通文件),避免误删。

# 高危:删除远端 license 文件
ssh root@192.168.31.29 '
D=/opt/FlexLM/Cadence
F="$D/cds.license.dat"
if [ "$F" = "/opt/FlexLM/Cadence/cds.license.dat" ] && [ -f "$F" ]; then
  echo "sha256(删前)=$(sha256sum "$F" | cut -d" " -f1)"; rm -f "$F"
else
  echo "路径校验失败或文件不存在,中止"; exit 1
fi
ls -l "$D"; [ -e "$F" ] && echo 结果=STILL_EXISTS || echo 结果=GONE'

预期:目录余 4 个文件(cdslmd、lmdown、lmgrd、lmgrd.log),结果=GONE。 失败判断:列表里仍有 cds.license.dat → 检查权限与挂载,重试一次;再失败停手回报。

步骤 4:清除本机备份与日志(高危,用户决策)

注意:这一步之后旧 license 与本轮启动日志再无副本,第 7 章的回滚依据随之消失 —— 由用户在明确知晓的前提下决策执行(本工程默认约定为"Agent 不删备份、由用户对照台账清理", 本次按用户指令执行,属对默认约定的显式覆盖)。

# 高危:删除本机交付目录内的备份与日志(文件名逐一列出,不用通配)
cd /home/rain/Documents/eda_tools_ins/Cadence/license_srv_20260926
sha256sum backup/opt/FlexLM/Cadence/cds.license.dat.bak.20260926-145405   # 留证:61e33828…429
sha256sum logs/lmgrd-startup-20260926-145442.log                          # 留证:0f36a253…d34e
rm -f backup/opt/FlexLM/Cadence/cds.license.dat.bak.20260926-145405
rm -f backup/README.md
rm -f logs/lmgrd-startup-20260926-145442.log
rmdir -p --ignore-fail-on-non-empty backup/opt/FlexLM/Cadence logs
ls -laR .'

预期:目录树仅余 docs/(SOP.md、RUNBOOK.md)。 失败判断:rm 报权限错 → 检查文件属主;rmdir 报非空 → 说明有遗漏文件,ls 定位后逐一处理,不用通配删除。

本次实测:删除后 license_srv_20260926/ 下仅 docs/(两文档)。

2.6 验证

判据 命令 本次实测结果
进程已停 ssh root@192.168.31.29 'ps -ef \| grep -E "lmgrd\|cdslmd" \| grep -v grep' 无输出(无残留)
端口已释放 ssh root@192.168.31.29 'ss -lnt \| grep -E ":5280\|:5281"' 无输出
远端文件已删 ssh root@192.168.31.29 'ls -l /opt/FlexLM/Cadence/' 仅 cdslmd/lmdown/lmgrd/lmgrd.log
关停有据 tail -6 /opt/FlexLM/Cadence/lmgrd.log Shutdown requested + EXITING DUE TO SIGNAL 15
本机已清 ls -laR license_srv_20260926/ 仅 docs/(SOP.md、RUNBOOK.md)

2.7 回滚

本变更不可回滚:旧 license 与本地备份的唯一副本已按用户决策删除, 恢复服务不再可能"回到变更 1 的状态"。可恢复的路径只有向前:

# 前提:新的 floating license 文件已就位(如 <NEW_LIC> = /opt/FlexLM/Cadence/cds.license.dat)
scp <NEW_LIC> root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat'    # 与本地比对
ssh root@192.168.31.29 '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 6; ps -ef | grep -E "lmgrd|cdslmd" | grep -v grep'

未随之回滚的两项(有意保留,对系统无副作用):

项 位置 处置
ELF interpreter 符号链接 192.168.31.29:/lib64/ld-lsb-x86-64.so.3 保留(新 license 复用该二进制时需要)
firewalld 放行 192.168.31.29 的 5280/tcp 5281/tcp 保留(复用)

备份台账说明:原 backup/README.md 已随备份一并删除;其登记的关键值 (备份文件 cds.license.dat.bak.20260926-145405、sha256 61e33828…429、原始路径、产生原因) 见本章与第 2.5 章步骤 1、步骤 4。

2.8 风险说明

风险 说明 缓解
旧 license 彻底消失 远端文件与本机备份均已删,无副本 该 license 已被证明对集群无用(node-locked,-9,57);用户决策接受
客户端 5280@192.168.31.29 指向空服务 modulefile 仍下发该地址,加载工具会连不上 服务此前也无可用 license,对客户端等价;新 license 就位后同一地址即可用
记录漂移 变更 1 附录记的 license sha256(ed631b9a…)与变更 2 删前实测(8c222714…)不一致 已在本变更与变更 1 附录中双向标注,以删前实测为准;同类记录今后统一"删改前实测 + 时间戳"
无开机自启 服务由 setsid nohup 拉起,主机重启即丢 现状为已停止,不影响;新 license 就位后可另立变更补 systemd

附录:变更 2 后的实际状态

项 值
远端 /opt/FlexLM/Cadence/ cdslmd、lmdown、lmgrd、lmgrd.log(无 license 文件)
远端进程/端口 无 lmgrd、无 cdslmd;5280/5281 无监听
本机 license_srv_20260926/ docs/SOP.md、docs/RUNBOOK.md
关联但未动 /lib64/ld-lsb-x86-64.so.3 符号链接、firewalld 5280/5281、六台客户端 modulefile 的 5280@ 变量

变更 3 — 旧版工具链配套 floating license 装载(2026-09-26 22:30)

执行人:Agent(用户确认后执行)。口径由用户明确指定: ① license 装到 192.168.31.29 的 /opt 下;② 走服务端浮动服务路线(补 SERVER/DAEMON 头行并启动 lmgrd); ③ SERVER 行绑定本机 MAC 525400310e02;④ Calibre(Mentor)license 本轮未装(见 3.1 与 3.8),用户先行解决 MentorKG 运行环境后再议。

3.1 背景

  • 变更 2 清除旧 node-locked license 后,服务处于「停止且无 license」态;六台客户端仍由 slurm_ins 下发 CDS_LIC_FILE=LM_LICENSE_FILE=5280@192.168.31.29。
  • 用户提供旧版工具链配套 license 包 Cadence安装软件包/08.cadence_license.zip:license.dat 含 605 条 FEATURE,daemon 为 cdslmd,版本字段 2100.000,permanent uncounted、HOSTID=ANY,带真实 SIGN2 签名 —— 形态为 floating(不绑机、不限席位),可解旧 license 的 node-locked 之困。
  • 该行为纯 FEATURE 文件(无 SERVER/DAEMON/USE_SERVER 行)。按包内 README,uncounted 形态下服务端非必需;但客户端需以绝对路径指向该文件(CDS_LIC_FILE=<path>/license.dat),与现有 5280@ 下发方式不符。用户选择仍走服务端路线:客户端零改动、IP 化 SERVER 行顺带解掉主机名解析问题。
  • Calibre/Mentor 侧(08.calibre_license.zip)本轮核实为不可装:① license.dat 88 条 FEATURE 全部 HOSTID=000c294756b0(node-locked,且非本机 MAC),无 SERVER/DAEMON 行;② 重生成需 Windows 程序 MentorKG.exe,本机与 31.29 均无 wine;③ mgcld 二进制不在介质内(06.Calibre.2015.zip 仅一个安装器 aoi_cal_2015.2_36.27_mib.exe),须装完 Calibre 才可取到。

3.2 目标

  1. 192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat 存在,结构 = 2 行头(SERVER/DAEMON)+ 605 条 FEATURE;
  2. lmgrd 监听 5280/tcp、cdslmd 固定 5281/tcp,两进程常驻且父子关系正确;
  3. 启动日志零 error / invalid / signature / wrong / denied;HostID node-locked in license file 与 HostID of the License Server 一致;
  4. 客户端侧 5280/5281 端口可达(/dev/tcp 实测)。

不在本次范围:真实 checkout(工具未装,见 3.6)、开机自启(systemd)、Calibre/Mentor license、客户端变量修改。

3.3 前置条件

  • root 免密 SSH 至 192.168.31.29 可用(实测通过);
  • 远端 /opt/FlexLM/Cadence/ 可写(root);/lib64/ld-lsb-x86-64.so.3 符号链接与 firewalld 放行 5280/5281 已存在(变更 1/2 有意保留);
  • 本机可读介质目录 Cadence安装软件包/08.cadence_license.zip;
  • 该机未承载其他服务、无在跑作业;集群侧 Cadence 工具链尚未安装 ⇒ 无客户端依赖,可停可启。

3.4 影响范围

项 内容
主机 单机 192.168.31.29(Flexlm),无冗余节点
新增文件 远端 /opt/FlexLM/Cadence/cds.license.dat(266661 字节);同目录 .cadence/ 状态目录(cdslmd 自动创建)
新增监听 5280/tcp(lmgrd)、5281/tcp(cdslmd,由 DAEMON 行 port=5281 固定)
是否停服 否(变更前无服务在跑)
窗口期 无限制——当前无任何客户端依赖该服务
回滚成本 低:停两进程 + 删 cds.license.dat 与 .cadence/

3.5 分步操作

步骤 1:只读摸底

确认「变更前是什么样」,为回滚与取证留基线。本机无 lmgrd 相关进程即证明变更前服务未运行。

ssh root@192.168.31.29 'hostname; date "+%F %T"
ps -eo pid,ppid,comm | awk "\$3==\"lmgrd\" || \$3==\"cdslmd\"" || echo 无进程
ss -lnt | grep -E ":5280|:5281" || echo 无监听
ls -l /opt/FlexLM/Cadence/; ls -l /lib64/ld-lsb-x86-64.so.3
firewall-cmd --list-ports; getenforce; df -h /opt | tail -1'

预期:无 lmgrd/cdslmd 进程、5280/5281 无监听、目录内仅 4 个文件(无 license)、解释器链接存在、放行 5280/tcp 5281/tcp、Enforcing、/ 余约 18G。 失败判断:SSH 不通或目录缺失 → 中止,与用户核对主机与路径。

坑(进程匹配):ps -ef | grep -E "lmgrd|cdslmd" 会命中承载本次 SSH 脚本的 shell 自身(其命令行即脚本正文、含这两个词),产生假阳性;判断进程须按进程名匹配(ps -eo pid,ppid,comm | awk '$3=="lmgrd"||$3=="cdslmd"')。同理,停进程勿用 pkill -f 加完整路径(见步骤 3 坑④)。

步骤 2:本地生成服务端 license 文件

包内 license.dat 是纯 FEATURE 行,需在头部补 SERVER/DAEMON 两行才可用于服务端。

坑①(折行格式):该 license 由 lmcrypt -r 生成,一条 FEATURE 逻辑记录跨 8 行左右、行尾以 \ 续行(605 条 FEATURE 占 4827 物理行)。这是 FlexNet 合法的续行写法,实测 cdslmd v11.16 接受,不要手工压成单行(若将来某版本拒绝,可用 awk 合并续行生成单行版,见 artifacts/cds.license.singleline.dat,本次未启用)。 坑②(CRLF):包内文件可能带 Windows 行尾,须 tr -d '\r' 清理,否则行尾 \r 会被当作内容。 坑③(用 IP 不用主机名):SERVER 行写 192.168.31.29。客户端解析不了主机名 Flexlm(RUNBOOK.md 场景 E),写 IP 一处生效、新节点免配。

cd <交付目录>/license_srv_20260926
mkdir -p backup/opt/FlexLM/Cadence logs artifacts
unzip -p "<介质>/08.cadence_license.zip" 08.cadence_license/license.dat | tr -d '\r' > artifacts/license.dat
printf 'SERVER 192.168.31.29 525400310e02 5280\nDAEMON cdslmd /opt/FlexLM/Cadence/cdslmd port=5281\n' > artifacts/cds.license.dat
cat artifacts/license.dat >> artifacts/cds.license.dat
head -3 artifacts/cds.license.dat
echo "lines=$(wc -l < artifacts/cds.license.dat) features=$(grep -c '^FEATURE' artifacts/cds.license.dat)"
sha256sum artifacts/cds.license.dat

预期(本次实测):头两行为 SERVER 192.168.31.29 525400310e02 5280 与 DAEMON cdslmd /opt/FlexLM/Cadence/cdslmd port=5281;lines=4829、features=605;sha256 128c93291de95e4d32eb03e866c344e79c5ddfa330e66578eb5ead6bb103bb3b。 失败判断:features 不足 605 → 解压不完整,重取;头行端口/路径与实际不符 → 先改正再继续。

步骤 3:旁路试读(隔离验证,不碰生产)

部署前先用临时目录 + 独立端口验证「折行格式」与「2015 年老签名/V7.1_LK 能否被 v11.16 的 cdslmd 接受」两个未验证点。测试实例与生产互不影响,失败零成本。

坑④(pkill -f 会自杀):pkill -f <带完整路径的模式> 会匹配到承载本次 SSH 脚本的 shell 自身(其命令行即脚本正文,含该模式),导致 SSH 会话被杀、返回码 255 且无输出、后续命令全不执行。停进程一律用按进程名匹配(pkill lmgrd / pkill cdslmd),不要用 -f 加路径。

sed -e 's#^SERVER .*#SERVER 192.168.31.29 525400310e02 5282#' \
    -e 's#^DAEMON .*#DAEMON cdslmd /opt/FlexLM/Cadence/cdslmd port=5283#' \
    artifacts/cds.license.dat > artifacts/test_folded.dat
ssh root@192.168.31.29 'mkdir -p /tmp/lic_test'
scp -q artifacts/test_folded.dat root@192.168.31.29:/tmp/lic_test/
ssh root@192.168.31.29 '
D=/opt/FlexLM/Cadence
setsid nohup "$D/lmgrd" -c /tmp/lic_test/test_folded.dat -l /tmp/lic_test/test.log </dev/null >/dev/null 2>&1 &
sleep 7
ss -lnt | grep -E ":5282|:5283"
grep -inE "error|invalid|fail|signature|wrong|denied|cannot" /tmp/lic_test/test.log || echo 无错误
grep -iE "Server started on|HostID" /tmp/lic_test/test.log | tail -4'

预期(本次实测):5282/5283 处于 LISTEN;日志出现 Server started on 192.168.31.29 for: 后接全部 feature 名列表;HostID node-locked in license file: 525400310e02 与 HostID of the License Server: 525400310e02 一致;错误扫描为空。 失败判断:出现 Invalid license file syntax / signature / Wrong hostid → 换单行格式或换 SERVER 行 hostid 再试;连续两次失败即停并回报用户。

测试完成后停实例并清理(/tmp/lic_test 内会生成 .cadence 状态目录,须一并删):

ssh root@192.168.31.29 'pkill lmgrd; pkill cdslmd; sleep 3
ps -eo comm | grep -cE "^(lmgrd|cdslmd)$" || echo 无进程
rm -rf /tmp/lic_test; [ -d /tmp/lic_test ] && echo 残留未清 || echo 已清理'

步骤 4:部署到 /opt 并核对哈希

scp -q artifacts/cds.license.dat root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat
sha256sum artifacts/cds.license.dat
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat; ls -l /opt/FlexLM/Cadence/'

预期:两端 sha256 一致(128c93291de9…bb103bb3b);远端目录出现 cds.license.dat(266661 字节)。 失败判断:哈希不一致 → 重新 scp,不得继续启动。

步骤 5:启动服务

坑⑤(后台进程被回收):本工程执行通道会回收普通后台进程,必须 setsid nohup … & 且 stdin/stdout/stderr 全部重定向,否则进程被连带杀死。 坑⑥(日志被截断):lmgrd -l <file> 启动时截断重写日志文件,旧内容不保留(本次实测:启动后日志第 1 行即本次启动时间,变更 2 遗留的 16936 字节日志被覆盖)。需要留历史日志时,必须在启动前先归档。 坑⑦(.cadence 状态目录):cdslmd 在 license 文件所在目录创建 .cadence/(权限 777),该目录须可写;回滚时一并清理。

ssh root@192.168.31.29 '
D=/opt/FlexLM/Cadence
cp -p "$D/lmgrd.log" "/root/lmgrd.log.$(date +%Y%m%d-%H%M%S)" 2>/dev/null   # 可选:启动前归档旧日志
setsid nohup "$D/lmgrd" -c "$D/cds.license.dat" -l "$D/lmgrd.log" </dev/null >/dev/null 2>&1 &
sleep 8
ps -eo pid,ppid,comm | awk "\$3==\"lmgrd\" || \$3==\"cdslmd\""
ss -lnt | grep -E ":5280|:5281"'

预期:两个进程(cdslmd 的 PPID = lmgrd 的 PID);*:5280 与 *:5281 LISTEN。 失败判断:只有 lmgrd 无 cdslmd → 查日志 Running on Hypervisor 前的内容,按第 7 章回滚;连续两次失败即停。

步骤 6:验证与留档

ssh root@192.168.31.29 '
grep -inE "error|invalid|fail|signature|wrong|denied|cannot" /opt/FlexLM/Cadence/lmgrd.log || echo 无错误
grep -iE "Server started on|HostID|using TCP-port" /opt/FlexLM/Cadence/lmgrd.log'
scp -q root@192.168.31.29:/opt/FlexLM/Cadence/lmgrd.log "<交付目录>/logs/lmgrd-startup-$(date +%Y%m%d-%H%M%S).log"

预期:错误扫描为空;日志含 cdslmd using TCP-port 5281、HostID node-locked in license file: 525400310e02、HostID of the License Server: 525400310e02。

3.6 验证

判据 命令 本次实测结果
进程存活 ps -eo pid,ppid,comm \| awk '$3=="lmgrd"\|\|$3=="cdslmd"' lmgrd pid 22552、cdslmd pid 22554(PPID 22552)
端口监听 ss -lnt \| grep -E ":5280\|:5281" *:5280、*:5281
日志零错误 grep -inE "error\|invalid\|fail\|signature\|wrong\|denied" /opt/FlexLM/Cadence/lmgrd.log 无匹配
HostID 匹配 同上日志 grep HostID 两行均 525400310e02
feature 全量注册 awk '/Server started on/{f=1;next} f&&/\(cdslmd\)/&&!/SLOG/{...n+=NF} END{print n}' 619(≈605 条 FEATURE + 少量说明词)
客户端可达 `bash -c '