IBM Spectrum LSF Suite CE 10.2.0.12 五节点集群部署 SOP¶
交付物目录:
deploy/lsf/(实现体),本文档为本次变更档案。 分步操作以实现体为准;文档命令为等价示意,供复核与手工复现。
目录¶
- 背景
- 目标
- 前置条件
- 影响范围
- 分步操作
- 验证
- 回滚
- 风险说明
- 第二轮变更:failover 演练失败修复(2026-09-24)
- 第三轮变更:root 命令行权限与认证文件补全(2026-09-24)
- 第四轮变更:cgroup v1 切换尝试(2026-09-24,未达业务目标)
- 附录 A:排障台账(已单列为 INCIDENT-20260924-部署期故障排障台账.md)
- 附录 B:交付物清单
- 附录 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同步,请勿在站点侧修改)