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. 目标¶
变更完成后应达到:
lmgrd与cdslmd进程常驻运行;- lmgrd 监听
5280/tcp(license 端口),cdslmd 监听动态端口; lmgrd.log中无error / invalid / fail / signature类记录;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 目标¶
lmgrd与cdslmd进程停止,5280/5281无监听;- 远端
/opt/FlexLM/Cadence/cds.license.dat不存在,lmgrd/cdslmd/lmdown/lmgrd.log保留; - 本机
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行绑定本机 MAC525400310e02;④ 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.dat88 条 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 目标¶
192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat存在,结构 = 2 行头(SERVER/DAEMON)+ 605 条FEATURE;lmgrd监听5280/tcp、cdslmd固定5281/tcp,两进程常驻且父子关系正确;- 启动日志零
error / invalid / signature / wrong / denied;HostID node-locked in license file与HostID of the License Server一致; - 客户端侧
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 ' |