
1. 装这块卡之前先弄清环境底细提到银河麒麟高级服务器V10 SP2很多从CentOS迁移过来的运维第一反应是“这不就是个换了皮的Linux吗”。这话对了一半银河麒麟确实基于开源Linux生态构建但SP2这个版本的内核、用户态组件和硬件兼容矩阵都有自己的脾气尤其在面对100G这种高性能网卡时不能想当然地拿Ubuntu那套思路硬套。先说我这边的环境一台双路服务器CPU是Intel Xeon Gold 6330主板自带PCIe 4.0插槽系统是银河麒麟高级服务器V10 SP2内核版本默认是4.19系列具体小版本号在下面的命令里能看到。网卡是Intel E810-C也就是E810-CQDA2这块双口100G QSFP28型号。这块卡用的是Intel的Columbiaville芯片驱动叫ice这个驱动的来历和坑后面会详细说。在动手之前我强烈建议你先执行下面这组命令把环境底细摸清楚别急着找驱动包# 查看系统版本和内核 cat /etc/kylin-release uname -r # 查看PCIe设备识别情况 lspci | grep -i ethernet # 看看内核里是否已经带了ice驱动模块 find /lib/modules/$(uname -r) -name ice* 2/dev/null lsmod | grep ice为什么这一步很重要因为E810-C这块卡在较新版本的内核里已经内置了ice驱动如果你的系统内核版本足够新根本不需要折腾官方驱动modprobe ice就能直接拉起。但银河麒麟V10 SP2默认内核是4.19.x这个版本的ice驱动比较老对E810-C的某些功能支持不完整而且容易出现加载后链路起不来、或者速率只有25G的怪问题。所以先看内核自带驱动是否存在、版本是多少再做决定。从我的实测来看V10 SP2自带的4.19内核里确实有ice模块但版本是老的0.9.x还是1.x我记不清了但肯定不是Intel官方最新的而且没有配套的固件文件。这就意味着就算你加载了模块网卡也可能无法正常negotiate链路或者ethtool能识别但发包就丢。这种情况下老老实实走编译安装官方驱动的路子反而最稳妥。还有一点要注意E810-C是支持RDMA的RoCEv2如果你想用InfiniBand类的应用或者需要DPDK那就必须装Intel官方发布的ice驱动并且还要配套装irdma模块。如果只是拿来当普通100G网口用内核自带的驱动也能凑合但为了性能和稳定性我还是建议用官方驱动覆盖。2. 三个可选方案我为什么最终选了源码编译针对银河麒麟V10 SP2装E810-C驱动市面上的方案无外乎三种我分别试过这里直接说结论和适用场景。2.1 方案一直接用内核自带模块适合内核≥5.7的系统如果你的系统内核已经升级到了5.7以上那直接modprobe ice就能用。但银河麒麟V10 SP2默认内核是4.19自带ice太老而且没有配套的NVM更新工具。我在测试中发现老版本ice加载后虽然接口出现了但是插上光模块后link始终是down的ethtool看不到速率协商信息明显是驱动和固件不匹配。这条路在SP2默认环境下基本走不通除非你额外升级内核但服务器生产环境升级内核的代价太大不推荐。2.2 方案二用Intel官方预编译的RPM包适合纯内网、没有编译环境的机器Intel官方发布驱动时除了源码包也会提供编译好的RPM文件包括ice、irdma等。理论上你可以直接rpm -ivh装上去。但问题在于这些RPM包通常面向主流发行版RHEL、SLES、Ubuntu编译依赖的kernel-devel版本很可能和银河麒麟的4.19内核不一致。我在CentOS系的机器上试过可以装但在麒麟上遇到过依赖冲突因为麒麟的内核修改过模块签名校验机制也不一样。不过如果现场环境确实不能装编译器比如说安全要求特别严格的内网机器你可以尝试用rpm -ivh --nodeps --force的方式强装。但坦白说这种操作属于能用就行不建议在关键业务机器上这么干因为驱动模块和内核版本不匹配很可能会在运行中出现panic或者内存泄漏。我的建议是除非万不得已别用这个方法。2.3 方案三从Intel官网下载源码包本地编译安装我最终选的路这也是本文的核心内容。源码编译虽然看起来麻烦一些但它对内核版本、系统库的适配性最灵活而且可以指定安装路径、调整编译参数出了问题也容易排查。尤其是银河麒麟这种基于CentOS/RHEL生态但又有所修改的系统源码编译是兼容性最好的方式。当然源码编译有个前提条件你必须能装上build-essential那套工具链并且系统里有kernel-devel包。银河麒麟V10 SP2的安装镜像里一般自带这些包或者你可以通过配置好的yum源安装。如果机器完全离线那需要提前准备好kernel-devel、gcc、make这些包的离线rpm包。后面我会详细说这一步怎么操作。从原理上说网卡驱动本质上是内核模块它需要和内核的API完全匹配。内核版本升级或者打了补丁之后模块接口可能会变化所以官方驱动包会对应多个版本分支选版本时不能只看最新还要看它的兼容性说明。我之前试过用最新的ice 1.9.x版本在麒麟SP2上编译结果因为内核头文件定义不一致直接报编译错误。后来换成Intel官方对4.19内核适配的版本才顺利通过。这个细节在后面章节会展开。3. 环境准备kernel-devel、gcc还有那些你必须提前装好的东西这部分是容易被忽略的坑。很多新手在编译驱动时报错Kernel header not found或者Unable to find kernel source然后整个人就懵了。其实原因很简单内核模块编译需要内核头文件而这些头文件在kernel-devel包里面默认系统不一定装了。3.1 确认内核版本和对应的devel包首先记下你的内核版本uname -r假设输出是4.19.90-23.8.v2101.ky10.x86_64注意这个后缀ky10是麒麟特有的它对应的是银河麒麟V10系列的内核。这时候你安装kernel-devel必须精确匹配这个版本号包括ky10那部分也要对上否则编译时头文件版本不一致还是会报错。安装命令# 使用麒麟自带的yum源 yum install -y kernel-devel-$(uname -r)或者如果你能连外网也可以直接yum install -y kernel-devel安装完成后检查下面这个路径是否存在并且里面有没有build目录ls /usr/src/kernels/$(uname -r)如果能看到build、include这些目录说明kernel-devel装好了。3.2 安装编译工具链yum install -y gcc gcc-c make elfutils-libelf-devel这里要特别提一下elfutils-libelf-devel很多人在编译驱动时遇到缺少libelf.h或者elfutils相关报错就是这个包没装。Intel的ice驱动编译脚本在配置阶段会检查这个库缺了直接configure失败。另外如果你打算用RDMA功能还需要安装rdma-core相关的依赖yum install -y rdma-core-devel libibverbs-devel但这里有个注意点银河麒麟V10 SP2自带的rdma-core版本可能比较老我记得是28左右的版本而新版本的ice驱动默认对接的是rdma-core 35以上版本。如果在configure时检测到rdma-core版本太低它会自动禁用irdma就是RDMA驱动的编译只生成纯ice的模块。这个不算致命错误但如果需要RDMA功能就得提前把rdma-core升级。升级的方法有两种一是用麒麟源里的新版本如果源里有的话二是自己去GitHub上编译安装。后者工作量有点大而且可能会影响系统里其他依赖老版本rdma-core的组件建议需要RDMA的童鞋提前做好备份和测试别直接在生产上操作。3.3 离线环境怎么办我遇到过不少内网服务器的场景银河麒麟的yum源配的是内网镜像上面不一定有完整的高版本kernel-devel。这时候有个笨办法找一台同样系统版本、能上外网的机器把相关的rpm包下载好拷到内网机器上。# 在能上网的机器上执行 yum install --downloadonly --downloaddir/tmp/kernel-rpms kernel-devel-$(uname -r) gcc make elfutils-libelf-devel然后把/tmp/kernel-rpms下所有rpm拷到内网机器执行rpm -ivh /tmp/kernel-rpms/*.rpm如果是完全断网的环境连依赖匹配都成问题那我的建议是把源盘里的kernel-devel包找出来装上。银河麒麟的安装ISO里其实带了kernel-devel的rpm包用mount挂载ISO后在Packages目录下能找到。虽然版本可能和实际运行的内核有细微差异大多数情况下是一致的但编译ice驱动问题不大。3.4 验证一下当前系统的构建环境装完依赖后别急着下载驱动先跑一下这个命令确保内核可以编译模块cd /usr/src/kernels/$(uname -r) make oldconfig make prepare如果这里编译过程中报错说明工具链还有问题先解决这一步否则后面驱动编译一定失败。make prepare这个过程大概几分钟看机器性能如果你编译时报错找不到某些头文件大概率是这一步没做成功。我遇到过的一种情况是装完kernel-devel后/usr/src/kernels目录下的软链接指向不对导致编译时找不到头文件。解决方法是手动重新建立软链接ln -sf /usr/src/kernels/$(uname -r) /lib/modules/$(uname -r)/build这个命令可以反复执行确保万无一失。4. 下载Intel官方ice驱动源码版本选择和文件校验Intel的网卡驱动都放在官方的一个统一站点上叫Intel Support。对于E810系列它的驱动页面会提供icenrdma驱动的下载文件名类似ice-1.11.14.tar.gzice-1.10.13.tar.gz或者更高版本不同版本号对应的内核兼容性不同。以我踩过的坑为例我最初下载了ice-1.15.x印象中是2023年某个版本在麒麟SP2的4.19内核上编译直接报错错误信息类似error: implicit declaration of function in_dev_get这个函数在新内核里被移除了而老内核还在用说明驱动太新适配的是5.x内核对4.19反而不友好。后来我换成ice-1.9.7这个版本编译一次通过。这个经验告诉我不要盲目追求新版驱动要和你的内核版本匹配。你的内核越老驱动的版本也应该跟着用老一些的分支。下载方式可以用wget也可以直接浏览器下载后传上去wget https://downloadmirror.intel.com/.../ice-1.9.7.tar.gz注意Intel官方下载链接经常变动建议直接在Intel官网搜索E810 ice driver download进到对应产品页面后选择Linux驱动。下载完成后做一个SHA256校验确保文件完整sha256sum ice-1.9.7.tar.gz和官网上公布的checksum比对一致再解压。这一步虽然看着多余但你要是经历过下载了半截文件然后编译报各种奇怪错误的场景就知道这10秒的价值有多大。解压tar -xzf ice-1.9.7.tar.gz cd ice-1.9.7在源码目录里你会看到几个重要的东西README、src目录、scripts目录、Makefile。Intel的驱动编译方式比较统一就是标准的make看README大致就能明白。还有一个细节ice驱动源码包里通常还会带一个叫做ice-firmware或者firmware的目录里面是NVMNon-Volatile Memory网卡固件文件一般是.inp或者.phi格式。这个固件文件很重要如果你的网卡出厂固件太旧驱动加载后可能会出现特殊现象比如link就是起不来或者100G协商不了。如果你确认网卡固件版本过旧需要单独用Intel的NVMUpdate工具升级固件。E810-C的固件更新工具需要在Intel官网单独下载一般叫Intel Ethernet Adapter Complete Driver Pack或者NVMUpdate Package。这个工具在Linux下有命令行版本可以烧录最新的固件。但这属于另一个话题了这里不展开说只提醒一点如果网卡link起不来先看ethtool -i输出的firmware版本不要上来就认为是驱动问题很可能只是固件太旧。5. 编译安装全程实录configure参数、make的坑和最终加载5.1 进入源码目录后的第一步先看configure的帮助cd ice-1.9.7 ./configure --help你会看到有很多选项但一般用默认的就行。如果你想指定安装路径可以用--prefix但内核模块的安装路径最好保持默认/lib/modules/$(uname -r)/updates否则modprobe找不到。5.2 执行configure./configure这个阶段会检查系统环境输出类似checking for kernel...的信息。如果你看到以下错误configure: error: Kernel /lib/modules/4.19.90/... is not configured说明内核头文件没准备好回到第3节去解决。如果configure顺利完成会生成Makefile。5.3 编译和安装make make installmake的过程会持续几分钟具体时间取决于源码版本和机器性能。如果编译过程出现错误大多数情况是因为内核版本和驱动不匹配。常见错误有缺少头文件比如linux/if_link.h找不到——检查kernel-devel是否安装完整函数名冲突比如某个函数在新版内核改名了——只能换驱动版本警告当成错误-Werror——可以尝试在Makefile里去掉-Werror但这是下策不建议我建议的做法是编译前先看一下Makefile里的KSRV内核源码目录变量确保它指向正确的路径。如果默认指向/usr/src/linux而你的内核源码在/usr/src/kernels/xxx就需要手动指定make KSRC/usr/src/kernels/$(uname -r)这一步很多人不知道但很关键。5.4 驱动安装需要root权限装完后如何正确加载make install完成之后ice.ko和irdma.ko如果编译了会被拷贝到/lib/modules/$(uname -r)/updates/drivers/net/ethernet/intel/ice/接下来要执行depmod让系统更新模块依赖关系depmod -a然后加载内核模块modprobe ice如果加载过程中报错先用dmesg看一下内核日志dmesg | grep ice正常情况会在日志里看到类似ice: Intel(R) Ethernet Connection E810-C Registered这样的日志说明驱动加载成功了。5.5 验证驱动是否真正生效ethtool -i enp133s0f0这里enp133s0f0是网卡接口名需要根据你系统实际分配的名称来看用ip link就能列出来。输出类似于driver: ice version: 1.9.7 firmware-version: 4.20 0x80014b5e注意这个firmware-version很重要如果它显示不出来或者版本特别老说明固件没加载联系第4节说的固件升级问题。再看一下链路状态ethtool enp133s0f0如果插上了光模块和对端设备正常情况下你会看到Speed: 100000Mb/s Duplex: Full这代表网卡已经协商到100G了。5.6 关于开机自动加载的问题默认情况下modprobe ice加载的模块在重启后会重新加载。但为了确保万无一失最好把ice加入模块加载列表echo ice /etc/modules-load.d/ice.conf然后配置网卡IP重启验证是否自动生效。这里顺便提一句银河麒麟V10 SP2的网络配置可以用nmtuiNetworkManager的文本界面工具也可以用传统的/etc/sysconfig/network-scripts/ifcfg-xxx文件。我个人更推荐用nmtui因为麒麟的NetworkManager服务默认是启用的用传统配置文件有时候会冲突。配置完IP后ping 网关IP确认网络通了安装才算真正成功。6. 百G网卡不是插上就能用链路协商、MTU和中断绑定的排查驱动装好只是第一步100G网卡想要稳定跑满带宽需要做的调优和排查远不止modprobe那么点事。下面这些问题都是我在E810-C实际使用中逐个踩过并解决的列出来供你参考。6.1 链路协商不上去先分清是光模块问题、线缆问题还是固件问题100G网卡最常见的问题是插上模块后link起不来。E810-C用的是QSFP28接口支持100G SR4/LR4等模块。如果对端是100G交换机模块和光纤都是新的但link就是down我建议按这个顺序排查看ethtool输出中是否有Link detected: no检查光模块是否被识别ethtool -m enp133s0f0如果能输出模块信息SN、温度、光功率说明模块通信正常执行网卡自环测试loopback testethtool -t enp133s0f0这个测试会花几十秒能判断是不是网卡硬件本身的问题检查对端交换机端口的强制速率配置。有些交换机默认是自协商但100G的自协商在很多设备上默认关闭对端如果锁死在某个速率两边就协商不起来最后再看固件版本。E810-C的固件如果低于某个版本确实会出现某些模块不被识别的问题这时候就得更新NVM6.2 MTU要不要改成9000100G网络里面绝大多数场景都是跑存储或者高性能计算这类应用对大包吞吐敏感所以建议把MTU改成9000jumbo frame。设置命令ip link set enp133s0f0 mtu 9000注意对端设备和交换机也要同时支持并配置MTU 9000否则会出现ping大包不通的情况。如果你只是跑普通的TCP业务对端设备不支持大MTU那就老老实实保持1500强行改大反而会导致分片和性能下降。6.3 中断绑定和队列数调优100G网卡如果不做中断优化CPU负载会集中在个别核导致瓶颈。E810支持多队列RSS默认情况下驱动会为每个CPU核分配一个队列但中断可能都跑到CPU0上。你可以通过下面这个脚本把中断绑定到不同核# 查看当前中断 cat /proc/interrupts | grep enp133s0f0 # 获取每个队列的中断号 for irq in $(cat /proc/interrupts | grep enp133s0f0 | awk -F: {print $1}); do echo IRQ $irq done然后把中断亲和性设置到对应的CPUecho 1 /proc/irq/$(irq_number)/smp_affinity更优雅的做法是使用irqbalance服务但为了极致性能手动绑定更可靠。另外E810还支持ADqAdvanced Dynamic Queues和Flow Director功能这些都能在大流量场景下优化转发性能不过需要额外的配置后面有机会单独开一篇说。6.4 驱动版本和内核版本的关系再强调一遍我在前面写了很多次版本匹配这里再赘述。E810的ice驱动和内核版本之间的兼容关系其实在Intel的Release Notes里有明确说明表。比如ice 1.9.x支持的kernel range是3.10~5.13ice 1.11.x支持的kernel range是4.18~5.18。如果你用5.15以上的新内核可以放心用1.11.x或更高但如果你在4.19上1.9.x系列是稳妥的选择。不要问我为什么1.11不能编译到4.19上我也没完全搞明白Intel为啥要设置这么严格的限制总之实测就是不行。这个原则对其他驱动也适用。用驱动之前先花几分钟看Release Notes能省下后面好几个小时的排错时间。6.5 RDMA功能要不要开E810-C这块卡一个很大的卖点是支持RoCEv2也就是RDMA over Converged Ethernet。如果你要在上面跑高性能计算或者分布式存储那RDMA很关键。使用RDMA的前提条件是ice驱动和irdma驱动都成功加载modprobe irdma系统里有rdma-core用户态组件ibv_devinfo能看到设备如果ibv_devinfo输出里能看到E810的设备和端口说明RDMA功能正常。如果看不到大概率是rdma-core版本太低或者驱动编译时irdma没有被编译进去。这时候需要回到下载页面找到配套的irdma源码包Intel的驱动页面会提供单独的irdma下载单独编译安装。另外一个注意点RoCEv2对网络质量要求比较高必须确保链路没有丢包否则RDMA性能会断崖式下跌。建议在交换机上开启PFC优先级流控制和ECN显式拥塞通知这些是在使用RDMA前必须搞定的网络配置不在驱动安装范围内。6.6 性能测试别急着说驱动装好了驱动安装完成后最后一步是验证性能。我最常用的两个工具是iperf3和qperf。# 在服务器A上 iperf3 -s # 在服务器B上 iperf3 -c 服务器A的IP -t 60如果TCP吞吐能跑到90Gbps以上说明驱动和链路基本没问题。如果只有30Gbps甚至更低检查一下是不是中断都堆在一个核上或者网卡协商速率只有25G/40G。再用ethtool -S看网卡统计信息看看rx_errors、tx_errors是否有值ethtool -S enp133s0f0 | grep -i error如果有errors或dropped说明链路质量或者驱动配置有问题需要进一步定位。这一步做完你才算真正把这块100G网卡装好了。7. 一些零碎但实用的补充最后分享几个我自己体会比较深的操作细节不一定能对上每个人遇到的问题但都是实打实趟出来的经验。第一如果机器上有多个网卡安装后务必确认模组加载的先后顺序。有些系统会默认加载老的igb/ixgbe模块如果你之前装过其他Intel网卡这可能会导致接口命名混乱。比如你新加的E810-C接口名可能是enp133s0f0而不是常见的eth0。用ip link和ethtool -i验证每个接口对应的确实是你想用的那口物理网卡避免后续配置把业务网口搞错。第二银河麒麟的NetworkManager服务在某些版本上有bug激活新网卡连接有时会失败提示Connection activation failed。这时候可以先systemctl stop NetworkManager然后直接用nmcli或者传统ifcfg配置启动。我遇到过一次用nmcli连E810的接口总是超时但手动ifup又没问题后来查了下是NetworkManager的dhcp超时设置太短导致的改一下/etc/NetworkManager/conf.d/下的配置文件就好了。第三Intel官方驱动包里面自带的README真的值得从头到尾读一遍。很多细节比如NVM update required before loading driver、某些依赖库的最低版本要求都会写在里面。虽然现在很多人习惯只看教程不看官方文档但在企业级硬件的场景下官方文档往往比教程更全、更准。最后想说100G网卡驱动安装这件事本身的难度并不在于装驱动这个动作而在于你要理解整个链路从内核API的适配、固件和驱动的匹配到链路协商、用户态工具链的配合这些都是一个系统工程。把上面的思路捋顺了别说E810以后换其它的新网卡比如E830、或者别的厂商的100G卡你也能很快上手。生产环境里面稳比新重要快比全重要这是我一直以来的体会。