跳转至

Lustre 2.17.0 LTS 在 Rocky9 上的部署变更实施手册

本 SOP 覆盖首次部署与所有增量扩展场景;第 5 章分场景给出操作序列。 实现体为 Python 工程(main.py + deployer.py + modules/*.py),以实现体为准;本文 shell 代码块仅供人阅读与手工复现,不承担幂等与错误处理。

目录

  1. 背景
  2. 目标
  3. 前置条件
  4. 影响范围
  5. 分步操作
  6. 5.1 通用准备与安装前预检查
  7. 5.2 bootstrap(首次部署)
  8. 5.3 add-oss(加 OSS 节点)
  9. 5.4 add-ost(加 OST 盘)
  10. 5.5 add-mdt(DNE 加 MDT)
  11. 5.6 add-client(加客户端)
  12. 5.7 enable-ha(启用 HA)
  13. 5.8 tune(应用调优)
  14. 5.9 inspect(健康巡检)
  15. 验证
  16. 回滚
  17. 风险说明

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,状态 UP
  • lfs 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 单元的原因:@reboot cron 的执行时机早于 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 同步,请勿在站点侧修改)