SOP — Cadence license 接入:modulefile 变量 + 服务端打通(2026-09-26)¶
变更目录:
ic25_modulefile_lic_20260926/;执行人:Agent(用户确认后执行) 跨两个工程:slurm_ins(modulefile 唯一来源)与 license 服务主机192.168.31.29前置变更:license_srv_20260926/(license 服务首启);关联:ic25_install_20260924/
1. 背景¶
license_srv_20260926 变更已让 license 服务在 192.168.31.29(Flexlm)跑起来,但客户端拿不到许可:
- 客户端的 Lmod modulefile 里没有 license 变量(ic25 HANDOFF 待办 #1 剩余部分);
- 客户端到
31.29:5280网络被 firewalld 拦截(实测No route to host)。
用户要求"配置 ic25 modulefile 并验证 checkout",并在方案确认环节选择"放行 5280/5281 并固定 cdslmd 端口"。
2. 目标¶
module load cadence virtuoso/IC25.10.000后CDS_LIC_FILE/LM_LICENSE_FILE就绪;- 任一客户端可查询 license 服务状态(lmstat 返回 UP);
- 完成一次真实 checkout 测试,给出可用/不可用的明确结论与证据。
3. 前置条件¶
squeue为空(--module-env红线,实测 0 行);- root 免密可至
192.168.31.16/.18/.28/.29(--module-env目标节点 + license 主机); - slurm_ins 工程 venv:
/home/rain/Documents/slurm/slurm_ins/.venv/bin/python; - 无需停服;无在跑作业;该变更不触发 slurmd 重启(同 SOP 5.12 实测口径)。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 配置侧 | slurm_ins/config/slurm_deploy.yaml(+.example) 的 families.cadence.tools[virtuoso].env |
| 渲染产物 | NFS 共享 /opt/modulefiles/cadence/virtuoso/IC25.10.000.lua(全集群一次生效) |
| 服务侧 | 31.29 的 cds.license.dat(DAEMON 行固定端口)、firewalld(放行 5280/5281) |
| 是否停服 | license 服务需重启一次(当时无任何客户端在用) |
| 窗口期 | 任意(客户端此前无法使用 license,无依赖方) |
5. 分步操作¶
步骤 1:备份(改前必做)¶
坑:sandbox 不允许写 /home/rain/Documents/slurm/(工程目录外写入被拦),故配置备份落在本交付物目录的 backup/slurm_ins/...;该 yaml 含 LDAP 凭据(权限 600),不得外传。
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p ic25_modulefile_lic_20260926/backup/slurm_ins/config ic25_modulefile_lic_20260926/backup/opt/FlexLM/Cadence
cp /home/rain/Documents/slurm/slurm_ins/config/slurm_deploy.yaml{,.example} \
ic25_modulefile_lic_20260926/backup/slurm_ins/config/ # 实际带 .bak.$TS 后缀命名
scp root@192.168.31.29:/opt/FlexLM/Cadence/cds.license.dat \
ic25_modulefile_lic_20260926/backup/opt/FlexLM/Cadence/cds.license.dat.bak.$TS
sha256sum ic25_modulefile_lic_20260926/backup/opt/FlexLM/Cadence/cds.license.dat.bak.$TS
ssh root@192.168.31.29 'sha256sum /opt/FlexLM/Cadence/cds.license.dat' # 两侧须一致
预期:哈希一致(本次 ed631b9a…7ba2);不一致则重拉,不得继续。
步骤 2:modulefile 补 license 变量并渲染¶
modulefile 由 slurm_ins 部署器从 yaml 渲染,红线禁止手改 /opt/modulefiles/*。改 env 段即可(env 渲染为 setenv;LD_LIBRARY_PATH 必须留在 prepend,见 SOP 5.12)。
# 编辑 /home/rain/Documents/slurm/slurm_ins/config/slurm_deploy.yaml(.example 同步)
# families.cadence.tools[virtuoso].env:
# CDS_INST_DIR: "/tools/cadence/virtuoso/IC25.10.000"
# CDS_LIC_FILE: "5280@192.168.31.29"
# LM_LICENSE_FILE: "5280@192.168.31.29"
cd /home/rain/Documents/slurm/slurm_ins
.venv/bin/python main.py --config config/slurm_deploy.yaml --module-env --dry-run # 预期 待变更 1(IC25.10.000.lua)、幂等跳过 26、RC=0
.venv/bin/python main.py --config config/slurm_deploy.yaml --module-env # 真实执行,预期 RC=0
.venv/bin/python main.py --config config/slurm_deploy.yaml --module-env # 复跑,预期 待变更 0、全跳过(幂等)
预期:渲染后 /opt/modulefiles/cadence/virtuoso/IC25.10.000.lua 含两行 setenv("…LIC…")。
失败判断:RC≠0 或 health 失败 → 看日志定位;本变更不动 TaskProlog,不应重启 slurmd。实现体:module_env_deployer.py / module_env_assets.py(render_tool_module)。
步骤 3:固定 cdslmd 端口并重启服务¶
坑:license 里 DAEMON 行不写 port= 时 cdslmd 用随机高位端口(首次为 59583),重启即变,防火墙规则随之失效——必须固定。
坑:lmdown 权限为 -rw-r--r--(不可执行),不能用它停服务;且 pkill -f "/opt/FlexLM/Cadence/lmgrd" 会匹配到执行该命令的 ssh shell 自身导致会话中断(实测踩中,后续命令未执行)——用精确模式或先取 PID。
ssh root@192.168.31.29 'F=/opt/FlexLM/Cadence/cds.license.dat
sed -i -E "2s|^(DAEMON +cdslmd +[^ ]+).*$|\1 port=5281|" "$F"
sed -n "2p" "$F" # 预期 DAEMON cdslmd /opt/FlexLM/Cadence/cdslmd port=5281
pkill -f "[l]mgrd"; sleep 2 # 注意 [l] 写法避免匹配自身
setsid nohup /opt/FlexLM/Cadence/lmgrd -c "$F" -l /opt/FlexLM/Cadence/lmgrd.log </dev/null >/dev/null 2>&1 &
sleep 8
ss -lntp | grep -E "lmgrd|cdslmd" # 预期 5280 与 5281 均 LISTEN
grep -i "Listening port" /opt/FlexLM/Cadence/lmgrd.log | tail -1 # 预期 5281'
失败判断:只有 5280 无 5281 → DAEMON 行未生效,检查行内容后重启;服务起不来 → 查日志与第 7 章回滚。
步骤 4:firewalld 放行¶
坑:firewalld 默认 reject 会让客户端报 No route to host(ICMP 拒绝),而 ping 仍通——只看 ping 会误判网络正常;应直接测 TCP(/dev/tcp 或 nc)。
ssh root@192.168.31.29 'firewall-cmd --permanent --add-port=5280/tcp
firewall-cmd --permanent --add-port=5281/tcp
firewall-cmd --reload
firewall-cmd --list-ports' # 预期 5280/tcp 5281/tcp
步骤 5:客户端验证(含诊断)¶
ssh root@192.168.31.18 'bash -lc "
source /etc/profile.d/zzz_site_lmod.sh >/dev/null 2>&1
module load cadence virtuoso/IC25.10.000
echo \$CDS_LIC_FILE # 预期 5280@192.168.31.29
L=\$CDS_INST_DIR/tools.lnx86/bin/lmutil
\$L lmstat -c 5280@192.168.31.29 -a | head -12
\$L lmdiag -c 5280@192.168.31.29 -n 100 # 真实 checkout 测试
"'
预期:license server UP + cdslmd: UP + feature 列表;lmdiag 给出 checkout 结论。
失败判断见第 6 章"本次实测结论"与第 8 章。
步骤 6:临时诊断项回滚¶
诊断"主机名解析"假设时曾在 .18:/etc/hosts 临时加 192.168.31.29 Flexlm,测毕必须移除(本次已移除并复验不可解析)。
ssh root@192.168.31.18 'sed -i "/临时测试:license 服务器主机名解析/d" /etc/hosts; getent hosts Flexlm || echo 已恢复不可解析'
6. 验证¶
| 判据 | 命令/位置 | 实测结果 |
|---|---|---|
| modulefile 变量 | .18 load 后 echo $CDS_LIC_FILE |
5280@192.168.31.29 ✓ |
| 渲染幂等 | --module-env 复跑 |
待变更 0、幂等跳过 27、RC=0 ✓ |
| TCP 可达 | .18 → 31.29:5280/5281 |
放行前 No route to host,放行后均 OK ✓ |
| 服务查询 | lmstat -c 5280@192.168.31.29 |
修复主机名解析后:Flexlm: UP (MASTER)、cdslmd: UP、feature 99 席 ✓ |
| 真实 checkout(客户端) | .18 lmdiag -n 100 |
✗ Invalid host,FlexNet Licensing error:-9,57 |
| 真实 checkout(服务端本机) | 31.29 lmdiag -c 5280@127.0.0.1 -n 100 |
✓ This license can be checked out |
根因(有证据):license 全部 268 条 FEATURE 行形如
FEATURE <name> cdslmd 2020.12 30-dec-2030 99 HOSTID=525400310e02 …,
带 HOSTID=<MAC> 即为 node-locked(锁定到 license 服务器自身网卡 52:54:00:31:0e:02),
lmdiag 亦明确标注 nodelocked license, locked to ethernet address。
⇒ 该 license 只能被 31.29 本机使用,集群客户端(.18-.20/.25-.27/.28)无法 checkout,与集群配置无关。
附带风险(服务端本机通过不代表客户端可用):268/268 条 FEATURE 的版本字段为 2020.12,低于实际工具 IC25.10,即使换成 floating 版本,客户端仍可能报 "version too new"。
7. 回滚¶
备份位置:ic25_modulefile_lic_20260926/backup/(台账见 backup/README.md)。
# 1) modulefile 配置回滚(去掉 license 变量)
cp ic25_modulefile_lic_20260926/backup/slurm_ins/config/slurm_deploy.yaml.bak.<TS> \
/home/rain/Documents/slurm/slurm_ins/config/slurm_deploy.yaml
cp ic25_modulefile_lic_20260926/backup/slurm_ins/config/slurm_deploy.yaml.example.bak.<TS> \
/home/rain/Documents/slurm/slurm_ins/config/slurm_deploy.yaml.example
cd /home/rain/Documents/slurm/slurm_ins && .venv/bin/python main.py --config config/slurm_deploy.yaml --module-env
# 2) license 文件回滚(含端口固定部分)
scp ic25_modulefile_lic_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' # 期望 ed631b9a…7ba2
# 3) 防火墙回滚(如不再需要)
ssh root@192.168.31.29 'firewall-cmd --permanent --remove-port=5280/tcp; firewall-cmd --permanent --remove-port=5281/tcp; firewall-cmd --reload'
回滚后验证:module load 后 echo $CDS_LIC_FILE 为空;firewall-cmd --list-ports 不含 5280/5281。
8. 风险说明¶
| 风险 | 说明 | 缓解 |
|---|---|---|
| license 类型不可用(已实测) | node-locked,客户端 checkout 被拒(-9,57) | 需版权方提供 floating license:FEATURE 行去掉 HOSTID=… 段(SERVER 行保留 hostid 用于保护文件) |
| 版本字段偏低 | 268 条 FEATURE 全为 2020.12,工具为 IC25.10 |
换 license 时一并要求覆盖当前版本 |
| 客户端需能解析主机名 | license 的 SERVER 行为主机名 Flexlm;客户端(含未来新节点)解析不到时 lmstat 报 lmgrd is not running (-96) |
二选一:① license SERVER 行改 IP(推荐,一处生效);② 各客户端 /etc/hosts 加条目(注意 slurm 部署器管理 hosts 块,勿手改块内) |
| modulefile 变量已下发 | 变量本身无害,但 license 不可用期间 module load 后工具仍起不来 |
保留即可;换 license 后无需再改 modulefile |
| 服务无 systemd 常驻 | 31.29 重启后 lmgrd 丢失 | 见 license_srv_20260926/docs/RUNBOOK.md 第 4/8 章 |
附录:交付物清单¶
| 路径(相对本目录) | 内容 |
|---|---|
docs/SOP.md |
本文件 |
backup/README.md |
备份台账(含跨工程的 slurm yaml 与远端 license) |
backup/slurm_ins/config/*.bak.20260926-145859 |
配置回滚源(含凭据,勿外传) |
backup/opt/FlexLM/Cadence/cds.license.dat.bak.20260926-145859 |
远端 license 回滚源(ed631b9a…7ba2) |
同步更新:license_srv_20260926/docs/RUNBOOK.md(端口 5281、防火墙、解析坑、node-locked 限制)。
来源:
/home/rain/Documents/eda_tools_ins/Cadence/ic25_modulefile_lic_20260926/docs/SOP.md| 最后更新:2026-09-26 15:04(由build/sync.py同步,请勿在站点侧修改)