MIC卡OFED安装全指南:从MPSS协同到验证排障

发布时间:2026/10/6 19:28:05
MIC卡OFED安装全指南:从MPSS协同到验证排障 1. 为什么要给MIC卡单独装一套OFED它在整个体系里的位置我第一次接触Xeon Phi MIC卡是在2016年前后当时一台双路E5的节点里插了一片3120A领导说“把驱动装上跑个MPI测试”。我天真地以为这跟装显卡驱动差不多下载个rpm、双击、重启完事。结果那一个星期基本都在OFED上打转不是编译报错就是模块加载失败。后来才彻底明白MIC卡的驱动从来不是“一个驱动”而是MPSS和OFED两套软件栈相互咬合才能跑起来的东西。先说清楚MIC卡是什么。MICMany Integrated Core卡本质上是插在PCIe槽位上的一张协处理器卡卡上有自己的x86 CPU核心最多61个、自己的GDDR5显存卡内还跑着一个独立的裁剪版Linux系统。也就是说主机这边插了一张卡相当于在机箱里又挂了一台“小电脑”主机和小电脑之间通过PCIe总线通信。MPSSIntel Manycore Platform Software Stack负责把这台“小电脑”拉起来、管理它的生命周期而OFED负责的是更上层的高速数据通路。OFED全称是OpenFabrics Enterprise Distribution是OpenFabrics联盟维护的一套开源驱动和工具集合统一了InfiniBand、iWARP、RoCE这类RDMA技术的驱动栈。在HPC集群里OFED的江湖地位相当于“高性能网络世界的通用语”。为什么MIC卡体系里非要单独装它原因有两个层面。第一集群里其他节点普遍挂着InfiniBand或万兆网卡这些节点的应用走的是OFED的verbs接口。MIC卡上的计算任务如果要与集群里的其他节点通信也必须遵循同一套接口。卡上的内核和库如果不带OFED应用跑到一半就会卡在“找不到ibv_open_device”这类错误上。第二OFED提供的RDMA语义比MPSS自带的SCIF更通用更适合做内存到内存的远程读写。SCIF是Intel为MIC设计的PCIe直接通信接口性能很好但它只在MIC生态里用别的节点不认。OFED则是行业标准Intel MPI、MVAPICH这类并行库默认就会去探测OFED探测到了就走RDMA路径探测不到就退回TCP性能差一大截。所以在MIC卡的软件栈里MPSS和OFED缺一不可。MPSS负责把卡“点亮”OFED负责让卡上的数据“跑得出去、跑得快”。这篇文章后面所有的步骤都是围绕这两套栈的协同安装展开的。2. 动手前的环境核对版本匹配是安装成败的第一道坎我见过太多人在OFED上翻车根因根本不是命令敲错而是安装前没有核对环境。OFED的安装脚本虽然号称自动化但它对内核版本、工具链版本、发行版版本极其敏感任何一环对不上后面就是无休止的编译错误。2.1 发行版、内核版本、工具链三件套如果主机用的是RHEL或CentOS 7.x这算是MIC卡最主流的运行环境。建议在装任何东西之前先把这几个信息记录下来uname -r cat /etc/redhat-release gcc --version which make perl rpmbuild内核版本要重点关注OFED编译内核模块时必须有与之精确对应的kernal-devel包。很多人习惯执行yum install kernel-devel装出来的却是当前yum源里最新内核的devel包跟实际运行的内核版本对不上编出来的模块根本加载不进去。正确的核对方法是这样rpm -q kernel-devel ls -ld /lib/modules/$(uname -r)/build/lib/modules/$(uname -r)/build这个链接如果指向一个存在的目录说明内核头文件是齐的否则OFED编译到一半必然报“Kernel headers not found”。还有一点容易忽略gcc版本不能太新也不能太旧。RHEL 7自带的gcc 4.8.5编OFED没问题但如果系统里有人装了devtoolset的高版本gcc且把PATH改了编译时可能出现结构体对齐、内联函数处理等一堆奇怪警告和错误。2.2 MPSS版本与OFED版本的对应关系MIC卡的时代MPSS和OFED的版本是强绑定的。Intel在发布某一版MPSS时会同时发布配套的Intel OFED两者必须来自同一代。我列出我当时实测过的组合MPSS版本配套Intel OFED建议OS环境3.6Intel OFED 3.12RHEL 6.7 / 7.23.7.2Intel OFED 4.0RHEL 7.2 / CentOS 7.33.8.4Intel OFED 4.2RHEL 7.4 / CentOS 7.6表格里前两行是早期环境第三行3.8.4算是MIC卡的最终版本。我的建议是直接选最终版原因很实际Intel在3.8.4里修复了大量之前版本里MIC卡在OFED配置上的bug而且配套文档最全。需要注意MPSS和OFED可以是同一个ISO里打包的不同目录也可以分开下载。别自作聪明去装Mellanox的OFED它针对的是Mellanox自家的网卡对MIC卡的虚拟IB设备没有适配装上之后大概率只能看到物理网卡看不到MIC相关的设备。2.3 固件状态与BIOS设置的预备检查在卡还没被MPSS接管前怎么确认固件状态两种方式一是看POST阶段主机的日志二是用lspci确认卡已经被识别为协处理器设备lspci | grep -i co-processor正常情况下输出是一行类似01:00.0 Co-processor: Intel Corporation Xeon Phi coprocessor (x100)的信息。如果这里就看不到卡别急着装OFED先查PCIe插槽、供电线缆和BIOS设置。BIOS里有两个设置对MIC卡很重要Above 4G Decoding要开启VT-d如果要用IOMMU场景也要打开。我遇到过一次卡在lspci里反复消失的情况最后发现是PCIe Slot的电管理策略在作怪进BIOS把PCIe link speed固定成Gen2才好。还有一个很容易被忽略的点确认系统时间和日志文件正常。MIC卡在启动时会校验镜像的时间戳如果主机的系统时间偏差太大卡内系统起来后可能出现证书类、密钥类的同步错误。3. 主机侧OFED的编译安装全过程主机侧安装是整个流程里最重的一步。这里说的“重”不是步骤多而是编译耗时、依赖复杂、日志冗长。整个过程走下来体感上更像是在编译一个迷你Linux发行版而不是在装一个普通驱动。3.1 解包与准备拿到Intel OFED的tar包之后惯例是先解压然后花两分钟读一下根目录下的README和Release Notestar zxf Intel_OFED_Linux-4.2.tar.gz cd Intel_OFED_Linux-4.2 cat README解压后的目录结构大致是这样install.sh、install.pl、rpms/、SRPMS/、docs/。其中docs/里有很详细的安装手册遇到问题先翻它比百度好用得多。在运行安装脚本前建议先装好常见依赖避免脚本中途因为缺perl模块或rpmbuild工具退出。不同的Linux发行版依赖名略有差异CentOS上我会执行yum install -y perl gcc make kernel-devel rpm-build还有一点确认/tmp和/var/tmp有足够的剩余空间。OFED编译内核模块时临时文件量很大我见过一回因为/tmp只剩几百MB导致编译莫名终止的案例单看日志完全想不到是这个原因。3.2 运行安装脚本它会做什么执行安装的核心命令./install.sh也可以加参数指定内核版本和跳过某些组件./install.sh --kernel-version$(uname -r)install.sh本质上是一个封装脚本它会调用install.pl来完成以下几个动作检查依赖、解压并编译内核模块、安装用户态库、生成模块依赖、注册系统服务。编译内核模块是最耗时的一步。OFED包里的内核源码模块会逐个编译包括ib_core、ib_uverbs、rdma_cm、ib_ipoib、iw_cxgb4等。我在一台8核的E5机器上编译整个过程大约15到20分钟。如果这一步报错把最后的错误信息拍下来多半跟第2章提到的内核头文件或gcc版本有关少部分是源码本身对某些特定内核版本的兼容性问题。3.3 安装完后的系统服务与模块加载安装脚本跑完之后并不代表OFED已经生效了还要做两件事加载内核模块、启动相关服务。modprobe ib_core modprobe ib_uverbs modprobe rdma_cm modprobe ib_ipoib或者干脆依赖脚本自动配置的modprobe规则然后直接启动服务systemctl enable openibd systemctl start openibdopenibd是OFED自带的管理服务负责在开机时按顺序加载所有RDMA相关模块。如果机器上以后还要挂子网管理器可以一并把opensmd服务打开systemctl enable opensmd systemctl start opensmd不过要注意opensmd一台IB子网里最多只能有一个主管理器别每台节点都开。我习惯只在管理节点或者存储节点上开计算节点上只跑openibd。加载完模块后用lsmod | grep ib_检查一下正常情况下能看到一串带ib_前缀的模块。到这里主机侧的OFED基础栈就算装上了但离MIC卡真正能用还差一步——目标侧卡内系统的OFED配置。4. MIC卡内部的OFED目标侧环境的同步与配置MIC卡的target OS是Intel用Yocto裁剪出来的一个迷你Linux里面工具链很少很多在主机上习以为常的命令在卡里根本没有。所以卡内OFED的配置逻辑不是“登录进去跑安装脚本”而是“把现成的库和配置塞进卡的系统镜像里”使卡每次冷启动后都能带着OFED环境跑起来。4.1 把卡启动起来并登录在安装OFED之前要先把MPSS基础栈装好并让卡处于可启动状态。MPSS安装完后的常用命令micctrl -s micctrl -bmicctrl -s查看卡的状态正常显示包括卡名mic0、状态online或booting、镜像路径等。micctrl -b会去启动卡之后可以通过ssh直接登录卡ssh rootmic0卡内的root登录默认是配好的主机侧也会有对应的/etc/hosts条目。如果连不上先检查卡是否online再检查主机防火墙是否放行mic相关的网段一般是192.168.100.0/24。4.2 同步用户态库到卡内OFED在卡内通常只需要用户态库不需要重复编译内核模块。原因在于OFED的verbs接口最终通过/dev/infiniband/uverbs*设备文件转发设备节点由MIC卡的虚拟IB设备驱动提供。从主机同步库的思路是这样的scp /usr/lib64/libibverbs.so.1 rootmic0:/lib64/ scp /usr/lib64/libibverbs/libmlx4.so rootmic0:/lib64/ scp /usr/lib64/librdmacm.so.1 rootmic0:/lib64/ scp /usr/lib64/libibumad.so.3 rootmic0:/lib64/但手动scp一个两个文件容易漏依赖。更稳妥的做法是在主机上把整个OFED用户态相关目录打包tar czf ofed-libs.tar.gz /usr/lib64/libibverbs* /usr/lib64/librdmacm* /usr/lib64/libibumad* /usr/lib64/libmlx4* /usr/lib64/libcxgb4* /usr/lib64/libnes* scp ofed-libs.tar.gz rootmic0:/tmp/ ssh rootmic0 cd / tar xzf /tmp/ofed-libs.tar.gz这里的libmlx4、libcxgb4、libnes分别是Mellanox、Chelsio、Intel网卡的用户态驱动库全打包进去虽然体积大一点但能保证应用在探测厂商设备时不缺库。卡内磁盘不像主机那么宽裕记得磁盘空间规划好几十MB没问题但别把整个OFED的rpm包都塞进去。4.3 配置ld.so和连接器的检索路径库放进去了不代表应用能找得到。卡内系统通常比较简单不能假设它默认ldconfig缓存里已经有这些路径。登录mic0做两件事。第一把库路径写进ld.so配置echo /lib64 /etc/ld.so.conf.d/rdma.conf ldconfig第二确认库是否被系统识别ldconfig -p | grep ibv能看到libibverbs.so.1说明动态链接库已经生效。这时候再跑一下ibv_devinfo如果能列出设备卡内OFED用户态就算是通了。4.4 持久化把OFED库打进启动镜像这一步非常关键也是新手最容易忽略的。MIC卡每次重启target OS都从主机侧镜像恢复手动scp进去的文件会全部丢失。所以个人经验是第一次网络同步用于快速验证稳定之后一定要把库打进启动镜像做成永久配置。MPSS里有两个方式做持久化一是用micctrl --initrd重新生成ramdisk二是直接把文件放进MPSS的target rootfs目录并重新打包镜像。不同版本的MPSS命令略有差异以micctrl --initrd为例micctrl --initrd --image/var/lib/mpss/mic0/具体的目录路径建议先看micctrl -s输出的镜像位置。重新生成镜像后重启卡micctrl -r mic0重启后再次ssh登录mic0执行ldconfig -p | grep ibv确认库还在说明持久化生效了。这一步做完MIC卡侧的OFED环境才算真正落袋为安。5. 验证与诊断别只看安装日志要按数据路径测装完驱动以后最忌讳的就是看到“安装成功”四个字就收工。我见过太多“装完了但不通”的现场绝大多数都是因为没按数据路径逐层验证。下面这套验证顺序我后来几乎每次部署都会走一遍。5.1 主机侧验证设备层先看OFED内核模块是否真的加载、设备是否被识别ibstat正常情况下会看到类似这样的输出CA mlx4_0 CA type: MT4099 Number of ports: 2 Firmware version: 2.30.3450 Node GUID: 0x248a070300f6c602 Port 1: State: Active Physical state: LinkUp如果ibstat报“Couldnt read IB management info”先查lsmod | grep ib_确认模块没掉再查dmesg | tail看有没有设备创建失败的记录。如果ibstat只显示本机CA端口始终Down多半是物理链路问题检查IB线缆、光模块和交换机端口。另一个常用的命令是ibv_devinfo这个命令更侧重verbs层设备的可操作性ibv_devinfo输出里重点看state: PORT_ACTIVE这行只要不是这个状态后面perftest测出来的数据没有参考意义。5.2 登录MIC卡内验证设备层同样的验证要在卡内再做一遍ssh rootmic0 ibv_devinfo卡内如果OFED库没同步好这一步会报找不到so文件或open device失败。能正常输出设备信息说明卡内用户态栈没问题。5.3 用perftest做端到端带宽测试光看设备状态还不够还要实测数据通路。perftest是OFED自带的微基准测试工具包里面常用的有ib_write_bw和ib_read_bw。主机侧作为服务端ib_write_bw -d mlx4_0 -x 1MIC卡作为客户端登录进去跑ssh rootmic0 ib_write_bw -d mlx4_0 -x 1 192.168.100.1这里的-d指定使用哪个设备-x 1指定端口号。如果MIC卡上的虚拟IB设备和主机之间的链路是通的会输出一段带宽和延迟的测试结果。我测试过的典型配置下MPSS虚拟OFED链路的带宽在数Gb/s级别比真正的InfiniBand物理链路低但远高于千兆以太网。5.4 检查MIC卡整体状态最后用MPSS自带工具确认卡的健康状况micinfo这个命令会列出每块MIC卡的固件版本、温度、电压、内存、核心数等信息。如果驱动栈有问题micinfo有可能直接报udp socket连接失败因为它也是通过MPSS的服务去读卡内信息。看到所有参数正常主机的驱动和卡内系统才算是真正的“全家桶”都通了。5.5 重要日志与配置文件验证过程中如果卡壳优先看这几处/var/log/mpss/mpss.logMPSS服务日志卡启动失败时这里是第一现场dmesg | grep -i mic内核里MIC模块的打印信息/etc/ofed/openib.confopenibd服务的配置/etc/rdma/rdma.confRDMA相关设置建议养成“一出问题先看日志”的习惯不要反复重启卡碰运气。日志里往往已经把根因写在脸上了。6. 安装过程中最容易翻车的几个坑附完整排查链路这一章把我在多台机器上踩过的坑集中复盘一遍。每个坑我都按照“现象、排查、根因、修复”的链路写希望你能直接照着排。6.1 坑一modprobe时报Operation not permitteddmesg提示Module verification failed现象OFED安装程序正常跑完执行modprobe ib_core时却报权限错误dmesg里出现类似“Module verification failed: signature and/or required key missing”的日志。排查过程一开始我以为是权限或SELinux的问题检查了root权限、关闭SELinux重试问题依旧。后来仔细读dmesg才定位到“signature and required key missing”这是内核模块签名验证失败的典型报错。根因主板开启了UEFI Secure Boot内核加载模块时会强制校验模块签名我们自编译的OFED模块没有对应的签名密钥。修复两个方案。一是进BIOS关闭Secure Boot这是省心但可能不合规的方案二是给模块做签名生产环境里我更推荐这个。签名需要用到MOKMachine Owner Keymokutil --import /path/to/key.der重启后按提示设置密码、确认导入MOK之后重新编译的模块或未签名模块就能正常加载。折腾过一遍之后我现在的习惯是安装前先用mokutil --sb-state确认Secure Boot状态再做后续动作。6.2 坑二OFED编译报错找不到内核构建目录现象./install.sh跑了几分钟突然抛出一堆configure错误最后一句是“Kernel build directory not found”之类的话然后整个安装进程中止。排查过程我先按第2章的方式查了rpm -q kernel-devel和/lib/modules/$(uname -r)/build发现devel包确实装了但build链接是断的。进一步排查确认yum自动升级过内核当前运行的内核版本和kernel-devel版本不一致。根因内核升级后没重启uname -r还是旧内核但kernel-devel已经换成了新内核对应的版本路径对不上。修复执行reboot重启到新内核后重新编译或者反方向yum install kernel-devel-$(uname -r)强行装回旧内核的devel包。我现在为了避免这种问题在安装MPSS和OFED之前会先yum update到稳定版本并重启一次再开始装驱动。6.3 坑三ibv_devinfo能看到设备但应用报错找不到库现象主机侧ibv_devinfo正常但MPI应用启动时提示找不到libibverbs.so.1或libmlx4.so。排查过程应用是在用户态动态链接OFED库的。我检查了ldd输出发现应用链接的库路径指向了/usr/local/lib64下的旧版本而OFED装到了/usr/lib64。两个路径里的同一套库版本不一致ldconfig缓存里优先命中了旧的。根因系统里有老版本RDMA库残留动态链接器优先选择了旧库。修复清理掉旧库路径下的相关文件重建ldconfig缓存rm -f /usr/local/lib64/libibverbs* ldconfig然后重新ldd /path/to/app确认链接路径正确。这个坑特别隐蔽因为ldconfig -p看到的是缓存结果不细看库文件路径根本发现不了。6.4 坑四MIC卡一直停在booting状态反复重启都起不来现象micctrl -b执行后卡始终不onlinemicctrl -s状态一两个小时都是“booting”。排查过程第一反应是看MPSS日志/var/log/mpss/mpss.log日志里反复出现固件版本过低、镜像kernel版本不兼容的报错。对照Intel官方Release Notes才确认新版本的MPSS要求MIC卡固件不能低于某个版本而卡上的固件还是出厂时的老版本。根因固件版本与MPSS不匹配卡在启动早期因为固件指令集兼容问题挂起。修复使用MPSS自带的micflash刷固件micflash -update -device 0 -fw XeonPhi_3120A_3_5_50205.rom刷固件有风险务必保证整个过程不中断供电。如果集群里有大批卡建议先在实验卡上验证固件版本再批量刷避免整个集群一起翻车。6.5 坑五卡内/tmp空间不足导致镜像打包失败现象执行micctrl --initrd重新生成镜像时报错提示“No space left on device”但主机侧磁盘明明很充裕。排查过程细看报错位置发现发生在打包卡内rootfs时报错的是/tmp路径。MPSS打包镜像时会在/var/tmp和/tmp下创建临时根文件系统副本如果这些目录挂载的分区太小就会看到“No space left”。根因/tmp所在分区只有几百MB而卡内rootfs加上OFED库超过2GB临时文件放不下。修复把打包临时目录重定向到大分区mkdir -p /data/mpss_tmp micctrl --initrd --tmpdir/data/mpss_tmp或者在部署早期就把MPSS的tmp目录软链到大分区。我后来的习惯是专门给MPSS划一个50GB的独立分区避免tmp空间这类问题再次出现。7. 这套环境跑通后的收尾经验经历了几次从零开始装MIC卡OFED环境之后我养成了几个习惯在这里一并分享。第一每次装完立刻用一份固定的命令清单做快照记录包括uname -r、MPSS版本、OFED版本、BIOS设置、固件版本这五项存成一个txt文件放到/root/deploy_notes目录下。别嫌麻烦过三个月再回来排障时这份清单能帮你省出至少半天时间。第二把OFED安装包和对应的MPSS安装包按版本目录归档。Intel当年发布这些包是有固定的版本组合的从官网重新找旧包很费劲自建一个本地目录镜像以后重装系统时直接内网获取又快又稳。第三卡内OFED的配置脚本写成幂等的放到镜像里。这样即使卡被重置也能通过一个命令把库、配置、环境变量全部恢复不需要每次手动scp和ldconfig。最后说句题外话。Xeon Phi这类MIC卡现在基本退出历史舞台了你可能在现网里遇到它的概率越来越低。但装这套驱动过程中积累下来的经验比如内核模块签名验证、动态链接库冲突排查、版本强匹配意识放到今天的GPU驱动、高速网卡驱动、甚至容器环境里依然是相通的。所以如果你现在是在为一个老旧的HPC集群做维护或者是在翻一个被遗忘的节点不要烦躁这套流程跑通一遍你对Linux驱动栈的理解会上一个台阶。