跳转至

SOP — 环境事实同步(三层存储)与计算节点 Lustre 挂载修复

  • 变更日期:2026-10-04
  • 变更类型:C 类(交付物变更 + 系统状态变更)
  • 交付物目录:env_facts_sync_20261004/(本文件、backup/)
  • 关联:rainchen-env skill、k8s_ins/env-inventory/hpc-simulation-env.yaml、slurm_ins/docs/HANDOFF.md

1. 背景

起因是核对 ~/.trae-cn/skills/rainchen-env/SKILL.md(自建环境使用指南)与环境事实是否一致,核对中发现三项偏差:

  1. 三层存储只写了「二层」:skill §5 原为「工作区二分」(/projects + /mnt/lustre),漏掉本地层 /local_scratch(EDA 元数据减压最敏感的一层),也未讲三层数据流、scratch 目录结构与生命周期清理。
  2. Tier0 在计算节点实际不可用(故障):.18/.19/.20 自 2026-09-29 18:43 起 /mnt/lustre 挂载失败,已持续 4 天,三份档案(SOP/RUNBOOK/HANDOFF)均无记载。
  3. skill §6 红线过时:写「改系统状态须等用户确认再执行」,与现行规则 rule-ops-scenario-routing(声明即执行、有备份免确认)冲突。

2. 目标

  • 三台计算节点 /mnt/lustre 恢复挂载,/mnt/lustre/scratch 可读写。
  • rainchen-env skill 与权威清单 hpc-simulation-env.yaml 同步为三层存储口径,且两处一致。
  • skill 红线口径与现行规则对齐。

3. 前置条件

  • 本机(192.168.31.249)对 .16~.29 可 root 免密 ssh。
  • 执行前 squeue 为空、三计算节点 idle(避免在有作业节点上动作)。
  • 已备份 skill 与 yaml(见第 7 章)。

4. 影响范围

项 内容
主机 .18(slurm-work-01)、.19(slurm-work-02)、.20(slurm-work-03)
组件 Lustre 客户端挂载 mnt-lustre.mount;不影响 slurmd、MDS/OSS
是否停服 否。挂载操作不重启任何 daemon
在跑作业 无(squeue 空、三节点 idle,2026-10-04 00:14 实测)
窗口 无特殊要求

5. 分步操作

步骤 1:前置核查(只读)

确认无在跑作业与节点状态,避免在有作业的节点上动作。

timeout 15 ssh root@192.168.31.16 '/usr/local/slurm/bin/squeue; /usr/local/slurm/bin/sinfo -N -o "%N %T"'

预期:squeue 仅表头;三节点 idle。失败判断:若有作业 → 停止本次变更。

步骤 2:备份 skill 与权威清单(高危前必备份)

TS=$(date +%Y%m%d-%H%M%S); D=env_facts_sync_20261004/backup
mkdir -p "$D/trae-cn/skills/rainchen-env" "$D/k8s_ins/env-inventory"
cp -a ~/.trae-cn/skills/rainchen-env/SKILL.md "$D/trae-cn/skills/rainchen-env/SKILL.md.bak.$TS"
cp -a ~/Documents/k8s_ins/env-inventory/hpc-simulation-env.yaml "$D/k8s_ins/env-inventory/hpc-simulation-env.yaml.bak.$TS"

预期:两份 .bak.20261004-001505 生成。见 backup/README.md。

步骤 3:恢复三台计算节点 Lustre 挂载

故障根因(见附录 A):MDS 于 09-29 进入客户端恢复窗口拒连,客户端 fstab 带 nofail 静默跳过,mnt-lustre.mount 落到 failed 后不会自愈。故只需重启该 unit 重试挂载,不需要改 fstab 或重启服务。

for h in 18 19 20; do
  timeout 45 ssh root@192.168.31.$h 'systemctl restart mnt-lustre.mount; sleep 3; findmnt -no SOURCE,FSTYPE -M /mnt/lustre'
done

预期:三台各自输出 192.168.31.21@tcp:/edafs lustre。 失败判断:仍 NOT-MOUNTED → 查 journalctl -u mnt-lustre.mount -n 20 与 dmesg | grep Lustre;若 MDS 仍在恢复窗口,稍后重试(幂等)。

步骤 4:更新 skill 正文(三层存储 + 红线)

rainchen-env/SKILL.md 定点修订(SearchReplace,不整篇重写):

  • §5 第 4 条「工作区二分」→ 展开为三层(Tier1 NFS / Tier0 Lustre / 本地 $TMPDIR)+ 数据流 + cwd 坑 + 三层清理。
  • §6 末条 → 现行口径(声明即执行、有备份免确认,三类例外)。

步骤 5:更新权威清单 hpc-simulation-env.yaml

storage.mounts 内 /mnt/lustre 补 tier/scratch_layout,并新增 /local_scratch 条目(node_local: true);storage 尾部「工作区选择建议」注释改为三层分工与生命周期说明;作业模板补三层存储注释。

6. 验证

# ① 三节点挂载 + scratch 可写
for h in 18 19 20; do echo "== .$h =="; timeout 15 ssh root@192.168.31.$h \
  'findmnt -no SOURCE,FSTYPE -M /mnt/lustre; ls /mnt/lustre/scratch; touch /mnt/lustre/scratch/tmp/.probe_$$ && echo WRITABLE && rm -f /mnt/lustre/scratch/tmp/.probe_$$'; done

# ② yaml 语法与挂载项
python3 -c "import yaml;d=yaml.safe_load(open('$HOME/Documents/k8s_ins/env-inventory/hpc-simulation-env.yaml'));print([m['mount'] for m in d['storage']['mounts']])"

# ③ skill frontmatter 未破坏
head -4 ~/.trae-cn/skills/rainchen-env/SKILL.md

实测结果(2026-10-04): - 三台均 192.168.31.21@tcp:/edafs lustre,scratch/{projects,tmp,users} 可见,WRITABLE。 - yaml 解析成功,mounts 含 /local_scratch:['/home','/projects','/tools','/pdk','/opt/modulefiles','/mnt/lustre','/local_scratch','/data/nfs/lsf']。 - skill frontmatter name: rainchen-env 完好。

7. 回滚

对象 回滚动作
Lustre 挂载(若需还原故障态) 各计算节点 umount /mnt/lustre(正常态无需回滚)
skill cp -a backup/trae-cn/skills/rainchen-env/SKILL.md.bak.20261004-001505 ~/.trae-cn/skills/rainchen-env/SKILL.md
yaml cp -a backup/k8s_ins/env-inventory/hpc-simulation-env.yaml.bak.20261004-001505 ~/Documents/k8s_ins/env-inventory/hpc-simulation-env.yaml

回滚触发判据:挂载后节点异常(slurmd 不健康、sinfo 显示 drain)→ 先 umount,再查 MDS 侧。 备份位置与删除时机见 backup/README.md。

8. 风险说明

风险 缓解
MDS 仍在客户端恢复窗口,重启后仍拒连 挂载失败即维持原状(nofail);MDS 恢复后重跑步骤 3,幂等
变更涉及全局 skill(跨项目生效) 只改正文,未动 description;按现行结论,正文改动不进每轮前缀、无需新会话
两层文档再次漂移 skill 与 yaml 本轮同步改,且 skill 指向 yaml 为权威源

附录 A:Tier0 故障记录(根因与证据)

时间线

时间 事件
2026-09-29 18:41 MDS(.21)进入客户端恢复窗口,日志 Denying connection for new client ... waiting for 7 known clients (0 recovered ...) to recover
2026-09-29 18:43~18:45 .18/.19/.20 挂载尝试被拒(rc = -16),mnt-lustre.mount → failed (Result: timeout);/mnt/lustre 为空目录
2026-09-29 18:46 MDS 端 disconnecting 7 stale clients,服务端恢复;客户端 unit 已 failed,不自动重试
2026-10-04 00:14 本次发现(已持续 4 天):.18/.19/.20 均 NOT-MOUNTED;.28 正常
2026-10-04 00:19 重启三台 mnt-lustre.mount,恢复成功

证据

# 计算节点(.18,同形于 .19/.20)
$ systemctl status mnt-lustre.mount
× mnt-lustre.mount - /mnt/lustre
     Active: failed (Result: timeout) since Tue 2026-09-29 18:43:17 CST; 4 days ago
$ dmesg | grep -i lustre | tail
LustreError: edafs-MDT0000-mdc-...: operation mds_connect to node 192.168.31.21@tcp failed: rc = -16
LustreError: ... llite: Unable to mount <unknown>: rc = -16

# MDS(.21)
Lustre: edafs-MDT0000: Denying connection for new client ... (at 192.168.31.19@tcp), waiting for 7 known clients ... to recover
Lustre: edafs-MDT0000: disconnecting 7 stale clients

根因:MDS 客户端恢复窗口期间拒绝新挂载(预期行为),叠加客户端 nofail 静默跳过 + systemd failed unit 不自动重试,导致故障被「静默固定」——不是文件系统故障,是恢复窗口与挂载重试策略的组合缺陷。

遗留建议(未实施):为 mnt-lustre.mount 增加重试或加 Restart= / 由 HPC 健康检查覆盖该挂载点,避免同类静默失败长期潜伏。

附录 B:交付物清单

文件 说明
SOP.md 本文件
backup/README.md 备份台账
backup/trae-cn/skills/rainchen-env/SKILL.md.bak.20261004-001505 改前 skill
backup/k8s_ins/env-inventory/hpc-simulation-env.yaml.bak.20261004-001505 改前权威清单

来源:/home/rain/Documents/slurm/env_facts_sync_20261004/SOP.md | 最后更新:2026-10-04 00:16(由 build/sync.py 同步,请勿在站点侧修改)