跳转至

SOP — hpc-submit 补齐 EDA 工具运行依赖(ksh + 32 位运行库)

变更编号:hpc_submit_eda_deps_20260927|执行日期:2026-09-27|主机:仅 192.168.31.28(hpc-submit) 触发:rain01 在 hpc-submit 的 VNC 桌面执行 virtuoso 报 Command not found.

1. 背景

hpc-submit(192.168.31.28)是 2026-09-25 才纳管的作业提交节点,ic617_install_20260926 当时的适配范围写的是"六台客户端"(.18/.19/.20/.25/.26/.27),这台从未做过 Rocky 9 适配。 用户正好用这台跑 Virtuoso,于是三层缺失依次暴露:

层 现象 根因
① virtuoso: Command not found.(bash 则报 No such file or directory) virtuoso 是指向 cdnWrapperWithOA2015 的软链,该 wrapper 是 #!/bin/ksh 脚本,本机未装 ksh → execve 返回 ENOENT
② ERROR: No proper OA2.2 installation found Cadence 的 OA 探测需 32 位加载器;本机 i686 包数 = 0、缺 /lib/ld-lsb.so.3、/lib64/ld-lsb-x86-64.so.3、/usr/lib64/libdl.so
③ error while loading shared libraries: libGLU.so.1 缺 64 位 mesa-libGLU(此前只有 i686 版)

诊断依据:与能跑通的 .18 逐项对照——环境变量(OA_UNSUPPORTED_PLAT / CDS_INST_DIR / CDS_AUTO_64BIT / LD_PRELOAD)两台完全一致、/tools 为同一共享盘,差异全部落在节点本地包与链接。

2. 目标

  • hpc-submit 具备与六台一致的 EDA 运行依赖:ksh、i686 运行库、LSB/libdl 链接、libnsl.i686、mesa-libGLU.x86_64。
  • virtuoso 在 hpc-submit 上能真正启动(不再停在 Command not found / OA 报错 / 缺库)。
  • PDK 集成链路(Calibre Skill + NCSU CDK)在 hpc-submit 上同样生效。

3. 前置条件

  • root 权限;EPEL 已启用(本机已装 epel-release-9-10.el9)。
  • 该节点无在跑作业:hpc-submit 无 slurmd,不承载作业,天然满足。
  • 磁盘可用 ≥ 数 GB(实测变更前 / 可用 45G)。
  • 变更前先记录 dnf 事务锚点与 i686 计数,作为回滚依据。

4. 影响范围

项 内容
主机 仅 192.168.31.28;不影响 .16/.17/.18/.19/.20/.25/.26/.27
系统变更 新增 141 个 i686 包;glib2.x86_64 由 el9_8.1 同步升级到 el9_8.10(为与 i686 同版本)
服务 不启停任何服务;VNC 桌面(vncserver@:1)与新登录会话不受影响
停服 不需要
窗口 任意;变更期间已在跑的用户进程使用旧 inode,不受影响

5. 分步操作

步骤 0:记录回滚锚点

ssh root@192.168.31.28 'rpm -qa --qf "%{NAME}.%{ARCH}\n" | grep -c "\.i686$"   # 变更前 = 0
dnf history list | head -4'                                                    # 记下最新事务 ID

预期:i686 = 0;最新事务 ID 为 12(本次的 ksh)。失败判断:连不上/仓库不可用即停止。

步骤 1:安装 ksh

virtuoso 的 wrapper 是 #!/bin/ksh,缺它连"找不到命令"都算不上——execve 直接 ENOENT。

ssh root@192.168.31.28 'dnf -y install ksh && rpm -q ksh && ls -l /bin/ksh'

预期:ksh-1.0.6-15.el9.x86_64(与六台同版本),/bin/ksh -> /etc/alternatives/ksh。

步骤 2:先同步 glib2 两架构

坑(SOP 已记录过):直接装 i686 清单会在 Transaction test 阶段失败—— glib2-…el9_8.10.i686 与已装 glib2-…el9_8.1.x86_64 的 man 手册文件冲突。 该失败发生在 test 阶段,不会装进任何包(无副作用),处置是先让两架构同版本:

ssh root@192.168.31.28 'dnf -y install glib2.i686 glib2.x86_64'

预期:Complete!,同时把 glib2.x86_64 升到 el9_8.10(事务记录为 I, U)。

步骤 3:安装 i686 运行库清单

清单与 ic617_install_20260926/docs/SOP.md 步骤 1 逐字一致(单一源),保证 hpc-submit 与六台同构:

ssh root@192.168.31.28 'dnf -y install xterm ncompress \
  glibc.i686 libgcc.i686 libstdc++.i686 glibc-devel.i686 \
  libXext.i686 libXtst.i686 libXi.i686 libXrender.i686 libXp.i686 libXmu.i686 libXt.i686 \
  libXpm.i686 libXrandr.i686 libXcursor.i686 libXinerama.i686 libXcomposite.i686 \
  libXdamage.i686 libXfixes.i686 libXScrnSaver.i686 libICE.i686 libSM.i686 \
  libuuid.i686 libselinux.i686 ncurses-libs.i686 zlib.i686 libpng.i686 \
  elfutils-libelf.i686 glib2.i686 gtk2.i686 mesa-libGL.i686 mesa-libGLU.i686 motif.i686'

预期:Complete!,事务 128 项。失败判断:出现 Unable to find a match → 检查 EPEL 是否启用。

步骤 4:补 libnsl.i686 与 64 位 mesa-libGLU

清单之外的两项必需件:libnsl.i686(32 位给老工具/lmutil)、mesa-libGLU.x86_64(64 位 virtuoso 需要 libGLU.so.1)。

ssh root@192.168.31.28 'dnf -y install libnsl.i686 mesa-libGLU.x86_64'

预期:两者均 Installed;/usr/lib64/libGLU.so.1 -> libGLU.so.1.3.1。

步骤 5:补 LSB / libdl 符号链接

redhat-lsb-core 在 el9 源不可得,手工补链接(幂等写法,已存在则跳过):

ssh root@192.168.31.28 'test -e /lib64/ld-lsb-x86-64.so.3 || ln -s /lib64/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
test -e /lib/ld-lsb.so.3 || ln -s /lib/ld-linux.so.2 /lib/ld-lsb.so.3
test -e /usr/lib64/libdl.so || ln -s libdl.so.2 /usr/lib64/libdl.so'

预期:三条链接存在;/lib/ld-linux.so.2 由 glibc.i686 提供。

6. 验证

# 检查项 命令 预期
1 包与链接就位 rpm -q ksh libnsl.i686 mesa-libGLU.x86_64;ls -l /lib/ld-lsb.so.3 /lib64/ld-lsb-x86-64.so.3 /usr/lib64/libdl.so 全部存在;i686 计数 141
2 程序真能启动(不看 which) su - rain01 -s /bin/bash -c 'source /etc/profile.d/zzz_site_lmod.sh; module load cadence; module load virtuoso/IC06.17.700; printf "exit()\n" \| timeout 150 virtuoso -nograph' Virtuoso Framework License (111) was checked out successfully
3 PDK 集成链路 scp 后执行 pdk_integration_20260927/scratch/verify_cdsinit.sh [pdk] Loading Calibre Skill Interface、[pdk] Loading NCSU CDK、Done loading NCSU_CDK customizations;编码/冲突/失败计数均为 0
4 GUI(人工) VNC 桌面终端:module load cadence; module load virtuoso/IC06.17.700; cd <含 cds.lib 的目录>; virtuoso & 出现 Virtuoso 主窗口

验证方法学的坑:ldd <二进制> | grep "not found" 在裸环境下会列出一百多个 Cadence 自有库 (它们靠模块环境的 LD_LIBRARY_PATH 解析),两台的裸 ldd 输出几乎相同、不能用来判缺口。 必须在加载模块后的环境里实际启动,看真实报错。

实测结果(2026-09-27 23:0x):检查项 2、3 均通过;检查项 4 由用户在 VNC 中确认。

7. 回滚

触发条件:virtuoso 仍无法启动且确认由本次包变更引起;或 i686 包引入系统异常。

第一步:回退 dnf 事务(从最新往回)

ssh root@192.168.31.28 'dnf history undo 16 15 14 13 12'

(16=mesa-libGLU.x86_64、15=libnsl.i686、14=i686 主清单、13=glib2 两架构同步、12=ksh; 事务 ID 以本机 dnf history list 实际值为准。)

第二步:删除符号链接

ssh root@192.168.31.28 'rm -f /lib64/ld-lsb-x86-64.so.3 /lib/ld-lsb.so.3 /usr/lib64/libdl.so'

第三步:回滚后验证:rpm -qa | grep -c "\.i686$" 回到 0;virtuoso 恢复"报错不可用"状态 (即变更前状态,用户无法使用属预期)。

备份位置说明:本次为软件包与符号链接变更,无文件级备份可留;回滚锚点是 dnf 事务 ID, 见 backup/README.md。

8. 风险说明

风险 缓解
装 i686 库触发系统包变更(含 glibc.i686) 清单与六台逐字一致、六台已长期运行;.28 无作业负载,窗口安全
glib2.x86_64 同步升级(el9_8.1 → el9_8.10) 属多架构同版本要求,六台同样如此;升级不动运行中进程的旧 inode
dnf 事务中途失败留半程状态 先记 history ID;Transaction test 阶段失败不落盘(本轮已实证)
.16/.17 两台控制节点同样缺 ksh 与 i686 依赖 本次未处置(控制节点不跑 EDA 工具);若日后要在其上跑 EDA,按本 SOP 同样执行——已登记为遗留项
后续新增提交/计算节点再踩同一坑 已记入 ic617_install_20260926 与交接文件:节点纳管必须包含 EDA 运行依赖,不能只按"六台客户端"划范围

附录 A:诊断链(供快速复现)

virtuoso: Command not found.                    → rpm -q ksh / ls -l /bin/ksh
No proper OA2.2 installation found              → rpm -qa | grep -c '\.i686$';三条 LSB/libdl 链接
libGLU.so.1: cannot open shared object file     → rpm -q mesa-libGLU.x86_64;ls -l /usr/lib64/libGLU.so.1

对照法:同一命令在已知可用的 .18 上跑一遍,差异即为缺口(注意先排除环境变量与共享盘因素)。

附录 B:交付物清单

文件 说明
docs/SOP.md 本文档
scratch/verify_ksh.sh ksh 装好后的一键验证(bash 身份 + csh 身份两路)
scratch/diag_oa.sh OA 定位诊断 + virtuoso -nograph 实测(本次定位与复验都用它)
backup/README.md 回滚锚点台账(dnf 事务 ID、链接清单)

来源:/home/rain/Documents/eda_tools_ins/Cadence/hpc_submit_eda_deps_20260927/docs/SOP.md | 最后更新:2026-09-27 23:01(由 build/sync.py 同步,请勿在站点侧修改)