跳转至

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)跑起来,但客户端拿不到许可:

  1. 客户端的 Lmod modulefile 里没有 license 变量(ic25 HANDOFF 待办 #1 剩余部分);
  2. 客户端到 31.29:5280 网络被 firewalld 拦截(实测 No route to host)。

用户要求"配置 ic25 modulefile 并验证 checkout",并在方案确认环节选择"放行 5280/5281 并固定 cdslmd 端口"。

2. 目标

  1. module load cadence virtuoso/IC25.10.000 后 CDS_LIC_FILE / LM_LICENSE_FILE 就绪;
  2. 任一客户端可查询 license 服务状态(lmstat 返回 UP);
  3. 完成一次真实 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 同步,请勿在站点侧修改)