跳转至

SOP — Synopsys module 体系修复与验证

变更日期:2026-09-29 执行主机:本机(宿主 192.168.31.249,兼 NFS 服务端) 影响面:31.28 + 六台 work 节点 类别:C 类

1. 背景

对 module load synopsys && module load eda2018/1.0 全链路做核对,发现三类问题:

  1. 悬空 module:synopsys/vcs/2023.12.lua 指向不存在的 /opt/eda/synopsys/vcs/2023.12,且 license 写为占位值 27020@lic-server。该文件有 isDir 守卫,load 时会直接报错(不会污染环境),但它出现在 module avail 中会造成误导;且它与 eda2018/1.0 属不同 family(synopsys_vcs vs synopsys_eda),一旦将来指向真实路径,会与主 module 的 license 设置冲突。
  2. SCL 未纳入 PATH:scl/2018.06/linux64/bin 内含 lmutil/lmgrd/snpslmd,但 module 未加入该路径,客户端无法查询 license。
  3. xa(CustomSim)不可用:bin/xa_fh 只有一行 echo /data/nfs/tools/synopsys/xa/K-2015.06-SP5 —— 安装期(宿主视角)硬编码路径。客户端挂载点是 /tools,故 XA_HOME 指向不存在路径,捆绑 gcc 找不到,报 Error: XA is not properly installed.

2. 目标

  1. module avail 只呈现真实可用项;
  2. SCL 三命令可解析,且 lmutil lmstat 能查到 license 服务;
  3. xa 在宿主与客户端两种视角下均可用;
  4. 31.28 与六台变量一致;
  5. 实现体幂等:复跑零变更、全跳过。

3. 前置条件

  • 需 root:/data/nfs/modulefiles 与 /data/nfs/tools 均属 root;实测本机 sudo -n 免密可用;
  • 本机即 NFS 服务端,改动经导出路径对客户端即时可见——无需逐台分发、无需重挂载、无需动 fstab/exports;
  • 判定依据:module avail 行为 + 各工具入口实测。

4. 影响范围

项 说明
涉及主机 31.28 与六台 work(.18/.19/.20/.25/.26/.27)
涉及文件 改 modulefiles/synopsys/eda2018/1.0.lua;移出 modulefiles/synopsys/vcs/2023.12.lua;改写 tools/synopsys/xa/K-2015.06-SP5/bin/xa_fh
是否停服 否;不影响 license 服务、调度器、在跑作业
生效时机 新开的 module 会话;已加载的旧会话需 module purge 或重登

5. 分步操作

实现体:fix_modules.py(默认 dry-run,--apply 才改动;幂等)。

步骤 1:备份(任何改动之前)

TS=$(date +%Y%m%d-%H%M%S)
BK=/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_module_fix_20260929/backup/data/nfs
sudo mkdir -p "$BK/modulefiles/synopsys/eda2018" "$BK/modulefiles/synopsys/vcs" "$BK/tools/synopsys/xa/K-2015.06-SP5/bin"
sudo cp -a /data/nfs/modulefiles/synopsys/eda2018/1.0.lua        "$BK/modulefiles/synopsys/eda2018/1.0.lua.bak.$TS"
sudo cp -a /data/nfs/modulefiles/synopsys/vcs/2023.12.lua        "$BK/modulefiles/synopsys/vcs/2023.12.lua.bak.$TS"
sudo cp -a /data/nfs/tools/synopsys/xa/K-2015.06-SP5/bin/xa_fh   "$BK/tools/synopsys/xa/K-2015.06-SP5/bin/xa_fh.bak.$TS"

预期:三个 .bak 就位;台账见本主题 backup/README.md。

步骤 2:补入 SCL PATH 入口(幂等)

在 entries 表的 Identify 行之后插入(脚本按唯一锚点替换,锚点计数 ≠1 时拒绝修改并退出):

    { "SCL",             tools .. "/scl/2018.06/linux64/bin" },

并在 help 的可用命令清单后补一行:lmutil lmgrd snpslmd(SCL 2018.06,用于查询与管理 license)。

预期:grep -n "scl/2018.06" 1.0.lua 命中第 59 行、help 命中第 80 行。

步骤 3:确认悬空 module 状态(2026-10-05 起不再删除)

# 2026-10-05 起本脚本不再删除该文件,只做确认;退役清理由 slurm 侧 --module-env 完成
test -e /data/nfs/modulefiles/synopsys/vcs/2023.12.lua \
  && echo "WARN: 仍存在(应由 slurm 侧 --module-env 退役清理)" \
  || echo "OK: 已不存在(slurm 侧已退役)"

历史与坑(2026-09-29 → 2026-10-05):本步骤原为「mv 移出悬空 module」——该文件由 slurm 部署器(slurm_ins 侧)按 config/slurm_deploy.yaml 生成,部署器复跑会重建,于是形成 「生成—删除」拉锯(交接单 eda_tools_ins/docs/LMOD-CROSS-PROJECT-TODO.md §2-A)。2026-10-05 跨工程收敛:slurm 侧删除 yaml 条目并把该路径登记进 obsolete_module_file_dirs(部署时备份后 清理),本脚本据此移除删除逻辑、改为幂等确认。侧别口径:同一模块只在一个地方定义。

预期:脚本输出 OK synopsys/vcs/2023.12.lua 已不存在;module avail 的 synopsys 树只剩 eda2018/1.0 与 vcs-el7/1.0。变更档案:eda_tools_ins/lmod_cross_project_fix_20261005/。

步骤 4:修正 xa 的安装根记录(高危,改写工具树文件)

xa_fh 由"硬编码安装路径"改为"动态推导自身位置",写后恢复原权限位:

#!/bin/sh
_p=$(readlink -f "$0" 2>/dev/null) || _p="$0"
echo "$(dirname "$(dirname "$_p")")"

坑:工具树经 NFS 以 ro 导出给客户端,只能在服务端改;且工具重装会复原该文件。

预期:宿主执行输出 /data/nfs/tools/synopsys/xa/K-2015.06-SP5;客户端执行输出 /tools/synopsys/xa/K-2015.06-SP5(两者都正确)。

6. 验证(全部为实测)

# 判据 命令 结果
1 加载链 module load synopsys → MODULEPATH 含 /opt/modulefiles/synopsys;module load eda2018/1.0 rc=0 ✔
2 avail 收敛 module avail synopsys 树只剩 eda2018/1.0,vcs/2023.12 已消失 ✔
3 关键变量 SG_CONSOLE_SE=1、EDA_COMPAT_FAKE_UNAME=1、VCS_USE_MALLOC=1、SNPSLMD_LICENSE_FILE=2700@192.168.31.29、LD_PRELOAD=…synopsys_compat/libexec/libpthread.so.0:/lib64/libz.so.1 全部正确 ✔
4 SCL lmutil lmstat -c 2700@192.168.31.29 License server UP (MASTER) v11.14.1 ✔
5 xa xa -h 打印 CustomSim (R) Version K-2015.06-SP5,不再报安装不完整 ✔
6 六台一致 逐台 module load 后比对变量 + dc_shell -version 六台 LIC/SG/malloc 全部一致、dc_shell version - O-2018.06-SP1 ✔
7 幂等 复跑 --apply 三项全 SKIP、零变更 ✔

工具级验证矩阵见附录 B。

7. 回滚

BK=/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_module_fix_20260929/backup/data/nfs
# 本次实际时间戳:modulefile 原始版=20260929-012223(**回滚用这份**;012459 是已含 SCL 的中间态,不是回滚点)
#                  xa_fh=20260929-012459
sudo cp -a "$BK/modulefiles/synopsys/eda2018/1.0.lua.bak.20260929-012223"        /data/nfs/modulefiles/synopsys/eda2018/1.0.lua
sudo cp -a "$BK/tools/synopsys/xa/K-2015.06-SP5/bin/xa_fh.bak.20260929-012459"   /data/nfs/tools/synopsys/xa/K-2015.06-SP5/bin/xa_fh
sudo mkdir -p /data/nfs/modulefiles/synopsys/vcs
sudo cp -a "$BK/modulefiles/synopsys/vcs/2023.12.lua.removed"                    /data/nfs/modulefiles/synopsys/vcs/2023.12.lua
  • 回滚触发判据:任一工具在 module 加载后出现启动异常,或 dc_shell/vcs/spyglass 冒烟失败;
  • 回滚后验证:module load synopsys && module load eda2018/1.0 正常、dc_shell -version 有版本输出;
  • 备份位置与逐条登记:本主题 backup/README.md(备份文件在 backup/data/nfs/… 下按原路径层次存放)。

8. 风险说明

风险 缓解
部署器复跑重建悬空 vcs/2023.12.lua 已记录;复跑后重做步骤 3,或改部署器清单(同一事实只在一处)
工具重装复原 xa_fh 重装后需重做步骤 4;现象固定为 XA is not properly installed
modulefile 改动影响面广(NFS 共享) 只增一条 PATH 与一行 help,不动 LD_PRELOAD/license 等关键变量;改动前后均有备份
已加载的旧会话不生效 需 module purge 或重登

附录 A:交付物清单

文件 说明
fix_modules.py 实现体:备份 / 补 SCL / 移悬空 / 修 xa_fh,幂等,dry-run 默认
backup/README.md 备份台账(3 项备份 + 1 项移出记录)
docs/SOP.md(本文件) 变更档案
docs/RUNBOOK.md module 使用手册:加载/确认/作业脚本用法、故障处置 8 个场景、配置与备份、工具入口对照表
record/(无) 本次为可回滚变更,留档以 backup/ 为准

附录 B:工具级验证矩阵(2026-09-29,31.28 实测)

工具入口 命令 结果
dc_shell -version O-2018.06-SP1 ✔(六台同)
pt_shell -version / 实跑最小脚本 版本 O-2018.06-SP1;打印 MEM Error: internal memory allocation error.,但最小脚本实测跑通(659 MB / 7 s,正常退出)→ 记为已知噪声
pwr_shell -version 版本 O-2018.06-SP3;同样打印 MEM Error(同上)
icc2_shell -version O-2018.06-SP1(Jul 17 2018)✔
fm_shell -version Formality O-2018.06-SP1 ✔
lc_shell -version O-2018.06-SP1 ✔
vcs -ID 可运行;有 LNX_OS_VERUN 未支持发行版告警(既有,非本次引入)
spyglass -version 正常;有 lsb_release: command not found 噪声(既有)
hspice -v N-2017.12-SP2 linux64 ✔
siliconsmart 启动 打印 SiliconSmart (R) ✔
xa -h CustomSim (R) K-2015.06-SP5 ✔(本次修复)
lmutil lmstat server UP ✔(本次新增入口)
StarXtract -version 该工具无 -version 选项(SX-0218),需换参数验证
tmax 启动 报 DISPLAY variable was not set → 需图形环境,无头不适用
verdi / wv / synplify 启动 属 GUI/交互工具,无头 15 s 内未返回,未做无头判定
custom_compiler 启动 Error: Incomplete installation. OpenAccess is missing or improperly installed. → 缺 OA,见附录 C
identify 启动 工具树内无 identify 命令;实际入口为 identify_debugger / identify_debugger_shell(PATH 已正确加入)

附录 C:已知问题(本次不处理,需另行决策)

问题 现象 根因/方向
custom_compiler 缺 OA OpenAccess is missing or improperly installed 工具树 customcompiler/N-2017.12-SP1-2 内无 OA 组件;Cadence 侧有 oa_v22.50.036(/tools/cadence/virtuoso/IC617)。方向:确认 Custom Compiler 所需的 OA 版本与来源,必要时补装或设 OA_HOME
pt/pwr 的 MEM Error -version 时打印,实跑正常 未定位;不影响最小脚本运行,暂记为噪声
tmax 需 DISPLAY 无头下拒绝启动 需在 VNC 环境使用

来源:/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_module_fix_20260929/docs/SOP.md | 最后更新:2026-10-05 15:35(由 build/sync.py 同步,请勿在站点侧修改)