ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

银河麒麟V10 SP2安装Intel E810-C 100G网卡驱动实战

银河麒麟V10 SP2安装Intel E810-C 100G网卡驱动实战 银河麒麟高级服务器V10 SP2上装Intel E810-C 100G网卡这个事听起来就是“下载源码、make、install”三步走但真干起来才知道坑在哪。我前两天刚在自己负责的服务器上把这套流程完整跑通从系统不认卡到驱动装完跑满100G线速中间踩了不少坑今天把整个过程整理出来给同样在国产系统上折腾高速网卡的朋友一个参考。这个场景其实很典型银河麒麟V10 SP2作为服务器操作系统搭配Intel E810-C这种100G网卡常见于数据中心、高性能计算、视频处理和高速存储网络环境。E810-C本身是Intel的百G网卡底层驱动叫ice内核模块是ice.ko。但银河麒麟V10 SP2自带内核里的ice驱动版本往往比较旧对新固件和某些特性支持不全甚至在某些情况下会直接识别不到网卡。所以说白了装驱动这事本质上是在解决“系统内核和网卡固件之间的适配问题”。这篇东西适合谁看两类人一类是刚接触国产服务器操作系统、被驱动问题卡住的新手照着步骤抄作业就行另一类是在生产环境里做网络基础设施的老手可以参考一下我在性能调优和固件匹配上的处理思路少走点弯路。1. 开始之前先把场景和前置条件说清楚1.1 银河麒麟V10 SP2和E810-C是什么组合银河麒麟高级服务器操作系统V10 SP2是麒麟软件面向服务器场景推出的企业级Linux发行版内核基于4.19版本x86架构下对CentOS 8 / RHEL 8的二进制兼容性做得比较好很多为RHEL 8编译的软件包可以直接在它上面运行。这一点很重要因为后面找依赖包、找驱动很多都能从el8的源里找到线索。ARM架构的飞腾、鲲鹏版本也有但Intel E810网卡主要用在大规模x86服务器上所以本文以x86_64环境为基准展开ARM版的操作思路类似但工具链和包管理器细节会略有差异。Intel E810-C是Intel 800系列以太网控制器家族的一员属于面向数据中心和云计算的100G网卡。常见型号有E810-CQDA1双口和E810-CQDA2四口等变体物理接口通常是QSFP28支持100G/50G/25G/10G多种速率自适应。它的驱动叫ice由Intel官方维护主线内核里也有自带版本但自带的版本更新慢对新固件和高级特性的支持不全。更关键的是E810-C这种网卡依赖固件NVM和驱动紧密配合固件太旧、驱动太新或者反过来都会出现链路起不来、报错风暴这类问题。1.2 系统可能识别不到网卡的几个原因很多朋友拿到机器插上网卡发现ip link里根本没有新网卡第一反应就是驱动没装。但驱动没装上只是表面现象底下的原因有几个层次。第一内核里确实没有对应的ice驱动模块。银河麒麟V10 SP2默认内核虽然带了ice驱动但有些定制内核或最小化安装环境下相关模块可能没被编译进去。第二系统里有ice模块但版本太老而网卡固件已经更新过两者不匹配导致驱动加载失败或网卡初始化异常。第三更隐蔽的问题——PCIe枚举阶段没认出设备这往往跟BIOS设置、PCIe槽位带宽、或者SR-IOV、电源管理等选项有关。我在实际排障中遇到过一种情况网卡插在PCIe插槽上lspci能看见设备ID但dmesg里报ice: probe failed这种八成就是NVM固件和驱动对不上。所以在动手装驱动之前先把“系统看没看到硬件”这件事弄清楚能省掉后面一大半的排查时间。1.3 驱动安装的整体思路和选型说下整体思路。银河麒麟V10 SP2上装E810-C驱动不推荐直接改内核源码重新编译也不推荐用那种“万能驱动安装包”。正确路线是确认系统版本和内核版本确认网卡在PCIe层能被识别准备好编译环境然后从Intel官方获取ice驱动源码和最新NVM固件更新工具编译安装驱动、核对固件版本最后做链路验证和中断队列调优。至于为什么选编译源码而不是用rpm包我个人的经验是银河麒麟虽然兼容RHEL 8但毕竟不是100%的克隆直接用RHEL 8的kmod包偶尔会遇到内核模块版本校验不一致的情况。源码编译虽然多花几分钟但可控性高出了问题也容易定位。2. 安装前的环境准备这几步不做好后面全是坑2.1 确认系统版本、内核版本和网卡识别状态先别急着下载驱动把系统信息摸清楚。需要确认三样东西操作系统版本、内核版本、网卡是否在PCIe层被识别到。命令分别如下cat /etc/os-release uname -r lspci | grep -i ethernetcat /etc/os-release的输出会显示系统是Kylin V10 SP2uname -r会给出当前内核版本比如4.19.90-52.22.v2207.ky10.x86_64。而lspci | grep -i ethernet这行最关键如果能看到类似Ethernet controller: Intel Corporation Ethernet Controller E810-C for QSFP的设备项说明硬件层面已经被识别了后面只要搞定驱动就行。如果这里什么都看不到那就先别急着装驱动回BIOS里看PCIe设备是否启用、插槽是否工作正常。我遇到过一个有意思的情况网卡插在PCIe x16插槽上但BIOS里这个槽被设置成拆分模式导致网卡只能以x4链路训练虽然能识别但跑不满速。这种硬件配置层面的问题不是驱动能解决的提前检查能避免后面做白工。2.2 准备编译环境和内核开发包编译ice驱动需要gcc、make以及和当前运行内核完全匹配的kernel-devel。这一步看起来简单但踩坑率特别高。很多朋友直接yum install kernel-devel装出来的是仓库里默认版本跟当前uname -r的内核版本不一致结果编译时头文件路径对不上报一堆奇奇怪怪的错误。正确做法是指定版本安装yum install -y gcc make yum install -y kernel-devel-$(uname -r)注意执行完uname -r后要确认kernel-devel-$(uname -r)这个包在源里真实存在。如果提示找不到先执行yum list available | grep kernel-devel看看有哪些版本可用再手动指定。装完之后务必验证一下ls /usr/src/kernels/$(uname -r)如果这个目录存在且里面有include、Makefile这些文件说明开发环境就绪。还有个小坑银河麒麟的默认源里kernel-devel的包名有时叫kernel-devel有时叫kernel-headers后者是头文件包不能替代前者别搞混了。2.3 关闭可能会干扰安装的组件编译安装驱动期间有些系统组件可能会捣乱。比如dkms如果系统里装了dkms并且自动管理内核模块可能会出现新旧模块混用的情况。还有modprobe的黑名单机制如果/etc/modprobe.d/下有人把ice加入了黑名单那驱动编译好也加载不上。建议装驱动之前先查一下ls /etc/modprobe.d/ grep -r blacklist ice /etc/modprobe.d/ 2/dev/null如果发现黑名单文件里有ice相关条目直接把对应行注释掉或删掉否则后面modprobe ice会静默失败特别坑。另外如果系统里已经加载了老版本的ice驱动先记下它的版本后面装新版本的时候需要先卸载或者覆盖这在第4章会详细讲。3. 驱动安装实操从头到尾完整跑一遍3.1 获取驱动源码和固件更新工具这一步是很多人卡住的点。Intel的驱动源码在官方支持网站有下载搜索“Intel Ethernet Adapter Complete Driver Pack”或者直接在下载中心找ice驱动对应的Linux版本。下载下来是一个tar.gz包文件名通常是ice-x.y.z.tar.gz这样的格式。解压tar zxvf ice-*.tar.gz cd ice-*这里强调一下E810-C的驱动和固件是两个东西。驱动是ice内核模块负责数据通路固件NVM运行在网卡内部负责物理层协商和管理。Intel官网有专门的NVM更新工具针对E810系列的是nvmupdate也需要一并下载。旧固件搭配新驱动最常见的现象是链路能起来但跑几十分钟就断一次dmesg里报Link Down事件。另外留意一下网卡具体型号E810-CQDA1和E810-CQDA2在固件包上可能有区分下载时选对型号别用错固件。3.2 编译安装ice驱动解压后进到源码目录先看README然后按标准流程编译安装cd src make make install编译过程中如果没有报错make install会把ice.ko安装到/lib/modules/$(uname -r)/updates/目录下。安装完成后执行depmod -a modprobe icedepmod -a会重建模块依赖关系这一步千万别省。加载成功后用lsmod | grep ice确认模块已加载再用dmesg | tail -50看看有没有异常报错。正常的日志会显示ice: Intel(R) Ethernet Connection E810-C successfully loaded之类的字样并打印出网卡的固件版本。这里有个常见问题如果系统之前加载过旧的ice模块modprobe ice可能会因为模块已被占用而加载失败。稳妥的做法是先卸载旧模块再加载新的rmmod ice modprobe ice如果rmmod提示Module ice is in use说明有网卡接口正被系统占用需要先把对应的网卡接口down掉比如ip link set enp3s0 down再执行rmmod。3.3 固件NVM核对与更新驱动装好后第一时间核对固件版本。用ethtool -i查看驱动和固件信息ethtool -i enp1s0输出里会显示driver: ice、version: x.y.z、firmware-version: x.x.x。去Intel官网查一下当前网卡最新的NVM版本如果固件版本落后太多建议更新固件。NVM更新工具的用法一般是解压后以root权限运行tar zxvf nvmupdate_100g_linux_x64_*.tar.gz cd nvmupdate_100g_linux_x64_* ./nvmupdate64e工具会扫描系统里的Intel网卡列出当前固件版本然后提示是否更新。更新过程中千万别断电也别重启否则网卡可能变砖。更新完成后需要关机断电再开机只重启不一定生效这是Intel网卡的惯例。E810-C这个卡还有个值得注意的地方100G速率下对PCIe带宽要求很高如果插在PCIe 3.0 x8的槽位上带宽只有约64Gbps跑不满100G线速。固件更新工具和ethtool -p都能确认链路宽度建议顺手检查一下lspci -vvv -s 01:00.0 | grep -E LnkCap|LnkSta看到LnkSta: Speed 16GT/s, Width x16就说明PCIe链路是OK的。如果只是x8那物理层面的带宽瓶颈是目前驱动解决不了的。3.4 加载驱动并完成基础网络配置驱动加载成功后ip link应该就能看到新网卡了接口名一般是enpXsX这种格式。在银河麒麟V10 SP2上配置IP可以用nmcli也可以用传统配置文件。我用的是nmcli因为麒麟默认启用了NetworkManagernmcli con add type ethernet con-name eth100 ifname enp1s0 ipv4.method manual ipv4.addresses 192.168.10.10/24 nmcli con up eth100要注意如果这张网卡之前被NetworkManager或者systemd-networkd接管过直接加连接配置可能会报“设备已被管理”的错。先执行nmcli device status看一下网卡状态如果显示unmanaged需要先删掉旧的连接配置或者把/etc/sysconfig/network-scripts/ifcfg-*里对应的文件清理干净。配置完成后ping一下对端验证基础连通性。这里有个实用的检查命令ip -s link show enp1s0这个命令能看收发包统计。如果发现RX errors、TX errors一直在涨说明链路质量有问题可能是光模块、光纤或者固件设置的问题这个后面会细说。4. 安装后的验收与性能调优驱动装上只是开始4.1 确认链路速率和双工模式装好驱动、链路起来之后第一步先确认链路协商的实际速率。E810-C支持100G/50G/25G/10G实际速率取决于光模块和对端设备。用ethtool查看ethtool enp1s0输出里的Speed和Duplex会显示实际的协商结果。比如Speed: 100000Mb/s、Duplex: Full。这里就会暴露很多问题明明插的是100G模块链路只协商到25G常见原因包括光纤跳线类型不对、对端端口速率配置限制、或者光模块本身是拆分的比如100G通过4x25G breakout模式。还有一个坑QSFP28端口上用了一些兼容性不好的第三方模块链路训练困难会出现反复up/down。4.2 队列、中断和环形缓冲区调优E810-C这种100G网卡默认配置往往没把性能吃满特别是CPU核数充足的服务器上默认只有几个队列在跑很容易把单个CPU核打满。检查当前队列数ethtool -l enp1s0看Combined字段的当前值和最大值。如果当前值远小于最大值就可以调。我在服务器上普遍把队列数设置成和CPU物理核数一致注意不是逻辑线程数要排除超线程。调整命令ethtool -L enp1s0 combined 32调整之后再看看中断亲和性。ice驱动默认会自动做中断和CPU绑定但有时候在虚拟机里驱不起来需要手动设置。还有个关键点环形缓冲区ring buffer大小。默认情况下ring buffer可能只有1024或者更小100G流量下丢包会很严重。我一般会调大一点ethtool -G enp1s0 rx 4096 tx 4096调完之后用ethtool -S enp1s0 | grep -E rx_dropped|tx_dropped观察丢包是否下降。注意环形缓冲区不是越大越好太大会增加延迟对延迟敏感的业务要折中。4.3 用工具验证实际吞吐配置全部就绪之后用iperf3做收发吞吐测试这是最直观的验收手段。两端各准备一台服务器一端跑服务端一端跑客户端# 服务端 iperf3 -s # 客户端 iperf3 -c 192.168.10.20 -P 8 -t 60-P 8表示用8个并行流。如果两端CPU足够强、PCIe链路正常吞吐跑到90Gbps以上基本就算达标。注意iperf3默认单线程可能跑不满100G必须用多流。另外如果吞吐明显偏低但链路速率正常先查CPU中断是不是集中在一个核上mpstat -P ALL 1看一下哪颗核软中断占用高就把网卡中断往那边绑。很多时候百G网卡跑不满速不是网卡不行是CPU处理不过来。5. 常见问题与排查技巧实录5.1 编译报错找不到头文件或版本不匹配这是最高频的报错。症状是make的时候提示Kernel header files not found或者linux/version.h: No such file or directory。原因基本都是kernel-devel没装对。排查思路是先确认uname -r和/usr/src/kernels/下的目录名是否一致不一致就给yum install kernel-devel-$(uname -r)。如果源里实在没有对应的版本还有一个临时方案修改源码里Makefile把KSRC路径指到实际存在的内核头文件目录。但这个方案只建议应急测试用生产环境还是要装匹配的kernel-devel。另外一个比较容易忽略的点gcc版本太旧。银河麒麟V10 SP2自带的gcc是8.x一般够用。但如果是从老系统升级上来的环境gcc版本可能在4.8左右新版本ice驱动源码用了C11语法编译必挂。遇到这种情况升级gcc或者装高版本的devtoolset工具链就行。5.2 驱动加载失败module loading error或probe failed驱动编译安装好了但modprobe ice报错或者加载成功但dmesg里有ice: probe failed这个就得仔细看日志。probe failed一般是网卡初始化和固件通信失败原因通常是NVM固件版本和驱动不匹配。处理办法很简单更新固件到Intel官网上的最新版本或者反过来下载和固件版本对应的旧版驱动。还有一种情况系统里同时存在多个ice模块。比如自己编译安装了一个系统自带的也还在modprobe加载了旧的那个。排查方法modinfo ice | grep filename看这个模块到底是从哪个路径加载的。如果路径不是/lib/modules/$(uname -r)/updates/说明加载的是旧模块需要手动把旧模块删掉或者用insmod /path/to/new/ice.ko强制加载新模块。注意先rmmod再insmod避免两个模块同时存在的冲突。5.3 链路反复up/down装好驱动、配置好IP之后发现链路一会通一会断dmesg里刷Link is down、Link is up。这种问题先怀疑光模块和光纤。E810-C这类数据中心网卡对光模块的兼容性是有测试列表的Intel官网上有推荐模块清单。有些杂牌光模块虽然能用但信号质量差长距离传输时误码率高就会导致链路不稳定。排障时可以试两个操作一是把速率从100G固定到25G或10G试试如果低速率下链路稳定那基本可以确诊是光模块或光纤问题二是用ethtool -m enp1s0查看光模块的DDM信息包括光功率、温度、电压等。如果接收光功率在灵敏度临界值附近大概率是光纤衰耗太大。5.4 问题速查表现象可能原因处理办法lspci看不到网卡BIOS未启用PCIe设备、插槽故障进BIOS检查设备状态换个插槽测试make报内核头文件缺失kernel-devel未安装或版本不匹配安装kernel-devel-$(uname -r)确认路径存在modprobe ice提示模块占用老版本模块已被使用ip link后续down所有ice接口rmmod后重新加载链路只能协商到25G光模块类型不匹配、对端端口限制更换Intel兼容模块检查对端配置100G跑不满速PCIe带宽不足、CPU中断集中检查PCIe链路宽度调整队列数和中断亲和性丢包严重ring buffer太小、CPU软中断瓶颈调大rx/tx ring调整CPU核绑核频繁断连光模块信号质量差、NVM版本旧检查DDM光功率更新固件到最新5.5 一点独家心得别忽略“模块签名校验”银河麒麟V10 SP2有个跟普通CentOS不太一样的地方内核可能启用了模块签名校验。如果编译安装的驱动模块没有正确签名加载时会报Required key not available或者Module verification failed。这个坑官方文档提得少但实际环境里真会遇到。排查方法很简单tail -20 /var/log/messages | grep -i key如果看到签名相关的报错解决方案有两个一是用系统的签名工具对编译好的ice.ko做签名二是干脆把Secure Boot关掉如果是个人测试机的话。生产环境还是建议走正规签名流程安全性和合规性都有保障。我见过有人在这上面折腾了大半天最后发现就是Secure Boot的问题。还有一个细节银河麒麟V10 SP2在某些硬件组合下会因为ACPI表解析问题导致PCIe设备枚举不稳定表现就是重启后网卡时而认得到时而认不到。这属于平台适配问题建议先把BIOS和固件都升到官方最新版再配合最新NVM固件和驱动一般能解决。最后再说两句装E810-C驱动这个事我前前后后在银河麒麟V10 SP2上折腾了不止一次。整体感受是驱动本身不难装难的是摸清系统、固件、硬件三者之间的匹配关系。Intel的网卡在Linux生态里的支持算比较好的ice驱动更新也勤快只要你愿意花时间把环境对齐国产系统上跑100G完全没有问题。我自己在实操中最深的体会一是不要跳过固件版本核对这一步很多隐蔽的链路问题都源于固件和驱动版本错配二是编译环境一定要用与运行内核完全匹配的kernel-devel这个能避免八成以上的编译报错。最后如果生产环境要用建议先在测试服务器上完整跑一遍驱动安装和压力测试再上生产别拿生产环境当实验场。希望这篇东西能帮你少踩几个坑。如果你在银河麒麟上装E810-C遇到别的奇怪问题也欢迎交流思路集思广益总比自己死磕快一点。
返回列表