Lustre 2.17.0 LTS 在 Rocky9 上的部署变更实施手册¶
本 SOP 覆盖首次部署与所有增量扩展场景;第 5 章分场景给出操作序列。 实现体为 Python 工程(
main.py+deployer.py+modules/*.py),以实现体为准;本文 shell 代码块仅供人阅读与手工复现,不承担幂等与错误处理。
目录¶
- 背景
- 目标
- 前置条件
- 影响范围
- 分步操作
- 5.1 通用准备与安装前预检查
- 5.2 bootstrap(首次部署)
- 5.3 add-oss(加 OSS 节点)
- 5.4 add-ost(加 OST 盘)
- 5.5 add-mdt(DNE 加 MDT)
- 5.6 add-client(加客户端)
- 5.7 enable-ha(启用 HA)
- 5.8 tune(应用调优)
- 5.9 inspect(健康巡检)
- 验证
- 回滚
- 风险说明
1. 背景¶
EDA 仿真业务需要并行文件系统承载大规模小文件读写、仿真波形大文件与 MPI-IO 共享文件,配合 HPC 调度器(Slurm/LSF)使用。本变更在 Rocky Linux 9 上构建 Lustre 2.17.0 LTS(ldiskfs 后端,TCP/LNet 网络),并通过子命令化 Python 工程支持随时增量扩展(加 OSS/OST/MDT/Client/HA),不销毁重建。
2. 目标¶
变更完成后应达到以下可验证状态:
- MGS+MDT 节点
192.168.31.21上 MGT+MDT0000 在线 - OSS 节点
192.168.31.22上 OST0000 在线 - 客户端节点(由
deploy.yaml的clients列表驱动)挂载/mnt/lustre可读写 lctl dl列出全部 target,状态UPlfs df -h显示 MDT + OST 容量- EDA striping 模板目录创建并设置正确(4 类模板)
- lctl 调优参数生效(
max_rpcs_in_flight=32等) inspect子命令产出巡检报告,无 HIGH 级别异常
3. 前置条件¶
| 项 | 要求 | 检查命令 |
|---|---|---|
| 操作机 | 已安装 Python 3.9+ 与工程 .venv |
cd /home/rain/Documents/lustre_ins && .venv/bin/python --version |
| 共享库 | /home/rain/py_public_modules 存在,.venv 的 .pth 已挂载 |
.venv/bin/python -c "import base_module" |
| SSH 免密 | 操作机可 ssh root@192.168.31.21 与 ssh root@192.168.31.22 免密 |
ssh root@192.168.31.21 hostname |
| 节点 OS | Rocky Linux 9(x86_64) | ssh root@192.168.31.21 'cat /etc/redhat-release' |
| 节点联网 | 可访问 downloads.whamcloud.com(在线安装) |
ssh root@192.168.31.21 'curl -sI https://downloads.whamcloud.com/ | head -1' |
| 磁盘可用 | MDT 设备 /dev/vdb(SSD 建议)、OST 设备 /dev/vdb 整盘未分区 |
ssh root@192.168.31.21 'lsblk -ndo TYPE,PKNAME,NAME /dev/vdb' |
| 时间同步 | 所有节点 chronyd 或 ntpd 运行,时间一致 | ssh root@192.168.31.21 'chronyc tracking | grep System clock' |
| Slurm/LSF 作业 | 目标节点无在跑作业(变更窗口内) | sinfo -n <node> 或 bhosts | grep <node> |
| 配置文件 | 已从 config/deploy.yaml.example 复制为 config/deploy.yaml 并按实际填写 |
cat config/deploy.yaml |
上表各项均可由
precheck子命令自动核查(只读,见 5.1);手工执行仅用于 precheck 无法覆盖的现场确认(如变更窗口、业务侧确认)。precheck 另含以下环境门禁:执行身份必须为 root(否则 BLOCK)、SELinux 建议 permissive/disabled(Enforcing 记 WARN)、系统盘可用空间下限
precheck.min_disk_free_gb(默认 10G,低于即 BLOCK)、运行内核版本记录(INFO),以及 LNet 已配置时的 NID 可达性校验(lctl ping不通记 WARN)。各阈值与跳过列表见config/deploy.yaml的precheck段。凭据:节点已配置 root 免密 SSH 密钥认证,无需密码;密钥位置
~/.ssh/id_rsa(由 paramiko 自动收集)。
4. 影响范围¶
| 维度 | 说明 |
|---|---|
| 主机 | MGS+MDT 192.168.31.21、OSS 192.168.31.22、客户端(由配置驱动) |
| 组件 | yum 仓库、RPM 包(kmod-lustre / lustre / e2fsprogs)、LNet、firewalld、Lustre target、fstab、modprobe、systemd 单元 |
| 是否停服 | 首次 bootstrap:需要停服窗口(mkfs + mount 期间文件系统不可用);增量扩展(add-oss/add-ost/add-mdt/add-client):不停服,已有 target 不受影响;enable-ha:需短暂停服(target 切换到 Pacemaker 管理) |
| 窗口期 | bootstrap 约 30–60 分钟(取决于磁盘大小与网络);增量扩展 5–15 分钟 |
| 在跑作业 | Slurm/LSF 上有作业时不得动该节点;变更前需 drain 或迁作业 |
| 数据影响 | mkfs.lustre 会清空目标盘;已有 target 在增量扩展时不受影响 |
5. 分步操作¶
所有命令在工程根
/home/rain/Documents/lustre_ins下执行;实现体为 Python 工程,以下 shell 代码块与实现等价但不承担幂等与错误处理,以实现体为准。 各变更子命令执行前均会自动运行 5.1 的预检查(真实执行时 BLOCK 即终止),故不再逐场景重复列出。
5.1 通用准备与安装前预检查¶
cd /home/rain/Documents/lustre_ins
cp config/deploy.yaml.example config/deploy.yaml # 首次部署:复制样例
vi config/deploy.yaml # 按实际填写节点 IP、盘符、网卡、客户端
.venv/bin/python -m py_compile main.py deployer.py # 语法自检
.venv/bin/python main.py --help # 查看子命令列表
# 安装前预检查(只读,不改变系统状态,产出 reports/precheck-<时间戳>.md)
.venv/bin/python main.py precheck --config config/deploy.yaml
# 退出码 0:无 BLOCK 项,可继续;非 0:存在阻断项,须按报告处置后再执行变更
预期输出(--help):
usage: lustre_deploy [-h] {bootstrap,add-oss,add-ost,add-mdt,add-client,enable-ha,tune,inspect,precheck,repo,rollback} ...
预检查覆盖:操作机环境(Python/venv/共享库可导入)、各节点 SSH 可达、OS 版本与架构、 时钟偏移、执行身份(root)、SELinux 状态、系统盘可用空间、运行内核版本、 防火墙运行状态、仓库可达性、LNet 网卡存在性、LNet NID 可达性(
lctl ping)、 Slurm/LSF 作业占用、target 设备 (整盘 / 未挂载 / 非 swap / 非系统盘);同时做配置合法性校验(fsname、target index 唯一性、 backend 支持范围、未实现字段提示等)。 变更类子命令(bootstrap / add-oss / add-ost / add-mdt / add-client / enable-ha / tune / repo) 执行前会自动运行同一套检查:真实执行时存在 BLOCK 即终止,--dry-run下降级为告警。
单独执行 repo(可选):repo 写各节点的
/etc/yum.repos.d/{lustre,e2fsprogs}.repo,属变更子命令,单独执行时同样先过门禁;
内容经 SHA256 比对,一致即跳过;覆盖前在远端带时间戳备份。
# 预演:只打印将写入的仓库文件,不改动系统
.venv/bin/python main.py repo --dry-run --config config/deploy.yaml
# 真实执行(幂等:内容一致则全跳过)
.venv/bin/python main.py repo --config config/deploy.yaml
5.2 bootstrap(首次部署)¶
实现文件:deployer.py:cmd_bootstrap → repo_setup.py → package_install.py → firewall.py → lnet_config.py → target_format.py → mount_targets.py → fstab_persist.py → client_mount.py → stripe_tuning.py → lctl_tuning.py
编排顺序:repo → install → firewall → lnet → format Mgt/Mdt → mount → fstab → client mount → stripe → lctl tune
# 步骤 1:dry-run 预演(零系统改动,输出全部变更明细)
.venv/bin/python main.py bootstrap --dry-run --config config/deploy.yaml
# 步骤 2:真实部署(首次需 --force 才执行 mkfs.lustre)
.venv/bin/python main.py bootstrap --config config/deploy.yaml --force
# 等价的 shell 操作序列(以实现体为准,此处供人阅读):
# --- 在 MGS+MDT 节点 192.168.31.21 ---
ssh root@192.168.31.21 'cat > /etc/yum.repos.d/lustre.repo <<EOF
[lustre-server]
baseurl=https://downloads.whamcloud.com/public/lustre/lustre-2.17.0/el9.7/server/
gpgcheck=0
EOF'
ssh root@192.168.31.21 'cat > /etc/yum.repos.d/e2fsprogs.repo <<EOF
[e2fsprogs]
baseurl=https://downloads.whamcloud.com/public/e2fsprogs/latest/el9/
gpgcheck=0
EOF'
ssh root@192.168.31.21 'dnf install -y kmod-lustre kmod-lustre-osd-ldiskfs lustre-osd-ldiskfs-mount lustre lustre-resource-agents e2fsprogs'
ssh root@192.168.31.21 'firewall-cmd --permanent --add-port=988/tcp && firewall-cmd --reload'
ssh root@192.168.31.21 'lnetctl lnet configure 2>/dev/null; lnetctl net add --net tcp --if <网卡名>'
# 高危:mkfs.lustre 不可逆,会清空 /dev/vdb;建议先 dd 镜像备份
ssh root@192.168.31.21 'dd if=/dev/vdb of=/root/vdb.img.bak bs=4M status=none' # 可选备份
ssh root@192.168.31.21 'mkfs.lustre --fsname=edafs --mgs --mdt --index=0 /dev/vdb'
ssh root@192.168.31.21 'mkdir -p /mnt/mdt0 && mount -t lustre /dev/vdb /mnt/mdt0'
# --- 在 OSS 节点 192.168.31.22 ---
ssh root@192.168.31.22 '<同上 repo + install + firewall + lnet>'
ssh root@192.168.31.22 'mkfs.lustre --fsname=edafs --mgsnode=192.168.31.21@tcp --ost --index=0 /dev/vdb'
ssh root@192.168.31.22 'mkdir -p /mnt/ost0 && mount -t lustre /dev/vdb /mnt/ost0'
# --- 客户端节点(由 deploy.yaml clients 列表驱动)---
ssh root@<client> 'dnf install -y kmod-lustre-client lustre-client'
ssh root@<client> 'lnetctl lnet configure; lnetctl net add --net tcp --if <网卡名>'
ssh root@<client> 'mkdir -p /mnt/lustre && mount -t lustre 192.168.31.21@tcp:/edafs /mnt/lustre'
# --- fstab 持久化(所有 lustre 挂载加 nofail,防开机失败)---
# 服务端:/dev/vdb /mnt/mdt0 lustre defaults,noexec,nofail 0 0
# 客户端:192.168.31.21@tcp:/edafs /mnt/lustre lustre defaults,noexec,nofail 0 0
# --- EDA striping 模板(4 类) ---
ssh root@<client> 'lfs setstripe /mnt/lustre/eda_small_files -S 1M -c 1'
ssh root@<client> 'lfs setstripe /mnt/lustre/eda_large_files -S 16M -c 1'
ssh root@<client> 'lfs setstripe /mnt/lustre/eda_shared_files -S 4M -c -1'
ssh root@<client> 'lfs setstripe /mnt/lustre/eda_scratch -S 1M -c 1'
# --- lctl 调优(客户端,通过 modprobe + systemd oneshot 单元持久化)---
ssh root@<client> 'lctl set_param ldlm.namespaces.*.lru_size=100*<CPU核数>'
ssh root@<client> 'lctl set_param osc.*.max_rpcs_in_flight=32'
ssh root@<client> 'lctl set_param llite.*.statahead_max=512'
5.3 add-oss(加 OSS 节点)¶
实现文件:deployer.py:cmd_add_oss(编排:repo → install → firewall → lnet → format → mount → fstab)
场景:在 deploy.yaml 的 nodes.oss 列表追加新节点后执行;已有 OSS 不受影响。
# 1. 编辑配置,追加新 OSS 节点
vi config/deploy.yaml
# oss:
# - host: 192.168.31.22 # 已有
# - host: 192.168.31.23 # 新增
# ssh_user: root
# lnet_nid: 192.168.31.23@tcp
# lnet_interface: auto
# targets:
# # 示例盘符请按实际环境填写,本环境实际使用 /dev/vdb
# - {device: /dev/sdb, type: ost, index: 1}
# 2. dry-run 预演
.venv/bin/python main.py add-oss --dry-run --config config/deploy.yaml
# 3. 执行(需 --force 才 mkfs 新盘)
.venv/bin/python main.py add-oss --config config/deploy.yaml --force
5.4 add-ost(加 OST 盘)¶
实现文件:deployer.py:cmd_add_ost(编排:format → mount → fstab)
场景:在已有 OSS 节点的 targets 列表追加新盘后执行;已有 OST 不重新 format。
# 1. 编辑配置,在已有 OSS 的 targets 追加新盘
vi config/deploy.yaml
# oss:
# - host: 192.168.31.22
# targets:
# - {device: /dev/sdb, type: ost, index: 0} # 已有
# - {device: /dev/sdc, type: ost, index: 1} # 新增
# 2. dry-run 预演
.venv/bin/python main.py add-ost --dry-run --config config/deploy.yaml
# 3. 执行
.venv/bin/python main.py add-ost --config config/deploy.yaml --force
5.5 add-mdt(DNE 加 MDT)¶
实现文件:deployer.py:cmd_add_mdt(编排:format → mount → fstab → lctl set_param mds.*.enable_dne=1)
末步「启用 DNE」属远端变更,经统一变更入口执行:
--dry-run下只打印计划、 不真正下发lctl set_param;真实执行时校验返回码,失败即计入本次失败。
场景:在 MGS+MDT 节点的 targets 列表追加新 MDT(type=mdt, index=1)后执行;已有 MDT0000 不受影响。
# 1. 编辑配置
vi config/deploy.yaml
# mgs_mds:
# - host: 192.168.31.21
# targets:
# - {device: /dev/sdb, type: mgt_mdt, index: 0} # 已有 combined
# - {device: /dev/sdc, type: mdt, index: 1} # 新增 DNE MDT
# 2. dry-run 预演
.venv/bin/python main.py add-mdt --dry-run --config config/deploy.yaml
# 3. 执行
.venv/bin/python main.py add-mdt --config config/deploy.yaml --force
5.6 add-client(加客户端)¶
实现文件:deployer.py:cmd_add_client(编排:repo → install → firewall → lnet → client mount → fstab → lctl tune)
场景:在 deploy.yaml 的 clients 列表追加新客户端后执行。
# 1. 编辑配置
vi config/deploy.yaml
# clients:
# - host: 192.168.31.30
# ssh_user: root
# mount_point: /mnt/lustre
# 2. dry-run 预演
.venv/bin/python main.py add-client --dry-run --config config/deploy.yaml
# 3. 执行(客户端无需 --force,不涉及 mkfs)
.venv/bin/python main.py add-client --config config/deploy.yaml
5.7 enable-ha(启用 HA)¶
实现文件:deployer.py:cmd_enable_ha → modules/ha_pacemaker.py(stub:仅安装 pacemaker/corosync 并初始化集群,cib XML 留人工配置)
场景:在 deploy.yaml 的 ha 段填入主备节点对与 VIP 后执行;需短暂停服窗口。
# 1. 编辑配置
vi config/deploy.yaml
# ha:
# enabled: true
# mds_pair:
# - {primary: 192.168.31.21, secondary: 192.168.31.24, vip: 192.168.31.100}
# 2. dry-run 预演
.venv/bin/python main.py enable-ha --dry-run --config config/deploy.yaml
# 3. 执行(安装包 + 初始化集群)
.venv/bin/python main.py enable-ha --config config/deploy.yaml
# 4. 人工配置 cib(stub 不自动生成 cib XML)
# pcs resource create mdt0 ocf:lustre:Lustre ...
# pcs constraint order ...
注意:HA 是 stub 实现,仅完成包安装与集群初始化;target 切换到 Pacemaker 管理的 cib 配置需人工执行,详见 RUNBOOK.md 的 HA 章节。
5.8 tune(应用调优)¶
实现文件:deployer.py:cmd_tune → stripe_tuning.py + lctl_tuning.py
场景:单独应用或更新 striping 模板与 lctl 调优参数(不涉及安装/格式化/挂载)。
# 1. 编辑 deploy.yaml 的 optimization 段
vi config/deploy.yaml
# 2. dry-run 预演
.venv/bin/python main.py tune --dry-run --config config/deploy.yaml
# 3. 执行(客户端 + 服务端均应用)
.venv/bin/python main.py tune --config config/deploy.yaml
lctl 调优通过以下方式持久化(实现体自动完成):
- /etc/modprobe.d/lustre.conf:写入 options <module> <key>=<value>
- /etc/systemd/system/lustre-tune.service(单元名 lustre-tune.service):Type=oneshot + RemainAfterExit=yes 的 oneshot 单元,After=remote-fs.target;每条参数一行 ExecStart=/usr/sbin/lctl set_param <param>=<value>(lctl 实际位于 /usr/sbin/lctl);客户端单元另加 RequiresMountsFor=<客户端挂载点>,保证在 lustre 挂载完成后执行
改用 systemd 单元的原因:
@rebootcron 的执行时机早于 lustre 挂载,且挂载动作会把 osc/llite 级参数重置为默认值;oneshot 单元在挂载完成后执行才能让参数留存。
调优参数清单(config/deploy.yaml 的 optimization 段):
| 适用范围 | 参数 | 值 |
|---|---|---|
客户端 client_tuning(8 项) |
ldlm.namespaces.*.lru_max_age |
600000 |
客户端 client_tuning |
ldlm.namespaces.*.lru_size |
auto(100 × CPU 核数) |
客户端 client_tuning |
osc.*.max_rpcs_in_flight |
32 |
客户端 client_tuning |
mdc.*.max_rpcs_in_flight |
64 |
客户端 client_tuning |
mdc.*.max_mod_rpcs_in_flight |
31 |
客户端 client_tuning |
llite.*.statahead_max |
512 |
客户端 client_tuning |
llite.*.statahead_agl |
1 |
| 客户端(不纳入期望态) | osc.*.max_dirty_mb |
实测运行期会被 Lustre 按内存/压力重算(设 64 后回到 128),属自适应参数,硬设无效且会造成巡检误报 |
服务端通用 server_tuning(MGS/MDS/OSS) |
timeout / ldlm_timeout / at_min / at_max |
600 / 200 / 250 / 600 |
MDS 专属 mds_tuning(仅 mgs_mds 角色) |
mdt.*.max_mod_rpcs_in_flight |
32 |
mdc.*.max_mod_rpcs_in_flight的上限由 MDT 在客户端连接时返回的值决定,客户端值必须小于服务端mdt.*.max_mod_rpcs_in_flight;超出时内核返回ERANGE(34),设置失败并留下日志Numerical result out of range。服务端调高该值后,已连接的客户端须重新挂载才会放宽上限。配置校验已加入该约束:客户端值 ≥ 服务端值时判 BLOCK。llite.*.statahead_xattr在 Lustre 2.17 已不存在,不再下发。
5.9 inspect(健康巡检)¶
实现文件:deployer.py:cmd_inspect → modules/inspector.py(B 类只读,11 项巡检,产出 reports/inspect-<YYYYmmdd-HHMMSS>.md)
场景:安装完成后或日常巡检,只读取证不改变状态。
# 执行巡检
.venv/bin/python main.py inspect --config config/deploy.yaml
# 预期:在 reports/ 下生成巡检报告
ls -lt reports/inspect-*.md | head -1
cat reports/inspect-<最新时间戳>.md
巡检 11 项(详见 RUNBOOK.md 巡检章节): 1. SSH 连通性 + 时间同步 2. LNet 状态与 NID 一致性 3. target 在线状态(与 yaml 比对找漂移) 4. MDT/OST 容量与使用率(>80% 告警 / >90% 严重) 5. 客户端挂载状态 6. lctl 调优参数符合预期 7. striping 模板设置正确 8. 防火墙 988/tcp 放行 9. fstab 持久化与 nofail 选项 10. 系统资源水位(CPU/内存) 11. RPM 包完整性(按角色)
6. 验证¶
# 0. 预检查复检(只读;变更前后均可跑,预期无 BLOCK 项)
.venv/bin/python main.py precheck --config config/deploy.yaml
# 1. target 在线状态
ssh root@192.168.31.21 'lctl dl' # 预期:MGS UP, MDT0000 UP
ssh root@192.168.31.22 'lctl dl' # 预期:OST0000 UP
# 2. 容量
ssh root@192.168.31.21 'lfs df -h' # 预期:列出 MDT + OST 容量
# 3. 客户端读写
ssh root@<client> 'dd if=/dev/zero of=/mnt/lustre/eda_scratch/test bs=1M count=100' # 预期:100MB 写入成功
ssh root@<client> 'lfs getstripe /mnt/lustre/eda_small_files' # 预期:stripe_count=1
# 4. lctl 调优参数
ssh root@<client> 'lctl get_param osc.*.max_rpcs_in_flight' # 预期:32
# 5. 幂等测试(连续执行第二次,零变更、全跳过)
.venv/bin/python main.py bootstrap --config config/deploy.yaml --force
# 预期日志:所有 target "已格式化,跳过";所有包 "已安装,跳过"
# 6. 巡检报告无 HIGH 级别异常
.venv/bin/python main.py inspect --config config/deploy.yaml
grep -c 'HIGH' reports/inspect-*.md | tail -1 # 预期:0
# 7. 重启后调优参数仍达标(systemd oneshot 单元持久化)
ssh root@<client> 'systemctl is-enabled lustre-tune.service' # 预期:enabled
ssh root@<client> 'systemctl is-active lustre-tune.service' # 预期:active
ssh root@<client> 'lctl get_param mdc.*.max_mod_rpcs_in_flight'
# 预期:mdc.*.max_mod_rpcs_in_flight=31(上限由服务端 mdt.*.max_mod_rpcs_in_flight=32 决定)
7. 回滚¶
可恢复的配置文件(基于时间戳备份)¶
实现体 deployer.py:cmd_rollback 扫描以下 7 类远程配置文件在远程备份目录 /var/backups/lustre-ins/ 下的 .bak.* 备份,取最新恢复(备份不再与被改文件同目录):
| 远程路径 | 备份位置 |
|---|---|
/etc/yum.repos.d/lustre.repo |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/yum.repos.d/e2fsprogs.repo |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/lnet.conf |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/modules-load.d/lnet.conf |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/fstab |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/modprobe.d/lustre.conf |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
/etc/systemd/system/lustre-tune.service |
/var/backups/lustre-ins/<原路径>.bak.<时间戳> |
# 1. 查看可恢复项(不执行)
.venv/bin/python main.py rollback --config config/deploy.yaml
# 2. 真实恢复(需 --force)
.venv/bin/python main.py rollback --config config/deploy.yaml --force
# 等价的手工恢复命令:
# ssh root@<host> 'cp -f /var/backups/lustre-ins/etc/yum.repos.d/lustre.repo.bak.<时间戳> /etc/yum.repos.d/lustre.repo'
备份台账见 backup/README.md,逐条登记备份文件、原路径、产生时间、回滚什么、何时可删。
不可逆操作(mkfs.lustre)¶
mkfs.lustre 会清空目标盘,无法通过配置回滚恢复。回滚方式:
- MDT 设备:若部署前执行了
dd if=/dev/vdb of=/root/vdb.img.bak,可dd if=/root/vdb.img.bak of=/dev/vdb恢复原始镜像;否则数据不可恢复。 - OST 设备:OST 数据可重建(重新 mkfs + 重新写入),但已有数据丢失。
强烈建议:mkfs 前对 MDT 设备执行 dd 镜像备份(MDT 含元数据,丢失不可逆)。
8. 风险说明¶
| 风险 | 等级 | 缓解措施 |
|---|---|---|
| mkfs.lustre 清空目标盘 | 高 | dry-run 默认;需显式 --force;设备校验(整盘 + 未挂载 + 非 swap + 非系统盘),系统盘由 lsblk 挂载树推导(不再使用块名白名单);[HIGH-RISK] 日志标记;建议 dd 镜像备份 MDT |
| 误格式化系统盘 | 高 | 系统盘判定基于挂载树(含 /、/boot、/boot/efi、[SWAP] 等所在盘的祖先盘),与盘序/机型无关;推导失败时按"拒绝格式化"处理;必要时用 disk_safety.system_disks 人工覆盖 |
| 预检查未过仍继续变更 | 高 | 变更类子命令执行前自动跑配置校验与安装前预检查;真实执行下存在 BLOCK 即终止,--dry-run 下降级为告警并在报告中标明;每次预检查留痕到 reports/precheck-*.md |
| 挂载顺序错误 | 中 | 首次启动 MGT→MDT→OST→client;实现体按此顺序编排;增量扩展时新 target 单独挂载不影响已有 |
| LNet 网卡名错误 | 中 | lnet_interface: auto 用 ip route get <对端 IP> 自动探测;可写死网卡名 |
| lctl 参数重启失效 | 中 | 写入 /etc/modprobe.d/lustre.conf + /etc/systemd/system/lustre-tune.service(systemd oneshot 单元,After=remote-fs.target;客户端单元加 RequiresMountsFor=<挂载点> 以晚于 lustre 挂载执行)持久化 |
| 客户端 max_mod_rpcs_in_flight 受限 | 中 | 客户端 mdc.*.max_mod_rpcs_in_flight 的上限由 MDT 在客户端连接时返回的值决定,必须小于服务端 mdt.*.max_mod_rpcs_in_flight;超出时内核返回 ERANGE(34),设置失败。调整须服务端先行,且客户端重新挂载后上限才放宽;配置校验对「客户端值 ≥ 服务端值」判 BLOCK |
| fstab 错误致开机失败 | 中 | 所有 lustre 挂载条目加 nofail 选项;巡检第 9 项检查 |
| 增量扩展配置漂移 | 中 | 实现体先 lctl dl 列出当前在线 target,与 yaml 比对,只对"yaml 有而系统无"的 target 执行 format+mount |
| HA 启用需停服 | 中 | enable-ha 需短暂停服窗口;SOP 第 4 章写明;cib 配置人工执行 |
| whamcloud 仓库不可达 | 低 | 在线安装依赖 downloads.whamcloud.com 可达;前置条件检查网络 |
| 连续失败 | 低 | 实现体连续失败 2 次终止,不重试不换参 |
来源:
/home/rain/Documents/lustre_ins/docs/SOP.md| 最后更新:2026-09-24 12:47(由build/sync.py同步,请勿在站点侧修改)