跳转至

SOP — 31.30(centos7-01)补齐 NFS 客户端并复验 VCS

  • 变更日期:2026-09-28
  • 执行主机:192.168.31.30(centos7-01,CentOS Linux 7.2.1511,内核 3.10.0-327,2 vCPU / 3.8G 内存 / 无 swap)
  • 触发来源:HANDOFF 待办 #4「centos7-01 处置」+ 用户指定 A 方案(补 NFS 客户端)
  • 性质:C 类生产变更(安装软件包 + 挂载共享目录)
  • 结论:变更成功;VCS 在 CentOS 7.2 上的行为与既有结论一致(见第 6 章)

1. 背景

31.30 是 VCS 崩溃归因验证时新建的 CentOS 7.2 机器,此前只有一份本地的 vcs-mx 干净对照树(/tools/synopsys_clean,4.4G),看不到 NFS 上的 20 棵正式工具树。要把它当正常客户端使用,必须先补 NFS 客户端能力。此前未安装 nfs-utils / rpcbind(HANDOFF 记录「保留需补 nfs-utils,yum 源已 EOL,需 vault」)。

同时借这次机会,要求在不设 VCS_USE_MALLOC 的前提下复验 VCS,以检验既有结论(崩溃与平台无关)在这台机器上是否成立。

2. 目标

  1. nfs-utils 安装成功,/tools 挂载到 192.168.31.249:/data/nfs/tools,只读且能从本机读到全部 20 棵树。
  2. 挂载参数与既有六台客户端约定一致(nfs4、ro、hard、_netdev 等)。
  3. 以 NFS 现役树为基准,实测 VCS_USE_MALLOC 开/关两种状态的仿真结果,形成单变量对照结论。

3. 前置条件

  • 本机(操作机)到 31.30 已配置 root 免密 SSH(BatchMode 可直连)。
  • 31.30 上 /etc/yum.repos.d/c72-vault.repo 已存在且可用(阿里云 vault,c72-base 共 9007 包);EOL 源 base/extras/updates 已失效,必须命令行禁用。
  • NFS 服务端(本机 192.168.31.249,Ubuntu 24.04)/etc/exports 已导出 /data/nfs/tools 给 192.168.31.0/24。
  • 执行前检查:/tools 现有内容、可用磁盘、SELinux 状态。
  • 备份与留档位置:centos7_01_nfs_20260928/backup/README.md(本次无配置文件被修改,台账见第 7 章)。

4. 影响范围

项 说明
主机 仅 192.168.31.30 一台
是否停服 否。该机当前无在跑业务作业,无 Slurm/LSF 客户端接入
变更面 ① 新增安装包(nfs-utils 及其依赖);② /tools 挂载点
持久化 本次仅临时挂载,未写 fstab(遵守「不手改 fstab/exports」红线)。重启后挂载失效,nfs-utils 包保留
遮盖效应 /tools 下原有本地目录 synopsys_clean(4.4G)被挂载点遮盖,数据不丢,umount 后立即恢复可见
窗口期 无需窗口;单条命令执行期间对 /tools 的本地访问短暂不可见

5. 分步操作

步骤 1:安装 nfs-utils

官方源已 EOL,base/7/x86_64 的 mirrorlist 会以 curl#52 Empty reply from server 失败并中断整个 yum 事务,因此必须显式只启用可用源,而不是依赖默认源开关。

坑:--disablerepo 的通配必须加引号(--disablerepo="*"),否则 shell 会展开成当前目录文件列表。

ssh root@192.168.31.30 'yum install -y --disablerepo="*" --enablerepo=c72-base nfs-utils'

预期:yum_exit=0,rpm -q nfs-utils 返回 nfs-utils-1.3.0-0.21.el7.x86_64,依赖含 rpcbind、libnfsidmap、quota、keyutils-libs。 失败判断:非 0 → 查 /tmp/yum-nfs2.log,确认是 c72-base 不可达还是依赖缺失;修源后重跑本步。

步骤 2:挂载 /tools(只读)

挂载参数照抄既有客户端(31.18 的 fstab)约定,保证行为一致:ro,hard,timeo=600,retrans=2,noatime,actimeo=30。NFSv4 不需要 rpcbind/statd,故未启用 rpcbind 服务。

坑 1:/tools 已有本地内容,直接挂载会遮盖;确认其中内容无需在线访问后再执行。 坑 2:重复执行 mount 会因「已挂载」报错,故用条件判断实现幂等。

# 幂等写法:已挂载则跳过;路径不存在先创建(本次已存在)
ssh root@192.168.31.30 'if grep -q " /tools nfs" /proc/mounts; then
  echo "already-mounted -> skip"
else
  mount -t nfs4 -o ro,hard,timeo=600,retrans=2,noatime,actimeo=30 \
    192.168.31.249:/data/nfs/tools /tools
fi'

预期:mount_exit=0,df -h /tools 显示 192.168.31.249:/data/nfs/tools 1.8T ... 34% /tools。 失败判断:mount_exit=32(文件系统类型错误)多为客户端缺 nfs-utils → 回到步骤 1;超时/拒绝 → 检查网络与服务端 exports。

步骤 3:复核挂载属性与写保护

ssh root@192.168.31.30 'grep " /tools " /proc/mounts; touch /tools/_wtest; ls -Zd /tools'

预期:/proc/mounts 行含 nfs4 ro,...,vers=4.0,...,hard;touch 报 只读文件系统;上下文为 system_u:object_r:nfs_t:s0(SELinux Enforcing 下不影响读取与执行)。 失败判断:可写入 → 挂载参数漏了 ro,卸载后按步骤 2 重挂。

步骤 4:VCS 实测(单变量对照)

在 /tmp 下建临时工程(NFS 树为只读,不能在其中写产物),仅切换 VCS_USE_MALLOC,其余完全一致。注意不要沿用 Cadence 的 LM_LICENSE_FILE,只设 Synopsys 专用变量,避免老工具回退读错授权变量而拖慢启动。

ssh root@192.168.31.30 'D=$(mktemp -d /tmp/vcsn.XXXX); cd "$D"
printf "module t;\n  initial \$display(\"HELLO\");\nendmodule\n" > x.sv
export SNPSLMD_LICENSE_FILE=2700@192.168.31.29
unset LM_LICENSE_FILE VCS_USE_MALLOC          # 对照组:不设该变量
export VCS_HOME=/tools/synopsys/vcs-mx/N-2017.12-SP2
"$VCS_HOME/bin/vcs" -full64 -sverilog x.sv -o simv && ./simv'

预期与实测见第 6 章。失败判断:simv 打印 libvcsnew.so 栈回溯并退出 1,即为已知分配器缺陷,处理方式见第 6 章结论。

6. 验证

6.1 挂载与服务

检查 命令 实测结果
安装包 rpm -q nfs-utils rpcbind nfs-utils-1.3.0-0.21.el7、rpcbind-0.2.0-32.el7
挂载点 grep " /tools " /proc/mounts nfs4 ro,noatime,vers=4.0,hard,timeo=600,retrans=2
容量 df -h /tools 1.8T 总量,已用 583G,挂载正常
树数量 ls /tools/synopsys \| wc -l 20(外加 1patch 目录)
写保护 touch /tools/_wtest 无法创建: 只读文件系统
SELinux getenforce / 挂载上下文 Enforcing;nfs_t,未阻碍读取与执行

注:vers=4.0 是 CentOS 7.2(内核 3.10)客户端协商上限,与 Rocky 9.8 客户端的 4.2 不同,功能无影响。

6.2 VCS 单变量对照(核心结论)

同一台机、同一棵 NFS 现役树(/tools/synopsys/vcs-mx/N-2017.12-SP2),唯一变量为 VCS_USE_MALLOC:

树 VCS_USE_MALLOC vcs 编译 simv 仿真
NFS 现役树 不设 成功(vcs_exit=0) 崩溃(simv_exit=1,栈在 libvcsnew.so)
NFS 现役树 =1 成功 成功,输出 V C S Simulation Report
本地 clean 树 =1 成功 成功,输出 V C S Simulation Report

结论:决定因素是 VCS_USE_MALLOC 这一个环境变量——与树来源(NFS 现役树 / 本地干净树)无关,与平台(CentOS 7.2 内核 3.10 / glibc 2.17)无关。同时排除了「内存不足」这一新变量:本机 3.8G 内存、无 swap,设变量即成功。既有结论(VCS 自带池化分配器缺陷,非新系统不兼容)在 CentOS 7.2 上再次成立,HANDOFF 红线不变。

6.3 幂等复跑

动作 第二次执行结果
yum install ... nfs-utils 软件包 1:nfs-utils-1.3.0-0.21.el7.x86_64 已安装并且是最新版本 / 无须任何处理(零变更)
条件式挂载 already-mounted -> skip(零变更)

7. 回滚

无配置文件被修改,故无文件级备份;回滚即撤销两项变更。备份台账:backup/README.md。

# 回滚 1:卸载挂载点(本地 synopsys_clean 立即恢复可见)
umount /tools
mount | grep -q " /tools " && echo "STILL-MOUNTED" || echo "unmounted"

# 回滚 2(可选,仅在需要彻底移除客户端能力时执行)高危:移除软件包
yum remove -y nfs-utils rpcbind

回滚验证:df -h /tools 回到本地 /dev/vda2,ls /tools 可见 synopsys_clean;rpm -q nfs-utils 返回「未安装软件包」。

回滚触发判据:/tools 读取报 I/O 错误或服务端异常导致访问 hang(hard 挂载会阻塞),任一出现即 umount;umount 报 busy 时先确认无进程占用(lsof /tools),必要时 umount -l /tools 后择机重启。

8. 风险说明

风险 缓解
挂载遮盖 /tools/synopsys_clean(4.4G 本地对照树) 数据未丢,umount 即恢复;如需长期共存,应改挂 /tools 之外路径或先把本地树迁走
挂载未持久化,重启后消失 已知并接受:本次只做验证。若要长期使用,需另行确认持久化方式(systemd mount unit 或 fstab),并纳入下一份 SOP
hard 挂载在服务端不可达时阻塞 IO 服务端为本机 192.168.31.249,同网段稳定;异常时按第 7 章回滚
EOL 源导致后续任何 yum 操作失败 本次用一次性 --disablerepo 规避,未持久化禁用;后续若常驻使用该机,建议把死源置 enabled=0
SELinux Enforcing + firewalld active 实测未阻碍挂载与 VCS 运行,本次未做策略调整
内存仅 3.8G 且无 swap 已实测足以完成本次最小用例;跑真实大设计需评估扩容

附录 A:交付物清单

文件 说明
docs/SOP.md 本文件
backup/README.md 备份台账(本次无文件备份,记录回滚动作与理由)

附录 B:取证留痕

  • 取证主机:操作机 192.168.31.249 → 目标 192.168.31.30(root 免密,BatchMode)
  • 时间窗:2026-09-28 22:13 — 22:33
  • 关键命令与过滤条件:见第 5 章;yum 日志留存于目标机 /tmp/yum-nfs.log、/tmp/yum-nfs2.log
  • 仿真工程目录(目标机):/tmp/vcsv.E2k5(本地树+变量)、/tmp/vcsn.maEv(NFS 树,不设变量,崩溃)、/tmp/vcsm.5Yzm(NFS 树+变量)

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