跳转至

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. 背景 2. 目标 3. 前置条件 4. 影响范围
  2. 分步操作 6. 验证 7. 回滚 8. 风险说明 附录:交付物清单、决策与排障记录

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/fsdbprof not found=0;platform/linux64/bin/novas、 bin/gf_slave 的 not found 全部由树内库闭合,树外真缺=0(本地 + 六台)
  • 工具门禁全绿:precheck RC=0、install 幂等复跑 skipped RC=0、verify RC=0、drift RC=0
  • 3 个损坏介质卷已隔离入 backup/media_quarantine/ 并登记台账

3. 前置条件

均为执行前检查项,已落为 main.py precheck 可执行检查(BLOCK 即禁止变更):

  • 权限:root SSH 免密到六台客户端(setup_credentials(username=root));宿主 sudo -n 免密
  • 介质:checksum_info.txt cksum+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 为 POSIX cksum(非 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 --force RC=0(vcs 4.6s / verdi 6.3s / verdi_supp 5.5s 逐树删除)→ cleanup --force RC=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/ 已空(仅剩该目录本身);drift RC=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 --force RC=0,复跑 skipped。

来源:/home/rain/Documents/eda_tools_ins/Synopsys/synopsys_install_20260926/SOP.md | 最后更新:2026-09-26 16:46(由 build/sync.py 同步,请勿在站点侧修改)