SOP:新增 192.168.31.18/19/20 为挂载客户端¶
C 类变更 | 执行日期 2026-09-24 | 实现入口
main.py add-client本档案与本主题backup/同目录;日常使用说明见docs/RUNBOOK.md,add-client 通用流程见docs/SOP.md5.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. 目标¶
变更完成后应同时满足:
- 三台节点运行 lustre 定制内核
5.14.0-611.13.1_lustre.el9.x86_64,kmod-lustre-client模块可加载 - 三台各有 NID
<ip>@tcp,lctl ping 192.168.31.21@tcp通 - 三台
192.168.31.21@tcp:/edafs挂载在/mnt/lustre,fstab条目带nofail,lnet与lustre-tune服务均enabled - 三台
mdc.*.max_mod_rpcs_in_flight为 31(受服务端mdt.*=32压制的合法上限) - 客户端可实际读写:8 MB 直写(
oflag=direct)成功 add-client复跑幂等:第二次零变更、全跳过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同步,请勿在站点侧修改)