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同步,请勿在站点侧修改)