ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux 部署 GPFS 并行文件系统:内核模块编译与集群搭建实战

2026/9/17 10:10:59 拓冰建站 浏览量
Linux 部署 GPFS 并行文件系统:内核模块编译与集群搭建实战 简介这份文档面向需要在 Red Hat Linux 平台上部署 GPFS 集群的运维工程师与存储实施人员系统梳理了从前期规划到软件落地的完整流程可用于生产环境实施参考也可作为学习并行文件系统的进阶材料。内容涵盖实施规划网络设计与存储设计、Linux 基础环境准备、制作 Yum 源并安装必备 RPM 包、添加以太网卡与 InfiniBand 网卡、用户与组权限管理及 ACL 访问控制机制说明以及 GPFS 软件包安装、编译、环境变量设置与节点描述文件等配置文件准备等模块章节层次清晰便于按步骤对照执行与排错。资源包内共 1 个 docx 文档压缩后约 69KB体积轻巧却包含完整的实施目录结构含章节页码导航适合按模块检索学习。目前已有 156 人浏览学习适合需要快速掌握 GPFS 部署要点、补齐集群存储实施经验的读者参考。1. 从几台 Linux 服务器到一套 GPFS 并行文件系统中间隔着什么你手上有三到八台 Linux 服务器业务希望它们看到同一份目录树NFS 单点带宽打满、元数据操作一多就卡这时很多人会转向 GPFS现名 IBM Storage Scale。它把元数据和数据分散在多个节点上客户端并发读写不再挤一个出口。但 GPFS 不是apt install或yum install一把过的软件它需要在每台机器上编译与当前内核严格匹配的内核模块需要事先定好 manager、quorum、NSD server 这几类角色还得手工描述磁盘、建文件系统、再挂载。安装与实施文档之所以常被单独拿出来写就是因为这四道关任何一道没对齐mmstartup就是拉不起来。这套流程适合运维、存储工程师和需要在国产 Linux 或虚拟机环境里做验证的人。2. GPFS 集群拓扑与 Linux 主机准备从主机名到内核依赖动手敲第一条命令之前节点角色和 Linux 基础配置必须先落地。这一步做扎实后面mmcrcluster才不会有莫名其妙的mmfsd无法启动。2.1 先定节点角色manager、quorum、NSD server、clientGPFS 的节点不是平铺的每一类承担不同职责。规划表建议在开装前就写在实施文档里因为它直接决定后面-N后面跟哪些主机名。角色做什么数量建议是否持有数据manager管理集群配置、节点状态1 主 1 备否quorum参与集群仲裁防止脑裂奇数3 个起视配置NSD server直接挂载物理盘提供 NSD至少 2 个,做副本是client只挂载文件系统不持有磁盘按业务计算否小规模验证环境里四类角色可以重叠——两台机器既当 NSD server 又当 quorum 和 manager。生产环境我会把 quorum 单独拆成 3 台轻量节点避免存放数据的机器整机故障时集群一起失去仲裁。2.2 Linux 侧基础配置主机名、hosts、时间同步与互信GPFS 对主机名一致性极其敏感。集群建好之后改主机名需要走mmchcluster或重建节点代价很高所以要在安装前定死。# 1. 每台机器设置唯一且可解析的主机名 hostnamectl set-hostname gpfs-svr01 # 2. 所有节点 /etc/hosts 写入完全一致的记录正反解析都要通 cat /etc/hosts EOF 192.168.10.11 gpfs-svr01 192.168.10.12 gpfs-svr02 192.168.10.21 gpfs-cli01 EOF # 3. 时间必须同步否则 NSD 租约和令牌判断会出错 yum install -y chrony systemctl enable --now chronyd chronyc sources -v # 4. root 互信GPFS 默认用 ssh/scp 做远程命令下发 ssh-keygen -t rsa -b 2048 -N -f /root/.ssh/id_rsa for h in gpfs-svr01 gpfs-svr02 gpfs-cli01; do ssh-copy-id -o StrictHostKeyCheckingno root$h done逻辑说明hostnamectl改的是 systemd 视角的主机名/etc/hosts保证mmcrcluster里写短名也能解析到正确 IPchrony 是为了让各节点的时钟偏差控制在秒级以内。SSH 互信这一步容易被跳过结果是mmstartup -a只能拉起本机其他节点报Remote shell failed。参数上-N 表示空密码生产环境可以改用带密码的密钥配合 ssh-agent但 GPFS 的远程执行需要免交互最终还是得靠免密。2.3 依赖包、SELinux 与防火墙放行GPFS 的 GPL 模块编译依赖内核头文件和编译工具链缺一个就会在mmfsbuild阶段报错。# 编译内核模块的必备依赖(RHEL/CentOS 系) yum install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r) \ gcc gcc-c make cpp binutils rpm-build \ libaio libaio-devel openssl openssl-devel \ krb5-devel libcurl numactl python3 # 确认内核源码路径存在,后面 mmfsbuild 会用到 ls -d /usr/src/kernels/$(uname -r) # SELinux 建议先设为 permissive,确认跑通后再评估是否收紧 setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config # 防火墙放行 GPFS 守护进程默认端口 firewall-cmd --permanent --add-port1191/tcp firewall-cmd --permanent --add-port1191/udp firewall-cmd --reloadkernel-devel的版本必须和uname -r完全一致这是最常见的编译失败原因机器刚做过yum update升级了内核但没重启kernel-devel装的是新内核版本而运行中的还是旧内核路径对不上。放行 1191 是 GPFS 管理通信的默认端口NSD 数据传输会用动态端口内网环境里直接systemctl stop firewalld更省事但在实施文档里我倾向于写清楚端口而不是一律关服务。3. 安装 GPFS 软件包并在 Linux 上编译 GPL 内核模块这一章是整套安装里最容易卡住的地方。GPFS 的二进制包出厂时不带mmfs.ko必须用当前机器的内核现场编译。3.1 装哪几个 rpm、装到哪去从软件源拿到安装介质后先看清包名再装。核心是三个gpfs.base提供全部命令和用户态库gpfs.gpl提供内核模块源码gpfs.msg.en_US提供消息目录不装的话报错信息会变成乱码或找不到消息编号。# 按顺序安装,base 必须先装,后面两个依赖它 rpm -ivh gpfs.base-*.rpm gpfs.gpl-*.rpm gpfs.msg.en_US-*.rpm # 可选组件:图形界面和文档 # rpm -ivh gpfs.gui-*.rpm gpfs.docs-*.rpm # 验证安装结果 rpm -qa | grep gpfs ls /usr/lpp/mmfs/bin/ | head -20 # 把命令目录加进 PATH,后面操作会频繁用到 echo export PATH$PATH:/usr/lpp/mmfs/bin /root/.bashrc source /root/.bashrc逻辑说明gpfs.base会被装到/usr/lpp/mmfs/所有mm开头的命令都在/usr/lpp/mmfs/bin下。gpfs.gpl装完后源码包通常在/usr/lpp/mmfs/版本号/目录里是一个.src.rpm形式的源码包。这一步不涉及任何编译装完就能用mmhelp看命令列表但mmstartup会因为缺内核模块而失败这是预期行为。3.2 GPL 内核模块编译mmfsbuild 与手动 make 两条路新版 GPFS 提供了封装脚本mmfsbuild它内部会调用rpmbuild解包源码、编译、把生成的mmfs.ko放到正确位置并同步到其他节点。# 方式一:官方封装脚本(推荐,新版默认做法) /usr/lpp/mmfs/bin/mmfsbuild --build-gpl-binaries /usr/lpp/mmfs/*/gpfs.gpl-*.src.rpm # 编译完成后确认模块产物 find /usr/lpp/mmfs -name mmfs.ko* -o -name mmfslinux* # 方式二:老版本需要手动进源码目录编译 cd /usr/lpp/mmfs/src make Autoconfig make World 21 | tee /tmp/gpfs_build.log # 手动方式需要自己把模块拷到 /usr/lpp/mmfs/bin # make InstallImages 之后同样执行 mmfsbuild --kmod逻辑说明--build-gpl-binaries后跟源码 rpm 路径是告诉脚本源码包在哪它自己处理解包和rpmbuild的_topdir。老的 4.x 版本没有这个脚本只能make Autoconfig生成.config再make World出模块。两种方式产出的东西一样都是当前内核版本的mmfs.ko。注意编译必须在每台机器上分别做因为内核版本、CPU 架构、发行版补丁都可能不同不能把一台编译好的模块直接拷给另一台。3.3 内核升级、DKMS 与模块签名的三个坑现象原因处理方式mmfsbuild报找不到 kernel source内核头文件版本与uname -r不一致装对应版本kernel-devel或重启进新内核后再编重启后mmfsd起不来系统自动升级了内核模块没跟着重编固定内核版本或每次升级后重跑mmfsbuild报Module verification failed开启了 Secure Boot 或强制模块签名关闭 Secure Boot 或对mmfs.ko做签名第一和第三种在现场最常见。RHEL 系默认会保留最近几个内核yum update之后重启就换了内核前一天编译的模块直接作废。我的做法是在实施文档里加一条硬性约定GPFS 集群的节点禁用自动内核升级或者把mmfsbuild写进内核升级后的钩子脚本。第二条的应对可以用 DKMS 思路但很多版本并不自带 DKMS 配置手工在/etc/kernel/postinst.d/放个脚本重编更直接。模块签名如果确实是合规要求需要把集群的 MOK 私钥配置好再对模块签名不能靠modprobe --force绕过。4. 用 mmcrcluster 与 mmcrfs 建起第一个 GPFS 文件系统模块编译通过之后剩下的操作可以按顺序走建集群、授权、启动、定义 NSD、建文件系统、挂载。每一步都有能立刻验证的命令。4.1 mmcrcluster / mmchlicense / mmstartup 三连先把所有节点名写进一个文件一行一个然后建集群。-p指定主 manager-s指定备 manager-r和-R是远程 shell 命令。# 节点清单 cat /root/allnodes EOF gpfs-svr01 gpfs-svr02 gpfs-cli01 EOF # 创建集群,集群名 gpfs01 mmcrcluster -N /root/allnodes \ -p gpfs-svr01 -s gpfs-svr02 \ -r /usr/bin/ssh -R /usr/bin/scp \ -C gpfs01 # 给节点打授权类型:server 持有磁盘,client 只挂载 mmchlicense server --accept -N gpfs-svr01,gpfs-svr02 mmchlicense client --accept -N gpfs-cli01 # 启动集群所有节点 mmstartup -a # 立刻校验,每个节点应该看到 active mmgetstate -a mmlscluster逻辑说明mmcrcluster -N的参数是节点文件最好用绝对路径。mmchlicense的授权类型决定节点能不能加 NSD客户端节点加了server授权是浪费也是风险因为授权数量通常有限制。mmstartup -a是拉起所有节点上的mmfsd守护进程该进程是后续所有操作的执行体没有它mmgetstate会显示down。mmgetstate -a输出的active是判断集群是否健康的第一道关卡如果某个节点是arbitrating说明 quorum 不够或网络不通要先解决再往下走。4.2 定义 NSD把裸盘描述成 GPFS 能认的存储单元NSD 是 GPFS 对一块存储的抽象可以是整块裸盘也可以是分区或 LUN。描述文件里每行像一个字段列表servers字段决定哪些节点能直接访问这块盘。# /root/nsd.txt %nsd: device/dev/sdb nsdnsd01 serversgpfs-svr01 usagedataAndMetadata poolsystem failureGroup1 %nsd: device/dev/sdc nsdnsd02 serversgpfs-svr02 usagedataAndMetadata poolsystem failureGroup2 %nsd: device/dev/sdd nsdnsd03 serversgpfs-svr01,gpfs-svr02 usagedataAndMetadata poolsystem failureGroup3# 用描述文件创建 NSD mmcrnsd -F /root/nsd.txt -v no # 查看结果 mmlsnsd mmlsdisk fs0 2/dev/null || echo 文件系统还没建字段说明device是块设备路径必须两节点一致nsd是名字全集群唯一servers是能访问该盘的节点列表两节点共享一块盘时都写上usage控制这块盘放数据、元数据还是两者都放failureGroup表示故障域同一组内的盘会一起失效比如同一个机柜或同一台 JBOD副本调度会避开同组。-v no关闭交互确认在脚本化实施时很有用。执行完mmcrnsd磁盘状态是ready但还没有文件系统。4.3 mmcrfs 建文件系统与首次挂载文件系统创建是一步到位的操作参数选错后续调整成本高尤其是块大小和副本数。参数含义常用取值选错的代价-B数据块大小256K~16M小文件多却用 16M空间浪费严重-m/-M元数据默认/最大副本1 / 2副本不足元数据节点故障即不可用-r/-R数据默认/最大副本1 / 2同上且影响可用容量-n预计节点数略大于实际偏小会限制后续扩节点-Q是否启用配额yes / no后开需要重新扫描耗时# 先建挂载点,所有节点都要有 for h in gpfs-svr01 gpfs-svr02 gpfs-cli01; do ssh $h mkdir -p /gpfs0 done # 创建文件系统 fs0,块大小 1M,数据和元数据各 2 副本,启用配额 mmcrfs /gpfs0 fs0 -F /root/nsd.txt \ -A yes -B 1M -D nfs4 -T /gpfs0 \ -m 1 -M 2 -r 1 -R 2 -n 32 -Q yes # 在全部节点挂载 mmmount fs0 -a # 校验 mmlsfs fs0 -A mmdf fs0 df -h /gpfs0逻辑说明-A yes让文件系统随节点启动自动挂载生产环境基本都要打开。-D nfs4是文件系统的默认接口类型影响 NFS 导出行为。副本参数上-m 1 -M 2表示元数据默认 1 副本、最多允许 2 副本-r 1 -R 2同理。选 1 默认副本是空间考虑靠mmchfs -r 2可以后续提升但如果 failureGroup 划分得不对副本可能落在同一故障域等于白设。mmcrfs完成后立刻mmmount -a再mmlsfs fs0 -A逐项核对块大小和副本数是不是你要的这一步比事后mmfsck便宜太多。5. GPFS 客户端挂载、参数调优与 Linux 侧排错技巧集群跑起来只是起点真正费时间的是客户端接入和性能对不齐。这一章给的是可以直接抄的命令和判断依据。5.1 客户端节点接入与状态校验新增客户端时先建好互信、装好同样的 rpm 和内核模块再走这三步。# 1. 加入集群 mmaddnode -N gpfs-cli01 mmchlicense client --accept -N gpfs-cli01 mmstartup -N gpfs-cli01 # 2. 检查是否符合预期 mmgetstate -N gpfs-cli01 mmlsnode -N gpfs-cli01 # 3. 挂载并验证读写与副本分布 mmmount fs0 -N gpfs-cli01 mmgetstate -a mmlsdisk fs0 -L # 看每块盘的状态和可用空间客户端节点不需要gpfs.gpl编译模块吗需要。所有运行mmfsd的节点都要有与内核匹配的模块包括只读挂载的客户端。这一步经常被漏表现为mmstartup返回成功但mmgetstate显示down日志里能看到mmfs模块加载失败的记录。5.2 三个高频故障的定位命令第一类是节点状态异常。mmgetstate -a里出现down先看/var/adm/ras/mmfs.log.latest尾部再看mmfsadm dump waiters是否卡在某个锁上。第二类是 I/O 变慢。用mmdiag --iohist看历史 I/O 延迟分布配合mmfsadm dump config | grep -i thread检查线程数是否被压到默认下限必要时mmchconfig worker1ThreadsN -N all再加mmshutdown -a mmstartup -a生效。第三类是空间与副本对不上。mmdf fs0和df -h数值不同是正常的前者是 NSD 原始容量后者扣掉了副本和元数据开销看容量以mmdf为准。调优上最值得动的是 pagepool。默认值偏保守在内存 128G 以上的 NSD server 上按内存的 25% 到 50% 设置用mmchconfig pagepool32G -N gpfs-svr01,gpfs-svr02改然后mmshutdown再mmstartup才生效。改完用mmfsadm dump config | grep pagepool确认再用一段真实的读写负载复测别只信配置值。本文还有配套的精品资源点击获取