SOP — Synopsys module 体系修复与验证¶
变更日期:2026-09-29 执行主机:本机(宿主
192.168.31.249,兼 NFS 服务端) 影响面:31.28 + 六台 work 节点 类别:C 类
1. 背景¶
对 module load synopsys && module load eda2018/1.0 全链路做核对,发现三类问题:
- 悬空 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_vcsvssynopsys_eda),一旦将来指向真实路径,会与主 module 的 license 设置冲突。 - SCL 未纳入 PATH:
scl/2018.06/linux64/bin内含lmutil/lmgrd/snpslmd,但 module 未加入该路径,客户端无法查询 license。 - 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. 目标¶
module avail只呈现真实可用项;- SCL 三命令可解析,且
lmutil lmstat能查到 license 服务; - xa 在宿主与客户端两种视角下均可用;
- 31.28 与六台变量一致;
- 实现体幂等:复跑零变更、全跳过。
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同步,请勿在站点侧修改)