跳转至

SOP:新增 192.168.31.18/19/20 为挂载客户端

C 类变更 | 执行日期 2026-09-24 | 实现入口 main.py add-client 本档案与本主题 backup/ 同目录;日常使用说明见 docs/RUNBOOK.md,add-client 通用流程见 docs/SOP.md 5.6。

1. 背景

edafs 此前只有 192.168.31.21 一个客户端(与 MGS+MDT 同机,作管理/验证用)。三台 EDA 仿真计算节点 .18/.19/.20 需要挂载同一文件系统读写仿真数据。

三台均为干净节点:Rocky Linux 9.8、原厂内核 5.14.0-687.10.1.el9_8.0.1、无 lustre 包、LNet 未配置、ens2 到 .21 路由可达、root 免密 SSH 可用。

执行中暴露并修复了两个工程自身缺陷(见第 8 章)。

2. 目标

变更完成后应同时满足:

  1. 三台节点运行 lustre 定制内核 5.14.0-611.13.1_lustre.el9.x86_64,kmod-lustre-client 模块可加载
  2. 三台各有 NID <ip>@tcp,lctl ping 192.168.31.21@tcp 通
  3. 三台 192.168.31.21@tcp:/edafs 挂载在 /mnt/lustre,fstab 条目带 nofail,lnet 与 lustre-tune 服务均 enabled
  4. 三台 mdc.*.max_mod_rpcs_in_flight 为 31(受服务端 mdt.*=32 压制的合法上限)
  5. 客户端可实际读写:8 MB 直写(oflag=direct)成功
  6. add-client 复跑幂等:第二次零变更、全跳过
  7. inspect 巡检 5 节点异常数为 0,既有 .21/.22 不受影响

3. 前置条件

项 要求 本次实测
执行身份 操作机 root 免密 SSH 到全部目标节点 满足
节点状态 目标节点无 Slurm/LSF 在跑作业 precheck 通过
时钟 节点间偏移 ≤ 5 s(precheck.max_clock_offset_sec) 通过
磁盘 系统盘可用 ≥ 10 GB .20 95 G
仓库 whamcloud client 仓库可达 200
用户授权 三台均需装内核并各重启一次,已获明确授权 已确认

门禁:变更类子命令执行前自动跑配置校验 + precheck,出 BLOCK 即停。

4. 影响范围

维度 说明
涉及主机 新增 .18/.19/.20;.21/.22 仅被探测,幂等跳过(.22 未重启,up 2 days)
涉及组件 客户端侧:repo、lustre-client 包、内核、防火墙 988、LNet、挂载、fstab、lctl 调优
服务端 零改动,无 mkfs,edafs 数据不受影响
是否停服 不停服,已有客户端与业务不受影响
窗口期 三台各一次重启(高危,工具编排并等待回来自检,失败自动回滚原默认内核);串行执行
在跑作业 变更前 precheck 未检出 Slurm/LSF 作业

5. 分步操作

以实现体 deployer.py:cmd_add_client(编排 8 步:repo → install → kernel → firewall → lnet → mount → fstab → lctl tune)与各 modules/*.py 为准,本块仅供阅读与手工复现,不承担幂等与错误处理。

# 1. 变更前备份(高危:后续会覆盖配置与模块代码)
TS=$(date +%Y%m%d-%H%M%S)
mkdir -p add-clients-18-20/backup/config add-clients-18-20/backup/modules
cp -a config/deploy.yaml "add-clients-18-20/backup/config/deploy.yaml.bak.$TS"
cp -a modules/kernel_strategy.py "add-clients-18-20/backup/modules/kernel_strategy.py.bak.$TS"
cp -a modules/lnet_config.py "add-clients-18-20/backup/modules/lnet_config.py.bak.$TS"

# 2. 编辑配置:nodes.clients 追加三条(不入 Git,备份是唯一回滚依据)
#    - {host: 192.168.31.18, ssh_user: root, lnet_nid: 192.168.31.18@tcp,
#       lnet_interface: auto, mount_point: /mnt/lustre}
#    .19 / .20 同构

# 3. 预检查门禁(只读,产出 reports/precheck-<时间戳>.md)
.venv/bin/python3 main.py precheck --config config/deploy.yaml

# 4. dry-run 预演
.venv/bin/python3 main.py add-client --dry-run --config config/deploy.yaml

# 5. 真实执行(无 mkfs,不需 --force)
.venv/bin/python3 main.py add-client --config config/deploy.yaml
#    预期:8 个子模块全部 success;kernel 步骤对 18/19/20 各记一条
#    [HIGH-RISK] 重启 … 以切到内核 5.14.0-611.13.1_lustre.el9,
#    并在 boot_id 变化后确认新内核

# 6. 幂等复跑(收尾要求:第二次零变更)
.venv/bin/python3 main.py add-client --config config/deploy.yaml

# 7. 巡检留证(只读)
.venv/bin/python3 main.py inspect --config config/deploy.yaml

6. 验证

# 每台执行(<IP> 取 18/19/20)
timeout 25 ssh root@<IP> 'uname -r'                     # 预期 5.14.0-611.13.1_lustre.el9.x86_64
timeout 25 ssh root@<IP> 'mount | grep lustre'          # 预期 192.168.31.21@tcp:/edafs on /mnt/lustre type lustre
timeout 25 ssh root@<IP> 'grep lustre /etc/fstab'       # 预期 … defaults,nofail 0 0
timeout 25 ssh root@<IP> 'systemctl is-enabled lnet lustre-tune'   # 预期 enabled enabled
timeout 25 ssh root@<IP> 'lctl list_nids'               # 预期 192.168.31.<IP尾>@tcp
timeout 25 ssh root@<IP> 'lctl ping 192.168.31.21@tcp'  # 预期 返回 MDS NID
timeout 25 ssh root@<IP> 'lctl get_param -n mdc.*.max_mod_rpcs_in_flight'  # 预期 31
timeout 25 ssh root@<IP> 'dd if=/dev/zero of=/mnt/lustre/.probe bs=1M count=8 oflag=direct'
timeout 25 ssh root@<IP> 'rm -f /mnt/lustre/.probe'

实际结果(2026-09-24):三台全部达标,直写 8 MB 成功(约 9.8 MB/s);add-client 复跑全模块 success、变更全跳过;inspect 报告 reports/inspect-20260924-172604.md 巡检 5 节点(服务端 2 / 客户端 4)、异常总数 0;.21 双挂载正常、.22 未重启。

7. 回滚

客户端侧变更完全可逆,服务端与 edafs 数据零改动。备份位置与台账见本主题 backup/README.md。

# 1. 摘除挂载与开机项(三台分别执行;高危:会中断该节点上的文件系统访问)
for ip in 18 19 20; do
  ssh root@192.168.31.$ip 'umount /mnt/lustre && sed -i "\#192.168.31.21@tcp:/edafs#d" /etc/fstab'
done

# 2. 恢复配置(删除三条 clients 条目)
cp -a add-clients-18-20/backup/config/deploy.yaml.bak.20260924-164251 config/deploy.yaml

# 3. 可选:彻底卸载客户端(三台分别执行)
ssh root@192.168.31.18 'systemctl disable lustre-tune lnet; dnf remove -y lustre-client kmod-lustre-client'
# .19 / .20 同

# 4. 验证回滚
.venv/bin/python3 main.py inspect --config config/deploy.yaml   # 预期客户端回到 1 台

两个 .py 备份的回滚会重新引入已知缺陷(AttributeError、lnetctl net add -108),不建议回滚,详见 backup/README.md。 内核切换的回滚无需人工介入:kernel_strategy 失败时自动把默认内核设回原值并重启回去。

8. 风险说明

风险 影响 缓解
三台各重启一次 该节点服务短暂中断 已获授权;变更前确认无在跑作业;工具以 boot_id 变化判定重启完成,超时 reboot_timeout_sec=900 即失败并回滚默认内核
缺陷 1:kernel_strategy.pre_check 调用不存在的 checker._check_scheduler dry-run 直接 AttributeError、编排终止 已修为公开方法 checker.check_scheduler(utils/precheck.py 继承共享库 PreCheckBase,方法随之公开化)
缺陷 2:lnet_config 只 modprobe lnet 未 lnetctl lnet configure LNet 栈 down,lnetctl net add 报 -108,编排在第 5 步终止(.21/.22 因运行时已有 NID 走幂等跳过,故首次部署未暴露) 已在 modprobe 后补 lnetctl lnet configure 2>/dev/null \|\| true(已 configure 时返回非 0 属预期)
已知缺陷 C(未修):客户端重启后 mdc.*.max_mod_rpcs_in_flight 可能不达标 开机时 tune 拿到的协商上限可能为默认值 单元内该行带 - 前缀不连带失败;恢复:systemctl restart lustre-tune.service;根治需按角色拆分 unit,见 tuning-fix-and-rollout-plan/SOP.md B.4
dry-run 下 lctl_tuning 对新节点报失败 误判为阻断 dry-run 未挂载 → lctl get_param 无输出 → 按三态设计保守判失败;真实执行时挂载先于 tune 完成,该失败不出现(已实证)
同一逻辑连续失败即终止 首次执行止于 lnet_config 修复后重跑成功,属第 2 次尝试;未做第 3 次重试

附录 A:执行记录

时间 动作 结果
16:42 备份 config/deploy.yaml sha256 与原件一致
16:43 clients 追加 .18/.19/.20 —
16:44 precheck 通过,9 WARN(新节点 LNet 未配的 ping 告警 + SELinux Enforcing)
16:45 add-client --dry-run 失败:缺陷 1 AttributeError
16:47 修 kernel_strategy.py 备份后改 1 行
16:49 add-client --dry-run 前 7 模块通过;lctl_tuning 因新节点未挂载报失败(预期内,见第 8 章)
16:51 add-client 真实执行(第 1 次) 内核 + 重启(18/19/20 各一次)+ repo/install/firewall 成功,止于 lnet_config:-108
17:15 修 lnet_config.py 手工 lnetctl lnet configure 验证假设成立后,备份补 1 步
17:16 add-client 真实执行(第 2 次) 全模块 success,208 s
17:20 挂载/参数/写测验证 三台全达标
17:21 add-client 幂等复跑 全 success、变更全跳过
17:26 inspect 巡检 5 节点、异常 0,报告 reports/inspect-20260924-172604.md

附录 B:交付物清单

路径 说明
add-clients-18-20/SOP.md 本档案
add-clients-18-20/backup/README.md 备份台账(3 个备份文件 + 回滚指引)
config/deploy.yaml 配置真源,clients 新增 3 条(不入 Git)
modules/kernel_strategy.py、modules/lnet_config.py 缺陷修复(入 Git,未提交)
reports/precheck-20260924-164412.md 等 6 份 各次预检查报告
reports/inspect-20260924-172604.md 收尾巡检报告(异常 0)

来源:/home/rain/Documents/lustre_ins/add-clients-18-20/SOP.md | 最后更新:2026-09-24 17:28(由 build/sync.py 同步,请勿在站点侧修改)