跳转至

IBM Spectrum LSF Suite CE 10.2.0.12 五节点集群部署 SOP

交付物目录:deploy/lsf/(实现体),本文档为本次变更档案。 分步操作以实现体为准;文档命令为等价示意,供复核与手工复现。

目录

  1. 背景
  2. 目标
  3. 前置条件
  4. 影响范围
  5. 分步操作
  6. 验证
  7. 回滚
  8. 风险说明
  9. 第二轮变更:failover 演练失败修复(2026-09-24)
  10. 第三轮变更:root 命令行权限与认证文件补全(2026-09-24)
  11. 第四轮变更:cgroup v1 切换尝试(2026-09-24,未达业务目标)
  12. 附录 A:排障台账(已单列为 INCIDENT-20260924-部署期故障排障台账.md)
  13. 附录 B:交付物清单
  14. 附录 C:修订记录

一、背景

EDA 个人学习场景,需要一套与既有 Slurm 集群(192.168.31.16~20)并行的 LSF 集群, 共用同一 LDAP(192.168.31.10)与 NFS 宿主机(dell-R620,192.168.31.249/250,HDD /data)。 部署 IBM Spectrum LSF Suite Community Edition 10.2.0.12(内含 LSF 10.1 FixPack 12)。 方案经三轮评审确认(含 EDA 优化基线、Slurm 侧已验证的 LDAP/健康保障能力平移)。

二、目标

# 可验证状态 实测结论
1 5 节点 bhosts 全部 ok 【已确认】5/5 ok
2 管理员与 LDAP 用户作业提交→调度→DONE 全通 【已确认】作业 303/304/311-313 DONE,-m 指定 work-01/02/03 执行位正确
3 节点互信(known_hosts + authorized_keys 全互联) 【已确认】5×5
4 LDAP 认证全节点生效(getent/su/sssd) 【已确认】probe_user=rain01 全节点可解析
5 优化基线生效(MBD_SLEEP_TIME=15、JOB_ACCEPT_INTERVAL=0、用户限额、fairshare 段) 【已确认】lsb.params/lsb.users 就位,badmin reconfig 通过
6 健康巡检 timer 每 15 分钟执行 【已确认】lsf-health.timer active
7 LDAP→LSF 用户组每日同步 timer 【已确认】lsf-user-sync.timer active,首次同步建组成功
8 幂等:复跑第二次零变更全跳过 【已确认】7 个阶段全部「零变更跳过」,py_exit=0
9 主备 failover 演练:停主 master 后备接管 【已确认】2026-09-24 20:50 实测通过(停服后 120s 备接管,脚本退出码 0);详见第九章

三、前置条件

项目 要求 核实方式
操作机 dell-R620(.249/.250),对 5 台 root 免密,免密 sudo(NOPASSWD) ssh -o BatchMode=yes root@192.168.31.23 hostname;sudo -n true
节点 Rocky Linux 9.8,.23~.27,/etc/hosts 五映射已配 预检查自动校验
NFS 宿主机已有 /data/nfs/home 导出(复用 Slurm 资产);/data/nfs/lsf 由阶段1 创建 sudo -n exportfs -v
LDAP ldap://192.168.31.10:389,bind 凭据见 deploy/lsf/config/credentials.yaml(600,不入文档) 预检查自动校验
安装包 IBM_Spectrum_LSF/lsfsce10.2.0.12-x86_64.tar.gz(项目根) 预检查校验大小与导出目录空间
运行环境 deploy/lsf/.venv + 共享库挂载 /home/rain/py_public_modules .venv/bin/python -c "import base_module"

四、影响范围

主机 变更
.23~.27(5 台) 装依赖包(libnsl/libnsl2/nfs-utils/tar/ed/gawk/…/initscripts 共 17 个);firewalld stop+disable;SELinux setenforce 0 + 配置改 disabled(重启后彻底);互写 known_hosts/authorized_keys;sssd+authselect 接管 NSS/PAM;挂载 /data/nfs/lsf 与 /home(fstab 持久化);LSF 守护(lim/res/mbatchd/sbatchd);/etc/lsf.sudoers;profile.d/lsf.sh
宿主机 .249/.250 /etc/exports 新增 /data/nfs/lsf 导出(改前已备份);新建 /data/nfs/lsf 目录
共享 NFS LSF 安装于 /data/nfs/lsf/lsf(LSF_TOP);安装源 /data/nfs/lsf/src;配置 conf/lsf.conf、conf/lsbatch/lsfce/configdir/*
  • 是否停服:5 台初始无业务,不停任何既有服务(Slurm 集群在不同主机,零影响)。
  • 窗口期:全流程约 90 分钟(含 1.7G 包复制与解压、多轮排障);单次幂等复跑约 4 分钟。
  • 被改写的系统配置:/etc/exports、各节点 /etc/selinux/config、/etc/fstab、/etc/sssd/sssd.conf(新增)、 /etc/lsf.sudoers(新增)、authselect 接管 /etc/nsswitch.conf 与 /etc/pam.d/*。

五、分步操作

实现体:deploy/lsf/(main.py/deployer.py/stages/);下列为等价示意,以实现体为准*。

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf

# —— 门禁:只读预检查(配置校验+环境检查,落盘报告)——
.venv/bin/python main.py --config config/lsf_deploy.yaml --precheck

# —— 预演:零副作用输出全部变更清单(已实测核查过系统状态未变)——
.venv/bin/python main.py --config config/lsf_deploy.yaml --dry-run

# —— 主部署:阶段0准备 → 1 NFS → 2 LDAP认证 → 3-6安装/加固/hostsetup/认证三件套
#            → 7-8启动冒烟 → 10优化 → 11健康timer → 12用户同步timer ——
.venv/bin/python main.py --config config/lsf_deploy.yaml

各阶段核心动作(等价示意):

# 阶段0:依赖与基线(5 台)
dnf install -y libnsl libnsl2 libtirpc nfs-utils tar gzip ed gawk bc expect \
    which procps-ng net-tools sysstat lsof openssh-clients initscripts chkconfig
systemctl disable --now firewalld                    # [高危] 停防火墙
setenforce 0; sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config \
    && cp -a /etc/selinux/config /etc/selinux/config.bak.<ts>   # [高危] 先备份
ssh-keyscan -H <各节点> >> /root/.ssh/known_hosts     # host key 互信
cat <各节点id_ed25519.pub> >> /root/.ssh/authorized_keys  # 认证公钥互信

# 阶段1:NFS(宿主机 + 5 台)
sudo -n mkdir -p /data/nfs/lsf
cp -a /etc/exports /etc/exports.bak.<ts>             # [高危] 改前必备份
echo "/data/nfs/lsf 192.168.31.0/24(rw,async,no_subtree_check,no_root_squash)" \
    | sudo -n tee -a /etc/exports && sudo -n exportfs -ra
mount -t nfs -o rw,soft,_netdev 192.168.31.249:/data/nfs/lsf /data/nfs/lsf  # [高危] 覆盖挂载
mount -t nfs -o rw,soft,_netdev 192.168.31.249:/data/nfs/home /home         # [高危] /home 为空目录才挂
awk -v p=/home '$2 != p' /etc/fstab > /tmp/f && cat /tmp/f > /etc/fstab     # 字段精确匹配防误删

# 阶段2:LDAP 认证(5 台,顺序不可颠倒:先 NSS 后 PAM)
dnf install -y sssd sssd-ldap oddjob oddjob-mkhomedir openldap-clients tcsh
install -m 600 <渲染后的sssd.conf> /etc/sssd/sssd.conf   # ldap_id_mapping=false(用真实 uid)
systemctl enable --now sssd
getent passwd rain01                                  # 轮询直到解析成功后才允许下一步
authselect select sssd with-mkhomedir --force         # [高危] 接管 PAM/NSS;失败即回退 minimal
systemctl enable --now oddjobd

# 阶段3-6:安装(master-01 一次 + 全节点初始化)
cp <安装包> /data/nfs/lsf/src/ && sudo -n tar -xzf ... -C /data/nfs/lsf/src
zcat <lsfinstall.tar.Z> | tar xf -
# 写 install.config(LSF_TOP/ADMINS=ldapadmin/双master/5 server/TARDIR)
/tmp/lsf_res_smoke 内解二进制跑 res -V                 # Rocky9 兼容冒烟,失败即中止
printf '1\n' | ./lsfinstall -f install.config           # 装完回查 lsf.cluster 存在
echo 'LSF_RSH=ssh' >> conf/lsf.conf                     # [高危] 共享 conf,先备份
echo 'LSF_STRICT_CHECKING=ENHANCED' >> conf/lsf.conf    # 官方强制
echo 'LSF_ADMINS="ldapadmin root"' >> conf/lsf.conf
<lsf_top>/10.1/install/hostsetup --top=<lsf_top> --boot=y   # 5 台,产 lsfd.service
<lsf_top>/10.1/install/hostsetup --top=<lsf_top> --setuid   # eauth/badmin setuid
ln -sf ../etc/eauth <machdep>/bin/eauth                 # mbatchd 服务端找 eauth 的路径
cat > /etc/lsf.sudoers <<EOF                            # 5 台各一份,含 LSF_EAUTH_KEY
LSF_STARTUP_USERS="root"
LSF_STARTUP_PATH="<machdep>/etc"
LSF_EAUTH_KEY="<部署器生成>"
EOF

# 阶段7-8:启动与冒烟
bash -lc 'lsf_daemons start'                            # 逐台;轮询 bhosts STATUS=ok ≥5
su - ldapadmin -s /bin/bash -c "bash -lc 'bsub sleep 15'"   # b* 命令经 LSF_ADMINS
su - rain01 -s /bin/bash -c "bash -lc 'bsub sleep 10'"      # LDAP 用户
su - ldapadmin -s /bin/bash -c "bash -lc 'bsub -m lsf-work-01 hostname'"  # 3 台执行位
# 通过后写共享标记 conf/.smoke_ok(幂等标志,经节点 root 写入)

# 阶段10:优化基线(conf/lsbatch/lsfce/configdir/)
# lsb.params 语法必须 "KEY = value"(带等号);lsb.users 的 Default 行只能插在
# End User 精确行前(^End User 会误匹配 End UserGroup)
echo 'MBD_SLEEP_TIME = 15' >> lsb.params
echo 'JOB_ACCEPT_INTERVAL = 0' >> lsb.params
# lsb.users:Begin User 段内 Default 100 5 + Begin Share 段
su - ldapadmin -s /bin/bash -c "bash -lc 'badmin reconfig'"

# 阶段11:健康巡检(master-01)
install -m 755 <渲染的lsf_health_check.sh> /usr/local/bin/
install -m 644 <lsf-health.service/.timer> /etc/systemd/system/
systemctl daemon-reload && systemctl enable --now lsf-health.timer

# 阶段12:LDAP→LSF 用户组同步(master-01)
install -m 600 <ldap.pass> /etc/lsf-usermgmt/ldap.pass   # [高危] 凭据 600,不进命令行
install -m 755 <渲染的lsf_user_sync.py> /usr/local/bin/
systemctl enable --now lsf-user-sync.timer               # 每日 03:30
su - ldapadmin -s /bin/bash -c /usr/bin/python3 /usr/local/bin/lsf_user_sync.py  # 立即首同步

六、验证

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf

# 1. 幂等验收(关键):第二次复跑零变更
.venv/bin/python main.py --config config/lsf_deploy.yaml
#   预期:7 个阶段全部「⏭ 零变更跳过」,最终 ✅ 全部阶段执行完成,退出码 0

# 2. 只读漂移检测
.venv/bin/python main.py --config config/lsf_deploy.yaml --drift
#   预期:退出码 0(无漂移)

# 3. 集群与节点
ssh root@192.168.31.23 "su - ldapadmin -s /bin/bash -c \"bash -lc \\
  'bhosts -w; bqueues | head -4'\""
#   预期:5 行 STATUS=ok;admin/owners/priority/... 队列 Open:Active

# 4. 作业链路
su - ldapadmin -s /bin/bash -c "bash -lc 'bjobs -a -w | tail -5'"
#   预期:历史作业含 EXEC_HOST 落在 lsf-work-01/02/03 且 STAT=DONE

# 5. LDAP 认证(5 台)
for ip in 23 24 25 26 27; do ssh root@192.168.31.$ip \\
  "getent passwd rain01 | cut -d: -f1,3,6"; done
#   预期:5 行 rain01:2001:/home/rain01

# 6. timer
ssh root@192.168.31.23 "systemctl is-active lsf-health.timer lsf-user-sync.timer"
#   预期:active active

# 7. 用户组同步结果
su - ldapadmin -s /bin/bash -c "bash -lc 'busers -g'"
#   预期:frontend/analog/it/backend 等部门组已建立

# 8. 优化参数
grep -E 'MBD_SLEEP|JOB_ACCEPT' /data/nfs/lsf/lsf/conf/lsbatch/lsfce/configdir/lsb.params
#   预期:MBD_SLEEP_TIME = 15 / JOB_ACCEPT_INTERVAL = 0

# 9. 主备 failover 演练(高危:停主 master;须先确认无活动作业)
.venv/bin/python main.py --config config/lsf_deploy.yaml --failover-test
#   预期:暂停 lsf-health.timer → 停主 master → ~2 分钟后备接管(lsid 显示
#   master 变为 lsf-master-02)→ bqueues 正常 → 恢复主 master + hopen →
#   bhosts 5 台 ok → 状态 success、退出码 0(实测耗时 222s,见第九章)

# 10. root 命令行权限(第三轮变更;5 台任一节点均可)
ssh root@192.168.31.23 "source /data/nfs/lsf/lsf/conf/profile.lsf; \
  bqueues | head -3; bhosts -w"
#   预期:正常输出队列与 5 台 ok,不再报 User permission denied

七、回滚

备份存放位置:deploy/lsf/backup/(台账见 backup/README.md)。 散落在 NFS 与节点的原位备份同样在台账中登记(lsf.conf/lsb.*/install.config/selinux config 等)。

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf

# 分阶段/全量回滚(逆序执行各阶段 rollback;无法自动回滚的项会提示人工步骤)
.venv/bin/python main.py --config config/lsf_deploy.yaml --rollback
.venv/bin/python main.py --config config/lsf_deploy.yaml --rollback --stage node-env

# 手工兜底要点(实现体失败时):
# 1) 停 LSF:systemctl stop lsfd(5 台)
# 2) 还原 lsf.conf / lsb.params / lsb.users:cp NFS 侧 *.bak.<ts> 回原名后 badmin reconfig
# 3) 还原宿主机 exports:见 backup/README.md,然后 sudo -n exportfs -ra
# 4) 卸挂载:umount /data/nfs/lsf && umount /home(先删 fstab 对应行)
# 5) PAM/NSS 还原:authselect select minimal --force;sssd 配置删除
# 6) SELinux 还原:cp /etc/selinux/config.bak.<ts> 回原名(重启后生效)

回滚后验证:systemctl is-active lsfd 5 台、getent passwd rain01 回落到无输出(若卸认证)、 findmnt /data/nfs/lsf 无输出、宿主机 exportfs -v 无 lsf 行。

八、风险说明

# 风险 影响 缓解
R1 Rocky 9.8 不在 LSF 10.1 FP12 官方支持列表 二进制兼容隐患 【已确认】res -V 冒烟通过(build 600488),实测作业可跑;但 cgroup 资源限制不可用:FP12 只认 cgroup v1 而 Rocky 9 默认 v2-only,切 v1 的兜底已试且无效(第十一章),唯一解法=升级 FP15+ 二进制
R2 NFS 单点在管理机 .249/.250 管理机宕则全集群配置不可访问 用户已接受;SLA 依赖管理机稳定性
R3 ~~root 对需 mbatchd 认证的 b* 查询报 User permission denied~~ 已闭环(2026-09-24 第三轮变更) — 根因=LSF 安全默认值(lsf.conf 缺 LSF_ROOT_USER,默认禁止 root 走命令行);已加 LSF_ROOT_USER=Y + badmin mbdrestart 放行并补齐认证文件,详见第十章
R4 ~~主备 failover 演练未通过~~ 已闭环(2026-09-24 第二轮变更) — 4 条根因已修复并实机验证通过;详见第九章
R5 lsfstartup 在本环境交互空转(原因未完全定位) 不能用它做全量启动 用逐台 lsf_daemons start(等价且可控);已知诱因 Install.err 残留触发死循环提示,启动前必须清理
R6 /home 挂载遮蔽本地目录 本地 /home 内容不可见 挂载前核实 5 台本地 /home 均为空【已确认】
R7 authselect 接管 PAM/NSS 配置错误可致 SSH 登录失败 流程强制「先 NSS 后 PAM」,authselect 后立即校验,异常就地回退 minimal;变更前备份 nsswitch/pam
R8 CE 版限制:≤10 主机、单/双路 ≤64 核、≤2500 活动作业、App Center ≤10 并发 扩展上限 当前 5 节点/30 核,余量充足

九、第二轮变更:主备 failover 演练失败修复(2026-09-24)

1. 背景

首轮部署的目标 9(主备演练)两次失败,均报「90s 内 lsf-master-02 未接管」。 只读排障定位 4 条根因(证据见 INCIDENT-20260924-部署期故障排障台账.md 第 4 章 17–20 条),修复 stages/failover.py 后完成实机闭环验证。

2. 目标与结果

# 可验证状态 实测结论
1 停主 master 后备 master 自动接管 【已确认】20:49:07 接管(停服后 120s)
2 接管后调度可用且脚本走完全流程 【已确认】bqueues 正常 → 恢复主 master → hopen → bhosts 5/5 ok
3 演练不被健康巡检自愈干扰 【已确认】timer 暂停/恢复状态均确认
4 演练整体成功 【已确认】状态 success、退出码 0、耗时 222s

3. 前置条件

同第三章;另需集群 5 台 ok 且无活动作业(脚本 pre_check 强制校验,有作业即拒演)。

4. 影响范围

  • 停服对象:主 master(lsf-master-01)的 LSF 服务;窗口内集群由备 master 接管,无法提交/查询作业
  • 窗口期:实测约 3.5 分钟;演练结束集群自动回到 5 台 ok,其它服务不受影响

5. 分步操作(以实现体为准)

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py --config config/lsf_deploy.yaml --failover-test   # [高危] 停主 master

实现体内部顺序:暂停 lsf-health.timer → 停主 master lsfd → 轮询备机接管(≤600s)→ 轮询调度就绪(≤180s)→ 恢复主 master + badmin hopen → 校验 bhosts ok 数 → finally 恢复 timer。

6. 验证

见第六章第 9 条。实测时间线:

时刻 事件
20:47:07 暂停 lsf-health.timer(确认 inactive)→ 停 lsf-master-01 的 lsfd
20:49:07 备 master 接管:master → lsf-master-02(耗时 120s)
20:50:46 调度就绪 → 恢复 lsf-master-01 → hopen → bhosts 5/5 ok → success,退出码 0

7. 回滚

cp deploy/lsf/backup/deploy/lsf/stages/failover.py.bak.20260924-201636 \
   deploy/lsf/stages/failover.py      # 回到改动前实现

台账见 backup/README.md。回滚仅影响演练工具,不改变集群运行态。

8. 风险说明

# 风险 缓解
R9 演练窗口内集群无主 master 可用 学习集群无生产作业;脚本强制校验无活动作业;实测窗口 3.5 分钟
R10 备机接管初始化期间 b* 查询短暂不可用 改为轮询等待 180s;仍失败则自动恢复主 master 回常态

十、第三轮变更:root 命令行权限与认证文件补全(2026-09-24)

1. 背景

首轮遗留的风险 R3:root 执行任何 b* 命令都报 User permission denied(ls* 正常、 LDAP 管理员与普通用户正常),长期以「b* 统一经 ldapadmin」规避。本轮定位到根因并修复。

2. 目标与结果

# 可验证状态 实测结论
1 root 可执行 b* 命令 【已确认】5 台的 bqueues/bhosts -w/bjobs 均正常
2 原有账号不受影响 【已确认】rain01(普通用户)与 ldapadmin(管理员)回归正常
3 认证文件全节点齐备且一致 【已确认】5 台 /etc/lsf.sudoers 齐备、LSF_EAUTH_KEY 摘要一致、权限 600
4 修复固化进部署器且保持幂等 【已确认】编译通过;修复 R14 后复跑 8 个阶段全部「零变更跳过」、退出码 0

3. 前置条件

集群 5 台运行中、无活动作业(本轮不停服,仅重启 mbatchd);操作机到 5 台 root 免密 (分发 /etc/lsf.sudoers 走节点间 scp)。

4. 影响范围

  • 共享配置 conf/lsf.conf 追加 1 行(改前已备份)
  • badmin mbdrestart:查询/提交短暂中断(实测秒级,窗口内无作业)
  • 5 台补写本机文件 /etc/lsf.sudoers(600,含 eauth 密钥)
  • 其余服务与 Slurm 集群不受影响

5. 分步操作(以实现体为准)

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage install   # 部署器已固化:自动追加 LSF_ROOT_USER=Y
# 存量集群的手工等价步骤:
#   cp -a conf/lsf.conf conf/lsf.conf.bak.<ts>            # [高危] 改共享配置前必备份
#   echo 'LSF_ROOT_USER=Y' >> conf/lsf.conf               # 幂等:grep -q 已存在则不追加
#   su - ldapadmin -s /bin/bash -c "bash -lc 'yes y | badmin mbdrestart'"   # [高危] reconfig 不生效
#   scp /etc/lsf.sudoers root@<各节点>:/tmp/ && ssh <各节点> "mv ... && chmod 600 ..."  # 5 台一致

6. 验证

见第六章第 10 条。实测要点:5 台任一节点 root 执行 bqueues/bhosts -w 正常; rain01、ldapadmin 回归正常。

7. 回滚

#   1) 删去 lsf.conf 中的 LSF_ROOT_USER=Y(或 cp 回 conf/lsf.conf.bak.20260924-213033)
#   2) su - ldapadmin -s /bin/bash -c "bash -lc 'yes y | badmin mbdrestart'"
#   3) 如需还原认证文件:cp /etc/lsf.sudoers.bak.20260924-211401 /etc/lsf.sudoers(仅 master-01)

台账见 backup/README.md。

8. 风险说明

# 风险 缓解
R11 LSF_ROOT_USER=Y 允许 root 从命令行执行 LSF 命令,官方提示「会弱化安全,不推荐」 内网学习集群且 firewalld 已禁用(依赖内网隔离);如需收紧,删该行 + mbatchd restart 即回默认禁止
R12 /etc/lsf.sudoers 含 LSF_EAUTH_KEY 权限 600、仅本机 root 可读;凭据不进命令行与文档;分发用节点间 scp
R13 该参数 reconfig 不生效,易误判「改了没用」 部署器日志与 RUNBOOK 场景3 均标注「必须 mbatchd restart(或重启 lsfd)」
R14 ~~install_config 的 probe 用未解析的配置路径,导致 install 阶段每次复跑都重生成 install.config 并留 .bak~~ 已修复(2026-09-24 同日):probe 改为先 _resolve_installer_dir() 再检查 修复后实测 8 阶段全部「零变更跳过」,不再产生冗余 .bak

十一、第四轮变更:cgroup v1 切换尝试(2026-09-24,未达业务目标)

1. 背景

FP12 二进制只认 cgroup v1,Rocky 9 默认 v2-only,守护启动即报 cg_load_hierarchies: Please use the LSF package with higher glibc version to enable LSF cgroup v2 support,作业级资源限制无法落地。升级 FP15 才是正解,但介质被两道关卡阻断 【已确认】:early-access(CE 免费包)返回 US Export Validation is Under Review(美国出口 管制审查中);Fix Central 上 FP16 SPK(lsf-10.1-spk-2026-Jun-build603045)下载被拒 IBMAVS5548 未找到适用的 IBM 支持协议。故改试「切回 cgroup v1」兜底。

2. 目标与结果

目标:运行态切 v1 后 FP12 能启用 cgroup,恢复作业级资源限制。 结果:切 v1 成功(5 台 tmpfs、参数已写入、集群 5/5 ok),但业务目标未达成——重启后 LSF 仍拒绝启用 cgroup,未建立任何 cgroup 层次。

3. 前置条件

无活动作业(bjobs -u all 为空);5 台 root SSH 免密;grubby 可用;BIOS 固件; 5 台为 KVM 虚拟机(可重启)。

4. 影响范围

5 台滚动重启(worker → 备 master → 主 master);期间暂停 lsf-health.timer;primary master 重启期间由备接管调度(属预期)。无作业损失,不可逆点无。

5. 分步操作(以实现体为准)

实现体为部署器新增独立阶段 cgroup(deploy/lsf/stages/cgroup_v1.py,不在主流程,须显式触发):

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage cgroup --dry-run   # 预演(零改动)
.venv/bin/python main.py --config config/lsf_deploy.yaml --stage cgroup             # 执行

内部序列:备份 GRUB → grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0" → 暂停健康 timer → 逐台 hclose → systemctl reboot → 等就绪(启动标识变化 + cgroup=tmpfs + lsfd active)→ hopen → 恢复 timer → 验证。完整命令、手工兜底与回滚见 cgroup_v1/SOP.md。

6. 验证

通过项:5 台 /sys/fs/cgroup = tmpfs、bhosts 5/5 ok、lsfd 全 active、幂等复跑判 「无漂移、零变更跳过」。 未通过项:sbatchd 日志重启后仍报 v2 提示、LSF 未建 cgroup 层次。

7. 回滚

grubby --update-kernel=ALL --remove-args="systemd.unified_cgroup_hierarchy=0" + 人工确认后 重启;备份与台账见 cgroup_v1/backup/README.md。当前决定不回滚(避免无收益的重启), 待 FP15 升级时一并移除该参数。

8. 风险说明

  • cgroup v1 在 RHEL9 已 deprecated(RHEL10 移除);本参数无收益,可随时回退;
  • 改 GRUB 的风险由 grubby(官方方式)+ 改前备份 + 逐台递进验证覆盖;
  • 真正的解法仍落在 FP15+ 升级:见 fp15_upgrade/SOP.md。

十二、第五轮变更:submit 节点接入(2026-09-25)

背景与结果:新增主机 192.168.31.28(hpc-submit)作为 LSF submit 节点(只提交不执行)。 部署器新增 nodes.submit 角色与独立阶段 14(--stage submit),实机接入完成并闭环验证。

LSF 侧最终形态(实机验证): - lsf.cluster.lsfce Host 段:hpc-submit ! ! 1 ()(server=1,集群成员) - lsb.hosts Host 段:hpc-submit 0 () () () () () (Y)(MXJ=0)→ bhosts -w 显示 closed_Full / MAX=0,静态禁止其接收作业 - 本机运行 lim/res/sbatchd;/etc/lsf.sudoers 权限 600(644 时 eauth 失效)

关键根因(详见 ../submit_node/SOP.md 附录 A): 1. /etc/lsf.sudoers 写 644 → mbatchd userok: eauth authentication failed → 客户端 User permission denied;改 600 即通 2. ssh-keyscan 注释行(3 字段)被当作 key 行 + known_hosts 用 key 前缀比对(ecdsa 公钥 前缀雷同)→ 阶段 0 的 mesh_ssh 恒判 pending、缺失 key 永不写入(已在 prepare.py 修复) 3. lsadmin reconfig / badmin mbdrestart 为交互命令,空应答会「未执行但看似正常」

防回归:cluster_up / failover / cgroup_v1 / lsf_install 的期望集合改用 exec_nodes()(masters+workers),submit 节点不计入 bhosts ok 判据、不参与 cgroup 重启。

验收:--stage submit 复跑「零变更跳过」;阶段 0/1/2 复跑同为幂等; --drift 全阶段(0/1/2/3-6/7-8/10/11/12/14)无漂移,rc=0; 从 hpc-submit 提交作业 DONE 且执行位落在 lsf-work-0x(实测作业 739 → lsf-work-03)。

完整八章档案、备份台账与交付物清单见 ../submit_node/SOP.md。

十三、第六轮变更:/projects 共享存储纳管(2026-10-07)

背景与结果:slurm_ins 的 EDA 集群存储拓扑巡检(2026-10-06 实测 / 10-07 复核)§二 G1 指出 「.25–.27 缺 /projects」——从统一提交节点 .28 提交、脚本内引用 /projects 的作业落到 执行节点即失败。本次给 .25–.27 补齐挂载,并把 /projects 纳入部署器阶段1 的受管挂载项 (而非手工挂载,否则 --drift 漏检、复跑不收敛)。同时修正 .28 的既有缺陷:它有挂载但 /etc/fstab 无记录(重启即丢)。

实现体改造(deploy/lsf/stages/nfs_share.py):原 _pairs 硬编码 lsf/home 两组, 改为按节点返回的 _mounts_for(node),新增 _opts_for(key) 与 _opts_satisfied(); 配置新增 nfs.projects_{export_path,mountpoint,mount_opts,hosts} 四项 (projects_hosts 按节点 name 限定,两台 master 因 MXJ=0 不纳管)。

关键坑: 1. .28 实挂选项里 actimeo=30 被内核展开为 acregmin/acregmax/acdirmax=30,字符串比对会误判 「选项漂移」→ 触发无谓重挂;_opts_satisfied() 需对两者做等价判定(首次实现方向写反, 由 dry-run 清单抓到); 2. 作业输出写 /tmp/x.out 落在执行节点本地盘,提交节点读不到;验收须输出到共享路径。

验收(实机):4 台 findmnt /projects = 192.168.31.249:/data/nfs/projects(nfs4/rw, 1.8T/38%);阶段1 复跑「全跳过」;--drift 全阶段无漂移 rc=0;findmnt --verify 0 errors; 端到端——作业 1047 从 hpc-submit 提交、执行位 lsf-work-03、ls /projects 成功(DONE)。

范围外:同批巡检的「修挂载」(.21/.25/.26/.27 的 /mnt/lustre)归属 lustre 项目 (lustre_ins HANDOFF §3.1 #14);.25–.27 的 /local_scratch(需各配本地盘,硬件前置) 仍待办。

完整八章档案、分步 shell、回滚与备份台账见 ../projects_mount/SOP.md。

十四、第七轮变更:本地 scratch(/local_scratch)纳管(2026-10-07)

背景与结果:巡检报告 §二 G1 的第二部分指出 .25–.27 缺本地临时层 /local_scratch, 原判「须在各节点配一块本地盘(非纯软件动作)」。本次取证推翻该前提:三台是 本机 KVM 虚机(virsh list 可见),而同宿主的 Slurm 三台早已用「宿主建 qcow2 + virsh attach-disk 热插 + 节点 mkfs.xfs」的方式挂载(/kvm/img/*-scratch.qcow2)。故本次按 同一口径实现为部署器独立阶段 15(--stage local-scratch)——不手工操作,否则 --drift 漏检。

实现体(新增 deploy/lsf/stages/local_scratch.py):宿主侧 qemu-img create 建虚盘 + virsh attach-disk 热插(空闲 vdX 由 virsh dumpxml 推导,不硬编码);节点侧 mkfs.xfs → fstab 按 UUID → 挂载 → /local_scratch/users(1777)→ profile.d 导出 LOCAL_SCRATCH。配置新增 local_scratch: 段(与 slurm 同口径);deployer.py / main.py / stages/__init__.py / config_validate.py 四处同步注册与校验。

安全判据(不可绕过):危险目标全部由实机推导——盘须位于配置存储池内、命名合规、 不得被其它虚机引用;节点侧须同时满足「非根设备、无子分区、无既有文件系统」, 任一条不符即判 unknown 并中止(不格式化)。

验收(实机):执行 26.3 s、三台 success;复跑「零变更跳过」;--drift 全阶段无漂移 (含 阶段15(local-scratch): 无漂移)rc=0;三台 /dev/vdb → /local_scratch xfs rw,noatime (50G)、fstab 各 1 条 UUID 条目、users 为 drwxrwxrwt、profile 内容正确;端到端——作业 1049 落在 lsf-work-01,df -h /local_scratch 与 LOCAL_SCRATCH_WRITABLE 均通过。 与 Slurm 侧的挂载源/文件系统/选项/fstab 形式/权限/profile 导出项逐项一致。

遗留(2026-10-08 已闭环):作业级 TMPDIR 已由 ../tmpdir_inject_20261008/SOP.md 注入 /local_scratch/users/<jobID>.tmpdir(lsf.conf 的 LSB_JOB_TMPDIR + LSB_SET_TMPDIR,重启 sbatchd 生效)。

完整八章档案、安全判据与回滚见 ../local_scratch/SOP.md。

附录 A:排障台账

已单列为独立事故台账 INCIDENT-20260924-部署期故障排障台账.md (25 条根因 + 跨轮根因索引 + 行动项,2026-10-08 从本附录迁出)。本 SOP 只保留变更本身的 实施 / 验证 / 回滚;后续同类记录按 INCIDENT-YYYYMMDD-<主题>.md 追加,不再写回本文件。

附录 B:交付物清单

文件 用途
deploy/lsf/ 部署工具工程(venv、配置、实现体、assets、backup 台账)
deploy/lsf/main.py 等 实现体(阶段0-12 + precheck/drift/rollback/failover CLI)
deploy/lsf/config/lsf_deploy.yaml(.example) 部署配置(实例含 LDAP 地址,600)
deploy/lsf/config/credentials.yaml(.example) LDAP bind 凭据(600,不入 git)
deploy/lsf/backup/README.md 备份台账
docs/SOP.md 本文档
docs/RUNBOOK.md 日常运行与故障处置手册
docs/HANDOFF.md 交接快照
docs/INCIDENT-20260924-部署期故障排障台账.md 事故与排障台账(原附录 A 单列,2026-10-08)

附录 C:修订记录

日期 修改人 变更内容
2026-09-24 部署执行人 首版:13 阶段部署 + 幂等验收通过;登记 R3/R4/R5 遗留项与附录 A 排障台账
2026-09-24 部署执行人 第二轮:failover 演练 4 条根因 + 2 处收尾缺陷修复,实机闭环验证通过;同步更新目标 9、第六章第 9 条、风险 R4、新增第九章、附录 A/C
2026-09-24 部署执行人 第三轮:定位并修复 root b* 权限(LSF_ROOT_USER=Y + mbatchd restart)与认证文件补全(5 台 sudoers),部署器固化;同步修复 R14(install_config probe 口径),复跑达成 8 阶段全零变更;更新 R3、第六章第 10 条、新增第十章、附录 A/C
2026-09-24 部署执行人 第四轮:cgroup v1 切换(GRUB 参数 + 5 台滚动重启)执行成功但未达业务目标——FP12 在 Rocky 9 下仍不启用 cgroup(systemd 252 保留 cgroup2 挂载、禁用参数已移除);FP15 升级因 IBM 出口审查(US Export Validation)与支持协议(IBMAVS5548)双重阻断挂起;新增第十一章、更新 R1 与 RUNBOOK 第10节、HANDOFF 整体重写
2026-10-08 部署执行人 交付文档复核:排障台账单列为 docs/INCIDENT-20260924-部署期故障排障台账.md(附录 A 压成指针);RUNBOOK 节点口径由「5 台」校正为「6 台(含 hpc-submit)」、容量口径校正为「3 台执行节点 / 24 核」
2026-09-25 部署执行人 第五轮:新增 submit 节点接入(192.168.31.28 / hpc-submit)——部署器增 nodes.submit 角色与独立阶段 14,LSF 侧为 lsf.cluster server=1 + lsb.hosts MXJ=0(只提交不执行);修复 prepare.py known_hosts 判据(keyscan 注释行 + 完整 key 比对);全阶段 drift 无漂移、复跑零变更;新增第十二章与 submit_node/SOP.md、HANDOFF 整体重写

来源:/home/rain/Documents/LSF/lsf_ins/docs/SOP.md | 最后更新:2026-10-08 03:49(由 build/sync.py 同步,请勿在站点侧修改)