SOP — Synopsys VCS + Verdi X-2025.06-SP1 NFS 安装(synopsys_install_20260926)¶
交付物目录:
Synopsys/synopsys_install_20260926/(本文档路径均相对该目录)。 变更日期:2026-09-26;实施主体:安装宿主 dell-R620(192.168.31.249/250,NFS server)。
目录¶
1. 背景¶
Cadence IC25.10 已按「安装宿主单机变更 → NFS 导出 /data/nfs/tools/<vendor>/<tool>/<version> →
六台客户端 /tools 只读可见」模式落地。本次为第二家 vendor:安装 Synopsys VCS 与 Verdi
(同一发行版 X-2025.06-SP1),复用同一套环境事实(NFS 拓扑、六台客户端、root SSH 免密、
调度器零作业窗口)与同一套 Python 部署工程模式(venv + 配置真源 + 幂等子命令 + 门禁 +
备份台账)。
license 策略沿用 Cadence 决策:后补——装完只做「树存在、客户端可见、ldd/二进制可执行」
级静态验证,SNPSLMD_LICENSE_FILE 与 SCL server 就绪前不验证工具启动,modulefile 不在本次范围。
2. 目标¶
变更完成后应达到的可验证状态(2026-09-26 03:16 实测全部达成):
- 三棵树就绪(合计 69G):
/data/nfs/tools/synopsys/vcs/X-2025.06-SP1/bin/vcs、verdi/X-2025.06-SP1/bin/verdi、verdi_supp/X-2025.06-SP1/bin/fsdbprof(verdi_supp 为 supplemental 独立产品,装入独立树,一并纳入探测/权限/回滚管理) - 安装树
root:root、目录 755/文件 644、group/other 无写位 - 本地与六台客户端(.18-.20 slurm、.25-.27 lsf)
/tools/synopsys可见 - ldd 静态检查:
linux64/bin/vcs1、bin/fsdbprofnot found=0;platform/linux64/bin/novas、bin/gf_slave的 not found 全部由树内库闭合,树外真缺=0(本地 + 六台) - 工具门禁全绿:
precheckRC=0、install幂等复跑 skipped RC=0、verifyRC=0、driftRC=0 - 3 个损坏介质卷已隔离入
backup/media_quarantine/并登记台账
3. 前置条件¶
均为执行前检查项,已落为 main.py precheck 可执行检查(BLOCK 即禁止变更):
- 权限:root SSH 免密到六台客户端(
setup_credentials(username=root));宿主sudo -n免密 - 介质:
checksum_info.txtcksum+size 全量通过(深度层,缓存reports/media_verify.json);.run的 sha256 与installer_INSTALL_README.txt公布值一致(来源锁定,无跳过开关) - 工具:Synopsys Installer v5.9(
SynopsysInstaller_v5.9.run,介质根../下) - 环境:
/data可用空间 ≥30G(实测 1.2T);六台squeue/bjobs零作业;OS Rocky 9.x、 时钟偏移 <5s、SELinux 非 Enforcing - 执行身份:venv 已建、共享库
.pth已挂载(precheck的 check_local 覆盖)
4. 影响范围¶
- 主机:变更仅落安装宿主 dell-R620 单机(写
/data/nfs/tools/synopsys、 介质目录隔离移动、工程内scratch/、config/generated/)。六台客户端只读验证,无任何变更。 - 组件:新增 Synopsys 工具树;NFS 导出(
/data/nfs/tools)内容变化,客户端经既有/tools挂载自动可见——未改 exports、未改 fstab、未重启任何服务。 - 停服:无需停服。窗口约束 = 变更期间六台节点无调度器作业(precheck 强制)。
- 作业:实施时(2026-09-26 02:36-03:16)六台
squeue/bjobs均为 0。
5. 分步操作¶
以实现体为准;对应实现文件:main.py(入口)、deployer.py(编排/门禁/子命令)、
utils/snps_install.py(安装生命周期)、utils/snps_state.py(三态探测与安全推导)、
utils/precheck.py(预检查)、utils/config_validate.py(配置校验)、
config/synopsys_install.yaml(配置真源)。
cd Synopsys/synopsys_install_20260926 # 以下命令均在工程根执行
.venv/bin/python main.py precheck # 只读门禁;预期 RC=0(无 BLOCK)
.venv/bin/python main.py install --dry-run # 预演零改动;核对 plan-*.yaml 动作清单
.venv/bin/python main.py install # 真实安装【变更,需批准】
# 流程(各步幂等):隔离 3 损坏卷 → 解包 Installer(-dir)→
# batch_installer -list 生成模板 → 过滤出最终 cfg(PRODUCTS/PLATFORMS/TARGETDIR)→
# sudo mkdir 目标并临时授权 → 逐产品 batch_installer -config <cfg> -target <root> →
# chown root:root + chmod u=rwX,go=rX → 树/权限回查
# 预期尾行:状态: success(本次实测耗时 630s;vcs 已装则单产品跳过)
.venv/bin/python main.py install # 幂等复跑;预期:状态: skipped,RC=0,零变更
.venv/bin/python main.py verify # 只读验证;预期 RC=0(见第 6 章)
.venv/bin/python main.py drift # 只读漂移;预期 RC=0 全 done
失败时的判断依据(任一达标即停,不换参数重试):
batch_installer退出非 0 或树/bin 回查未过 → execute 失败 → 自动回滚删树(日志【失败判据命中】),连续失败 2 次由logs/install_failures.json触发红线,precheck 转 BLOCK; 根因定位修复后由人工清零该文件(须在文件reason里写明理由)。- Installer sha256 不匹配 → BLOCK(来源锁定,任何
--force无效)。 - 介质 cksum/size 不符且不在隔离清单 → BLOCK(无开关)。
高危子命令(均需
--force,dry-run 可先预演):rollback删安装树;cleanup删可再生中间产物(合成 EST/解包/生成 cfg)。
6. 验证¶
.venv/bin/python main.py verify # 预期 RC=0;报告 reports/verify-*.md
.venv/bin/python main.py drift # 预期 RC=0 全 done;报告 reports/drift-*.md
2026-09-26 实测(reports/verify-*,末轮 03:30 后)14 项全 PASS:tree(三树)、perms、 3 个 bin 锚点、4 个 ldd 锚点本地(树外真缺=0)、client_view(6 台 /tools 可见)、 4 个锚点 ×6 台客户端(树外真缺=0)。
手工抽查(可选):
ls /data/nfs/tools/synopsys/*/X-2025.06-SP1/bin/ # vcs、verdi 二进制可见
stat -c '%U %a %n' /data/nfs/tools/synopsys/vcs/X-2025.06-SP1 # 预期 root 755
ssh root@192.168.31.18 'ls /tools/synopsys/vcs/X-2025.06-SP1/bin/vcs' # 客户端可见
license 就绪前不做的验证:vcs -ID/verdi 启动类(等 SCL server + license 文件,后补)。
7. 回滚¶
- 备份与隔离台账:
backup/README.md(3 个损坏卷的隔离位置、原路径、回滚方式=移回原路径、 可删时机)。本变更无被覆盖的既有文件(全新目录),唯一数据处置是损坏卷隔离(移动非删除)。 - 回滚步骤(删除全新安装树,介质完好可随时重装):
cd Synopsys/synopsys_install_20260926
.venv/bin/python main.py rollback --dry-run # 预演回滚目标(推导校验)
.venv/bin/python main.py rollback --force # 【高危】删 vcs/verdi 两棵安装树(69G)
- 回滚安全推导(
utils/snps_state.derive_install_targets,推导失败即拒绝执行,无开关): 树路径必须恰为target_root/<product>/<version>;target_root须在/data/nfs/tools/之下、 非受保护根;findmnt实机推导目标设备 ≠ 系统盘/设备。 - 回滚后验证:
main.py drift→ tree 转 pending(预期 RC=1);ls /data/nfs/tools/synopsys为空;客户端/tools/synopsys下安装树消失(NFS 视图同步)。 - 恢复安装 = 重跑第 5 章
install(解包 Installer、合成 EST、生成 cfg 均由 install 重建)。 - 本回滚已于 2026-09-26 16:43 实机执行一次(用户重装前的全量删除),结果与备份见 附录「重装前回滚执行记录」。
8. 风险说明¶
| 风险 | 影响 | 缓解 |
|---|---|---|
损坏卷(aarch64×2、vcs_docs)导致 -list 扫描报错 |
无——实测 rc=0、损坏平台自动剔除 | 已隔离入 backup/media_quarantine/;linux64 安装不依赖 |
-config 忽略 cfg 内 TARGETDIR(实测 Missing destination directory) |
安装失败 | 实现已强制命令行 -target(utils/snps_install.py),失败回查会自动回滚 |
| license 未就绪,工具无法启动 | 用户暂不能跑 VCS/Verdi | 已按决策后补;modulefile 亦不在本次范围(见 HANDOFF 待办) |
| verdi 主 ELF ldd not found=13 | 误判为缺库 | 全部为树内库(Qt5/tbb/png 等),wrapper 的 LD_LIBRARY_PATH 运行时解析;verify 按「树内闭合/树外真缺」双口径判定 |
| NFS 写入慢导致安装超时 | 半装态 | install.timeout=7200;半装态 precheck BLOCK,须先 rollback --force 再装 |
| README cksum 与 checksum_info 不符 | 误判介质损坏 | 系 CRLF 行尾转换(去 \r 后完全匹配),深度层按规范化校验,非内容损坏 |
附录:交付物清单¶
| 文件 | 管什么 |
|---|---|
main.py / deployer.py |
入口与编排(precheck/install/verify/cleanup/rollback/drift) |
utils/ |
snps_state(三态探测+安全推导)、snps_install(安装生命周期)、precheck、config_validate |
config/synopsys_install.yaml |
配置真源(六台 nodes、介质与 sha256、隔离清单、树路径、ldd_anchors、阈值) |
config/synopsys_install.yaml.example |
完整注释样例(新环境复制改此份) |
backup/README.md + backup/media_quarantine/ |
隔离台账与 3 个损坏卷(140M) |
reports/ |
precheck/plan/verify/drift 报告、media_verify.json 深度校验缓存 |
logs/ |
运行日志、install_run_*(含失败诊断)、install_failures.json(红线计数)、exp_vcs_diagnostic_run.log(-target 根因诊断记录) |
docs/HANDOFF.md |
交接快照(当前状态与待办) |
附录:决策与排障记录¶
- 三项决策(2026-09-26 用户确认):① 3 个损坏卷隔离后照常安装(docs/aarch64 日后重下); ② 本次只装 VCS+Verdi,SCL v2025.03 介质已到位但不装(随 license 事项处理); ③ modulefile 本次不动(license 变量后补;lsf 三台无 Lmod 仍为待决策项)。
- 介质校验口径:
checksum_info.txt为 POSIXcksum(非 zlib.crc32/md5);README 内嵌 md5 覆盖 24/28 文件;linux64 安装所需介质全部三重通过。 - 排障(两次失败后定位):第 1 次
-config传了两个 cfg(Unknown argument)→ 改逐产品; 第 2 次Missing destination directory→ 手工诊断确认-config模式必须命令行-target→ 修复实现后人工清零失败计数(理由已写入logs/install_failures.json),第 3 次 success。 全程自动回滚链路两次按判据正确触发(目标树未产生时安全跳过)。 - 验收漏洞补记:verdi_supp 实为独立产品、装入第三棵树,首轮验收(探测/权限/回滚清单
只含 vcs+verdi)曾漏管且其权限未收敛(rain:rain 带写位);发现后在配置补
media/products与install/products的 verdi_supp 条目(锚点bin/fsdbprof, 实测 ldd not found=0),重跑 install 完成三树权限收敛,终态 verify 14 项全 PASS。 - 重装前回滚执行记录(2026-09-26 16:43–16:44,用户决策「三棵树全删 + 一并清理中间产物」):
rollback --dry-run推导 3 目标 →rollback --forceRC=0(vcs 4.6s / verdi 6.3s / verdi_supp 5.5s 逐树删除)→cleanup --forceRC=0。删除范围:3 棵安装树(69G)+ 12 个合成 EST(分卷合并产物)+scratch/installer(解包 Installer)+ batch_installer 安装回执target_root/.installer/(6 个文件,先备份)+ 3 个空产品目录(sudo rmdir,父目录 root 属主);介质原卷全部保留 (*.spf.partNN分卷、*_common.spf等原生单文件)。 删除后实测:/data/nfs/tools/synopsys/已空(仅剩该目录本身);driftRC=1 (tree=pending,media/installer/quarantine/perms 等仍 done);六台客户端/tools/synopsys条目数=0;cleanup --force复跑 = skipped RC=0。 回执.installer/必须一并删:其platforms记三产品successful,留着会让重装的batch_installer判为已装而跳过,产出空树(工程 rollback 安全门只覆盖<root>/<product>/<version>一级,回执与空目录由人工清理)。 - cleanup 重复目标缺陷(本次暴露并修复):首跑
cleanup --force以FileNotFoundError: .../verdi_supp_vX-2025.06-SP1_linux.spf失败——verdi与verdi_supp共用同一介质目录,MediaCleaner.targets()的dirs中该目录出现两次, 同一合成 EST 被推导成两个目标,第二次unlink时文件已不存在。 修复:对dirs做保序去重(dict.fromkeys,见utils/snps_install.py)。 修复前版本备份于backup/utils/snps_install.py.bak.20260926-164513(台账backup/README.md);修复后cleanup --forceRC=0,复跑 skipped。
来源:
/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_install_20260926/SOP.md| 最后更新:2026-09-26 16:46(由build/sync.py同步,请勿在站点侧修改)