SOP — 新增作业提交节点 hpc-submit(--submit-node)¶
变更日期:2026-09-25 | 执行人:rain | 状态:已完成并验证 实现体:
submit_node_deployer.py+submit_node_assets.py(工程根main.py ---submit-node) 本文第 5 章的操作序列以实现体为准,仅供阅读、复核与手工复现。
1. 背景¶
集群此前只有控制节点(2 台)与计算节点(3 台),用户要提交作业必须登录到控制节点或计算节点。
新增一台专用主机 192.168.31.28 作为作业提交节点:只跑 Slurm 客户端命令,不承载作业,
把"提交/查询"与"计算与控制"在权限与负载上分开。
该主机为全新安装(Rocky Linux 9.8 最小化),主机名为 rocky9-01,未装任何 Slurm 相关软件包。
2. 目标¶
变更完成后应达到以下可验证状态:
- 主机名为
hpc-submit,集群 6 台节点的/etc/hosts均能按名解析它; munged运行且 key 与集群一致(客户端命令的认证前提);- Slurm 客户端命令可用:登录后
sinfo/squeue/sbatch直接可用(configless 取配置); - LDAP 认证可用:
getent passwd cy01可解析、su - cy01可切换、家目录来自 NFS; - 与计算节点同款的共享盘就绪:
/home、/opt/modulefiles、/projects、/tools、/pdk; - 不挂 Lustre(
/mnt/lustre)与本地 scratch(/local_scratch)——该节点不承载作业; - 不重启任何既有节点的 daemon、不改既有节点的
slurm.conf,在跑作业不受影响; - 复跑一次为零变更、全跳过(幂等)。
3. 前置条件¶
| 项 | 要求 | 实现体检查项 |
|---|---|---|
| 免密 SSH | 部署机 → 192.168.31.28 及全部既有节点 root 免密 |
pre_check 逐台 echo OK |
| 主机名 | 目标机静态主机名必须已是 hpc-submit |
比对 hostnamectl --static 与 yaml hostname,不符即中止 |
| OS 契约 | Rocky/RHEL 9.x、x86_64 | _check_target_os(读 yaml os_check) |
| configless 源 | 目标机能连通控制节点 6817 | 逐台 TCP 探测 192.168.31.16:6817 |
| NFS 服务端 | 目标机能连通 192.168.31.249:2049 |
逐台 TCP 探测 |
| 产物来源 | 控制节点或编译节点上存在 /usr/local/slurm-26.05/bin/sinfo |
_find_artifact_source |
| dnf 可用 | 目标机可执行 dnf |
_check_target_prereqs(缺则阻断) |
| 配置合法性 | submit_node / home_share / module_env / storage_layout / system_auth 均启用且字段合法 |
各 installer 的 validate_config() |
软件包(
munge、nfs-utils、sssd、Lmod等)不要求在 pre_check 时已安装—— 全新节点必然缺失,由 deploy 阶段安装;pre_check 仅提示。
4. 影响范围¶
| 对象 | 影响 |
|---|---|
192.168.31.28(hpc-submit) |
装包、建 slurm 用户、分发 Slurm 客户端产物、写配置、挂载共享盘、接入 LDAP |
| 既有 5 台(.16/.17/.18/.19/.20) | 仅改 /etc/hosts 的集群条目块(加入 hpc-submit 一行);不动服务、不动 slurm.conf |
控制节点 slurmctld |
只在打包产物时被读一次(tar);不重启、不 reconfigure |
| 计算节点在跑作业 | 零影响(--submit-node 不重启 slurmd、不改作业钩子) |
- 是否需停服:否。
- 窗口期:无需停机窗口;
dnf装包在目标机上产生瞬时 IO/网络占用。 - 在跑作业:可照常运行。
5. 分步操作¶
对应实现:
submit_node_deployer.py的deploy()(阶段 1–4)与六个生命周期方法。 下述命令为等价手工复现,以实现体为准。
# ---- 前置:主机改名(本次已执行;幂等,重复执行无副作用)----
# 高危:改主机名前必备份 /etc/hosts,改错会影响本机名解析
ssh root@192.168.31.28 "cp -a /etc/hosts /root/hosts.bak.\$(date +%Y%m%d-%H%M%S)"
ssh root@192.168.31.28 "hostnamectl set-hostname hpc-submit"
ssh root@192.168.31.28 'sed -i "s/rocky9-01/hpc-submit/g" /etc/hosts' # 同步本机 /etc/hosts 条目
# ---- 预演:只输出变更清单,不改动任何系统状态 ----
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node --dry-run
# ---- 正式执行(幂等:已就绪项全部跳过)----
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node
# 实现体内部按以下顺序落地:
# 阶段 1 目标机系统准备:装 submit_node.packages(munge/nfs-utils/tar/gzip)、
# 建 slurm 用户(uid/gid 64030)、放通防火墙端口 6817/6818/6819
# 阶段 2 集群级:munge key 统一(经本机 SFTP 中转,不进命令行)、
# 写 /etc/hosts 集群条目块(控制+计算+提交节点,写全部 6 台)
# 阶段 3 在产物来源节点 tar 打包 install_dir → 上传目标机 → 解压 → 切 symlink
# (同时补运行库缺失项:ldd 探测 + dnf 反查包名)
# 阶段 4 逐台(按 batch_size 分批):运行库 → symlink → 配置来源 →
# 节点基础环境(命令 PATH / sssd+authselect / 共享家目录)→
# Lmod 与 /opt/modulefiles 挂载 → Tier1 挂载(/projects /tools /pdk)
配置来源(configless):目标机无 slurmd,改用环境变量片段
/etc/profile.d/slurm_configless.sh(内容 export SLURM_CONF_SERVER=slurm-master-01:6817,slurm-master-02:6817),
客户端命令据此向控制节点取配置。登录 shell 自动带上;脚本内需显式设置该变量。
6. 验证¶
变更后按下列顺序验证(均为本次实测结果):
# 1) 幂等复跑:第二次必须零变更、全跳过
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node
# 实测:✅ 状态已一致,零变更,无需部署(幂等跳过);29 项全跳过、退出码 0
# 2) 客户端可用性(实现体 health_check 的等价命令)
ssh root@192.168.31.28 'hostnamectl --static' # 预期 hpc-submit
ssh root@192.168.31.28 'systemctl is-active munge' # 预期 active
ssh root@192.168.31.28 'findmnt -rno TARGET,SOURCE -t nfs,nfs4' # 预期 5 行:/home /opt/modulefiles /projects /tools /pdk
ssh root@192.168.31.28 'getent passwd cy01' # 预期 cy01:*:4001:4000:...:/home/cy01:/bin/csh
ssh root@192.168.31.28 "su - cy01 -c 'id -un; echo HOME=\$HOME'" # 预期 cy01 且 HOME=/home/cy01
ssh root@192.168.31.28 'su - cy01 -s /bin/bash -c "sinfo -h -o \"%N %T\""'
# 预期:slurm-work-[01-03] idle(登录 shell 内 PATH 与 SLURM_CONF_SERVER 均已生效)
# 3) 集群侧登记(6 台都应含 hpc-submit,且块只出现一次)
ssh root@192.168.31.16 'sed -n "/BEGIN slurm-deploy/,/END slurm-deploy/p" /etc/hosts'
实测结论(2026-09-25):
| 项 | 结果 |
|---|---|
| 首轮执行 | 退出码 0;81 条记录(71 变更 / 10 跳过);✅ submit 节点客户端可用性校验通过 |
| 幂等复跑 | 退出码 0;29 条全跳过;✅ 状态已一致,零变更 |
sinfo(cy01 / bash 登录 shell) |
slurm-work-[01-03] idle |
| 五处挂载 | 全部指向 192.168.31.249:/data/nfs/* |
/etc/hosts |
31.16 块内含 192.168.31.28 hpc-submit,且历史重复块被规范化为一处 |
7. 回滚¶
# 卸载提交节点(卸挂载 + 移除认证与 PATH 配置 + 摘 symlink + 重建 /etc/hosts 块)
.venv/bin/python main.py --config config/slurm_deploy.yaml --submit-node --rollback
- 备份位置:各节点
/var/backups/slurm/submit_node_<YYYYmmdd_HHMMSS>/(提交节点备份/etc/hosts、/etc/fstab、/etc/nsswitch.conf、/etc/pam.d、sssd.conf; 既有节点仅备份/etc/hosts)。 - 本机备份:
submit_node_onboarding/backup/,逐条登记见 backup/README.md。 - 主机改名回滚:
/etc/hosts与静态主机名的改名前备份在目标机/root/hosts.bak.20260925-011353; yum 源改动的原名备份在目标机/root/yum.repos.d.bak.20260925-014652。 - 回滚不删除数据:共享盘内容、目标机上已分发的 Slurm 产物目录(
/usr/local/slurm-26.05) 均保留,需人工确认后清理。 - 回滚后验证:目标机
findmnt -t nfs无上述 5 处挂载、systemctl is-active sssd非 active、 既有节点/etc/hosts块中无hpc-submit。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
改既有 5 台 /etc/hosts 时误删其它条目 |
只替换 # BEGIN/END slurm-deploy 标记块内的内容;变更前逐台备份 /etc/hosts |
| 主机名与配置不一致导致注册错节点 | pre_check 强校验 hostnamectl --static 与 yaml 的 hostname 一致,不符即中止 |
| 目标机缺包导致中途失败 | 包安装排在 munge key 同步之前(key 权限校正依赖 munge 包);fail_tolerance=0 时任一节点失败即停止后续批次 |
| 产物打包占用控制节点 IO | 仅在有节点缺产物时才 tar;已就绪时跳过(幂等复跑无打包动作) |
| 提交节点被误当计算节点 | submit_node_assets.validate() 强制 role 恰为 ["submit"];slurm.conf 的 NodeName 只含计算节点 |
| 公网镜像极慢(本次实际踩到) | 目标机 Rocky/EPEL 源改指 mirrors.aliyun.com(实测 15 MB/s,官方 mirrorlist 仅 1 KB/s);原名备份见第 7 章 |
| dnf 后台 makecache 抢锁 | 目标机 dnf-makecache.timer 在装包期间临时停用,装完已恢复 enabled;残留 dnf 进程用精确 PID 终止(pkill -f "dnf install" 会匹配到执行命令的 shell 自身,切勿使用) |
LDAP 用户 loginShell 为 /bin/csh |
csh 不读 /etc/profile.d/*.sh,故 su - <用户> 后 sinfo 不在 PATH —— 与既有计算节点行为一致(31.18 实测同样如此);需要命令时用 su - <用户> -s /bin/bash 或绝对路径 /usr/local/slurm/bin/sinfo |
附录 A:交付物清单¶
| 文件 | 说明 |
|---|---|
submit_node_deployer.py |
新子命令实现体(--submit-node,继承主部署器复用其阶段方法) |
submit_node_assets.py |
submit_node 配置段解析与合法性校验 |
main.py |
新增 --submit-node 互斥选项与用法示例 |
slurm_deployer.py |
_hosts_block() 纳入 submit 节点;抽出 _configless_profile_content() 供两处共用 |
config/slurm_deploy.yaml(及 .example) |
nodes.submit 新增 hpc-submit;storage_layout.node_groups 增加 submit;新增 submit_node 段 |
docs/RUNBOOK.md |
新增 4.12 提交节点运维;速查表与节点清单同步 |
docs/HANDOFF.md |
本轮交接快照 |
submit_node_onboarding/ |
本文档、backup/(工程文件备份 + 台账)、logs/(dry-run 与三轮执行日志) |
附录 B:执行日志索引¶
| 日志 | 内容 |
|---|---|
logs/dryrun.log |
首次预演(修复 pre_check 门禁后) |
logs/deploy-1.log |
首轮失败:munge key 校正早于 munge 包安装(chown: invalid user)→ 修正阶段顺序 |
logs/deploy-2.log |
二轮失败:dnf install 被慢源 + makecache 抢锁拖至超时 |
logs/deploy-3.log |
三轮成功:装包 → 产物分发 → 配置 → 挂载 → 校验通过 |
logs/deploy-4-idempotent.log |
幂等复跑:零变更、全跳过 |
来源:
/home/rain/Documents/slurm/slurm_ins/submit_node_onboarding/SOP.md| 最后更新:2026-09-25 01:55(由build/sync.py同步,请勿在站点侧修改)