
事情得从一张网卡说起。2025年初我配了台新机器CPU、主板、显卡都是当时的主流型号盘算着装个Ubuntu 20.04当日常开发主力系统。为什么还装20.04因为要跑PetaLinux和Zynq-7000的交叉编译工具链还要兼容老项目的CUDA环境20.04在工业软件兼容性上比22.04、24.04稳太多。结果系统装完开机一切看着正常唯独上不了网——ip link一敲全网卡列表里只有孤零零的lo物理网卡接口压根没出现。我第一反应是网线、交换机、路由器全查了一遍全都正常用Windows启动盘试过网卡也没问题。排到后面才意识到问题出在Ubuntu 20.04自带的5.4内核根本不认识2025年的网卡硬件。这篇内容适合所有在近两年的新硬件上装老版本Ubuntu、Debian系系统遇到没有物理网卡接口、上不了网、只有回环地址的读者。我会把整个排查链路、三条修复路线、换内核之后的隐藏雷区全部写清楚。其中多数操作我亲自跑过部分细节是针对常见硬件组合的通用解法你可以照着操作。1. 现象确认系统起来了但网卡根本没被内核认出来很多人在这一步就卡住了看到ip addr只有一个lo第一反应是网线没插好或者交换机有问题。其实只有lo是一个含义非常明确的信号先把这个信号解读清楚后面才能走对方向。1.1 什么叫只有lo看清网络接口的真实状态Linux系统里lo是loopback接口也就是本机回环它永远存在跟物理网卡没有任何关系。正常情况下ip link show应该能看到类似enp3s0、eth0、eno1这样的物理接口如果一台有有线网卡的机器在系统启动完成后物理接口完全没有出现那基本可以断定内核没有为这片网卡创建网络设备。我当时的输出是这样的$ ip link show 1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00没有第二行没有任何enp开头的接口。注意这里我特意用了ip link show而不是ifconfig -a因为ifconfig是net-tools的老工具在新系统上输出可能不完整。以ip命令的输出为准。另一种情况是接口存在但是状态是DOWN例如2: enp5s0: NO-CARRIER,BROADCAST,MULTICAST,UP mtu 1500 qdisc fq_codel state DOWN这种情况的话问题往往在链路层——网线、交换机、对端设备——而不是驱动。NO-CARRIER表示物理层没有检测到载波信号优先级最高的检查是网线接口和交换机端口。1.2 排错前先做三次检查别急着怪驱动我在排查时给自己定了个规矩先做三件最基础的检查全部排除之后才把矛头指向内核驱动。这三步分别是第一步检查BIOS/UEFI里网卡是否被禁用。有些主板会在安全设置里默认关掉板载网卡尤其是带双网卡的主板可能只开了其中一张。重启进BIOS找到Onboard LAN之类的选项确认状态是Enabled。第二步确认网卡硬件本身没有故障。用一个Live CD比如Ubuntu 24.04的安装U盘启动后看能不能识别网卡。Live系统自带较新的内核如果它能看到物理接口并且能上网说明硬件没问题问题锁定在Ubuntu 20.04的老内核上。这一步非常关键等于把问题范围从A环节有问题缩小到这个特定内核有问题。第三步检查网卡在PCI总线层面是否被系统看到。这一步用的是lspci命令$ lspci | grep -i ethernet 05:00.0 Ethernet controller: Intel Corporation Device 15f3 (rev 03)注意看输出末尾如果是Intel Corporation Device 15f3这种带Device字样的显示而不是具体的型号名如I225-V这就说明内核的PCI ID数据库里没有这条硬件信息。再用lspci -nnk看看有没有加载驱动$ lspci -nnk | grep -A3 -i ethernet 05:00.0 Ethernet controller [0200]: Intel Corporation Device [8086:15f3] (rev 03) Subsystem: Intel Corporation Device [8086:0000] Kernel driver in use: (none)Kernel driver in use: (none)一行就是问题核心。PCI设备挂在总线上但没有任何驱动模块认领它结果就是系统知道这里有硬件却无法为它创建网络接口。到这一步问题从断网彻底变成了缺驱动——技术上完全确诊了。2. 隔着四年的硬件鸿沟新网卡和老内核之间发生了什么确诊之后下一个问题是为什么2025年的主流网卡Ubuntu 20.04的内核就是不认这里涉及Linux驱动模型和内核版本策略的基本原理搞懂这部分后面选修复路线时就不会瞎试。2.1 内核靠PCI ID认网卡新ID不在老驱动的名单里Linux内核里的网卡驱动比如Intel的igc、Realtek的r8169都维护着一张设备ID列表。驱动加载时内核会遍历PCI总线上的设备取出设备的Vendor ID和Device ID逐一匹配这张列表。匹配上了就调用驱动的probe函数初始化硬件并注册网络接口匹配不上驱动就假装没看见这个设备。这里的关键点在于内核源码里这张ID列表是跟内核版本走的。Ubuntu 20.04的初始内核是5.4虽然20.04.x点版本会提供HWEHardware Enablement内核但如果你装的是最早的20.04原始镜像或者安装时没选HWE内核那系统用的就是5.4。而像Intel I225-V/I226-V这种2.5G网卡需要igc驱动igc是在Linux 5.10才合入主线的Realtek RTL8125B虽然在5.9之后被r8169部分支持但5.4版本里的r8169根本不包含这个PCI ID。这就是典型的4年硬件鸿沟——硬件厂商按2025年的节奏发布产品内核社区按自己的节奏把支持代码合入主线老版本操作系统当然赶不上。有人可能会问那为什么很多文档里说5.4内核也能用某款网卡因为硬件厂商会在官网发布自己的驱动源码比如Realtek的r8125驱动可以手动编译安装到老内核上而不是必须升级内核。这就引出了后面三条修复路线各有适用场景。2.2 20.04用户最容易撞上的几款网卡我把近两年新机上最常见的网卡芯片跟内核支持的对应关系整理成了表格方便对号入座。网卡芯片常见品牌/主板主线内核支持情况5.4内核表现推荐修复路线Intel I225-V/I226-V华硕/微星/技嘉板载2.5GLinux 5.10起内置igc不识别换内核或安装Intel网卡驱动包Realtek RTL8125B/BG中低价位主板板载2.5GLinux 5.9起r8169部分支持不识别编译官方r8125驱动或换内核Realtek RTL8156USBUSB外接2.5G网卡Linux 5.15较稳定时好时坏换内核更省心Intel X550/X710服务器服务器板载/PCIe已有ixgbe但新固件需更新视具体型号优先更新firmwareMellanox/Aquantia 5G-10G高端主板部分需要atlantic等驱动大概率不识别查厂家驱动或换内核看这个表格能发现一个规律2025年还在卖的主板有线网卡芯片几乎集中在Intel和Realtek两家而且2.5G已经成了绝对主流。对于这两家芯片换内核基本能解决90%的问题因为主线内核的支持都非常成熟。2.3 还有一个前置矛盾没有网就没法apt install缺驱动的解法通常是用包管理器装驱动比如apt install linux-modules-extra。问题来了机器现在没有网络包管理器根本连不上软件源这成了没网所以装不了驱动装不了驱动所以没网的死循环。这是整篇文章里最让人抓狂的一步。我当时盯着终端里apt update的报错发呆了几分钟——Temporary failure resolving心想我装个系统还能被网卡将一军后来冷静下来盘了一下手头能用的设备和资源发现突破口其实不少。下一节我把当时实际验证过的几种无网络连接通道都列出来优先级从高到低。3. 在没有网络的前提下拉起一条生命线先明确一个概念这里说的没有网络指的是有线网卡没有驱动、物理接口不存在。但机器本身是可以上网的只要绕过那张不认的板载网卡就行。我在这次实操中试了两条路一条是手机USB网络共享另一条是从别的电脑下载离线包前者解决立刻能上网的问题后者解决要装的东西依赖关系复杂的问题。3.1 首推手机USB网络共享把手机变成有线网卡这个方法原理不复杂Android手机通过USB线连接电脑后在手机端开启USB网络共享USB Tethering手机会模拟出一个带网络功能的USB设备Linux内核里的rndis_host或cdc_ether模块能识别它并创建出一个usb0或enp0s20f0u2之类的接口。Ubuntu 20.04的5.4内核默认编译了这些模块所以不需要额外装驱动插上就能用。具体的操作顺序是这样的用USB线把手机和电脑连起来手机选择传输文件或仅充电模式都可以关键是别选仅充电且关闭USB调试之类会把USB数据通道断掉的方式。某些手机上USB网络共享要求开启USB调试才会虚拟出RNDIS网卡最好把开发者选项里的USB调试也打开。手机进入设置 → 网络与互联网 → 热点与网络共享打开USB网络共享开关。在Ubuntu终端里执行ip link show这时应该能看到一个新出现的接口名字通常是usb0或enp0s20f0u2。如果看不到执行dmesg | tail -20看看内核有没有报rndis_host相关的错误。确认接口存在后用DHCP获取地址sudo dhclient usb0如果桌面版Ubuntu装了NetworkManager插上手机后它一般会自动接管这个接口自动获取IP你甚至不需要敲命令。执行ip addr show usb0能看到inet 192.168.42.x之类的地址就说明联网成功ping 8.8.8.8验证一下。这个方案实测最可靠基本没有失败率。唯一的坑是某些手机默认禁用了RNDIS功能在手机上打开USB网络共享后电脑端可能出现cdc_ether已经加载但接口反复up/down的情况。这时候可以手动禁用再启用一下USB网络共享开关或者换一根数据线——别笑不少USB网卡识别问题真的是劣质数据线引起的数据线只有充电线路没有数据线路接口当然出不来。3.2 备选从另一台电脑下载离线包手机USB共享虽然解决了联网问题但有时候网络带宽不够或者要下载的包特别大、依赖特别多时直接从手机传输不稳定就需要走离线包路线。我当时要用到的是linux-image和linux-modules-extra加起来几百MB直接手机下载再传过去效率太低。具体做法是找另一台能正常上网的电脑Windows、macOS、Linux都行登录Ubuntu软件包网站或直接用apt download把需要的deb文件下下来然后用U盘或者手机传过去。如果另一台也是Linux连依赖关系都可以一起处理apt download linux-image-5.15.0-91-generic apt download linux-modules-5.15.0-91-generic apt download linux-modules-extra-5.15.0-91-generic这里有个非常重要、也是很多人容易犯的错Ubuntu把相当一部分网卡驱动放在linux-modules-extra-*包里而不在linux-image-*包里。只下载linux-image会导致内核换了、驱动照样缺失接口还是出不来。像igc、r8169这些驱动5.15内核里恰好就是放在modules-extra里的。所以离线换内核时linux-image、linux-modules、linux-modules-extra这三个包一个都不能少。如果是服务器版或最小化安装可能还要补linux-headers因为后面编译驱动或装NVIDIA闭源驱动时要用。下载好后U盘挂载后直接dpkg -i安装sudo dpkg -i linux-image-*.deb linux-modules-*.deb linux-headers-*.deb sudo update-grub sudo reboot3.3 老版本系统的稳网技巧先固定DNS联网通道拉起来之后我踩了一个小坑手机USB共享能ping 8.8.8.8内网IP但ping baidu.com报Temporary failure in name resolution这说明网络通了DNS解析没通。原因是USB共享的DNS配置是NetworkManager自动下发的如果中途接口重启过DNS可能丢。排查时可以先看/etc/resolv.conf如果里面没有可用的nameserver手动临时指定一个echo nameserver 223.5.5.5 | sudo tee /etc/resolv.conf223.5.5.5是国内公共DNS速度快、连通率高。如果之后升级到systemd-resolved管理的环境也可以直接用resolvectl dns usb0 223.5.5.5设置。这个动作本质上是在正式修复驱动之前先把网络通道弄得稳定一点省得后面下载包时反复折腾。4. 三条修复路线我实测的完整过程网络通道拉起来之后接下来的核心问题依然是如何让主板上那张物理网卡正常工作。我按工作量从小到大、风险从低到高的顺序把三条路线都试了一遍。直接给结论如果网卡芯片是Intel I225-V/I226-V或Realtek RTL8125B换内核是最省事、最稳的路。但另外两条路在某些场景下依然有用所以我还是全部记录包括每一步命令。4.1 路线一驱动其实在只是没加载有一种情况是内核里已经有对应驱动模块但因为种种原因没有自动加载。最容易发生的场景是装了某些精简版Ubuntu或者之前手动删过内核模块。诊断方法很简单sudo modprobe igc如果命令没有任何输出然后ip link show里出现了enp开头的接口那恭喜你驱动一直都在只是没加载。为了以后开机自动加载把它写进模块配置echo igc | sudo tee /etc/modules-load.d/igc.confmodprobe报错modprobe: FATAL: Module igc not found说明内核里压根没有这个模块直接跳到路线三。模块存在但没自动加载的情况在我见过的机器里很少更多是模块不存在或存在但PCI ID不匹配——后者在你的网卡驱动版本太旧时也会遇到表现为modprobe成功、dmesg也没有报错但接口出不来因为驱动里的ID表没有你这款网卡。4.2 路线二Realtek等厂商驱动的源码编译如果网卡是Realtek走厂商驱动的路线通常能很快搞定。Realtek官方提供r8125驱动源码包解压后直接编译安装。步骤看起来简单但有几个前置条件容易被忽略。首先编译需要gcc、make、linux-headers在断网状态下这些包不一定齐全。我已经通过手机USB共享把网络拉通了所以可以提前装好sudo apt update sudo apt install build-essential linux-headers-$(uname -r)源码解压后进入目录执行./autorun.sh它会自动完成make和insmod并在最后调用depmod -a。如果一切顺利ip link show就能看到eth0或enp5s0。这个驱动编译一次只针对当前内核版本生效一旦换内核模块就没了所以在编译之前或者编译完成之后最好装上DKMS让它在换内核时自动重编sudo apt install dkms sudo ./dkms-install.shRealtek源码包里自带dkms脚本路径和名称可能因版本而异以解压后的README为准。我当时实测的结论是r8125驱动能用但有个小毛病——ethtool查看网卡速率时经常只显示1000Mb/s而不是2500Mb/s这通常是线缆或者交换机协商问题不是驱动缺陷换了根六类线就好了。厂商源码驱动路线的适用边界很明显只适合Realtek这种提供官方Linux驱动的厂家。Intel的I225-V虽然也有非官方backport驱动但质量参差不齐不如换内核干净。4.3 路线三直接换内核一劳永逸最终推荐换内核是本篇的重点也是我最终采用的方案。核心思路很简单——把Ubuntu 20.04的5.4内核换成支持新硬件的更新内核比如5.15。为什么选5.15因为在Ubuntu 20.04的官方软件源里5.15就是focal-updates仓库里的HWE内核安装它不需要添加第三方源安全性和稳定性都有基本保障。Intel I225-V的igc驱动从5.10进mainlineRealtekr8125在5.9之后进入r8169所以5.15都能覆盖。在联网状态下手机USB共享保持开启直接sudo apt update sudo apt install --install-recommends linux-generic-hwe-20.04这个命令会安装HWE内核系列的最新版本。如果是离线环境就回到3.2节的方式手动下载deb包后用dpkg -i安装。安装完内核后sudo update-grub sudo reboot重启之后执行uname -r确认内核版本已经变成5.15.x再执行ip link show正常的物理网卡接口就会出现了。我的机器就是这一步直接解决接口名是enp5s0状态UPNetworkManager自动分配了IP断网点名道谢的问题从根上消失。换内核的副作用是需要重新安装NVIDIA闭源驱动等和内核版本强相关的内核模块这部分在下一章详讲。但单从网卡驱动力度来看换内核的覆盖面最广一台机器上同时存在NPU、WiFi网卡、蓝牙、雷电网卡等多种新硬件时一个5.15内核可能全给你解决了这是单独编译某一家网卡驱动做不到的。4.4 实操中容易栽跟头的几个细节换内核听着就是个apt install的事但我在实际执行时还是踩了几个坑单独列出来第一个坑是HWE内核包名。很多人一搜教程看到linux-generic-hwe-20.04就装了但在离线环境下dpkg -i提示依赖错误需要把linux-headers-generic-hwe-20.04、linux-image-generic-hwe-20.04一起下。实际上linux-generic-hwe-20.04是meta包它依赖并拉取真正的image/headers包在apt在线安装时没问题离线dpkg -i时必须把meta包依赖的全部包手动收集齐。第二个坑是/boot分区空间不足。有的机器装系统时/boot只分了500MB甚至更小5.4内核和5.15内核并存时/boot可能会被撑爆导致update-grub报错、新内核起不来。解决办法是装新内核前先清理旧内核或者把/boot分区分大一点。第三个坑和GRUB有关。如果机器是UEFI启动且开了Secure Boot新内核如果没有正确签名会被Secure Boot拦下来。Ubuntu官方仓库的HWE内核是签过名的一般情况下没问题但如果是手动从kernel.ubuntu.com下载的mainline内核在开启Secure Boot的机器上根本启动不了。出现这种情况时可以进BIOS临时关掉Secure Boot等系统启动后再决定是否重新开启。# 换内核后快速验证新内核是否引导成功 uname -r # 确认物理网卡接口 ip link show # 确认网卡驱动确实绑定了 lspci -nnk | grep -A3 -i ethernet这三条命令的输出一眼就能确认问题是否解决。5. 换内核成功之后顺手排掉几颗暗雷网卡问题解决后我本以为万事大吉结果紧接着就踩了几颗新雷。这些雷并不是换内核操作本身引入的bug而是新硬件装老系统这个组合必然要面对的后遗症不处理的话一样会让你觉得系统还是坏的。5.1 NVIDIA闭源驱动与内核版本强绑定NVIDIA闭源驱动不是独立的纯用户态程序它包含一个内核模块nvidia.ko这个模块必须针对具体内核版本编译。原来在5.4内核下用apt install nvidia-driver-470装的驱动换到5.15内核后模块路径对不上启动时NVIDIA驱动直接不加载图形界面可能退回llvmpipe软件渲染nvidia-smi报错找不到设备。解决办法是重装驱动在联网状态下执行sudo apt install nvidia-driver-535 sudo rebootUbuntu仓库里的NVIDIA驱动包已经配置好了DKMS安装时会自动为当前内核编译模块。如果你用的是NVIDIA官网的.run安装包换内核后必须重新运行.run文件重新安装。顺带一提2025年的新NVIDIA显卡在Ubuntu 20.04下用535系列驱动是能正常驱动的但不建议装太老版本的驱动新卡和老驱动之间兼容性很差。5.2 linux-firmware也要跟着更新换内核后网卡接口虽然出现了但我遇到一个奇怪的现象WiFi可以搜到信号但连接不上有线网卡接口能起来但dmesg里报firmware: failed to load。这其实是另一个经典问题新内核尝试加载新硬件对应的固件但系统的linux-firmware包还是老版本固件文件缺失。Ubuntu把固件单独放在linux-firmware包里这个包也需要同步升级sudo apt update sudo apt install --only-upgrade linux-firmware sudo rebootlinux-firmware包含的是各种硬件设备运行所需的固件文件和内核模块是分开的两套东西。网卡、WiFi卡、蓝牙、GPU都可能依赖它。如果你装的是纯离线系统也可以在下载内核包时顺便把新版linux-firmware也下载下来一起安装。5.3 接口出来了不代表能上网DHCP与网络管理器的坑换内核后物理接口enp5s0出现了但刚开始ip addr show enp5s0里没有IP地址只有state DOWN。这时候需要判断网络管理工具是否接管了接口。Ubuntu 20.04桌面版用NetworkManager服务器版用netplan systemd-networkd。最简单的处理方式是桌面版直接点右上角网络图标手动把有线网卡打开服务器版则检查netplan配置sudo nano /etc/netplan/01-network-manager-all.yamlnetplan配置文件里如果只有network: {version: 2, renderer: NetworkManager}这么一行说明网络由NetworkManager接管。在Ubuntu 20.04上换新内核后如果NM没有自动拉起接口可以试试nmcli device connect enp5s0如果NM显示设备未托管unmanaged用nmcli device set enp5s0 managed yes先改成托管状态再connect。这些命令在真实环境中十有八九会遇到一两个属于驱动就绪后的配置碎活。5.4 后来又断网的几种非驱动原因既然聊到断网顺便提一嘴另一个热门搜索词里反复出现的问题dns client events 1014 出现后便断网了。这个日志条目在Windows下常见原因通常是DNS客户端服务无法解析名称或者局域网内DNS服务器不可达跟Linux沾边的情况是系统能ping通IP但无法解析域名此时先把DNS换成公共DNS试试多数情况下立刻恢复。还有一类是换了交换机经常断网无论是Linux还是Windows都可能遇到。这跟驱动关系不大大多是交换机的EEE节能以太网或者流控协商出了问题。修复姿势也很简单在Linux下用ethtool关掉网卡的EEE节能sudo ethtool --set-eee enp5s0 eee off或者在交换机端关闭节能以太网模式。这个经验帮我修好了几台间歇性断网的机器虽然不是驱动问题但在新硬件配老系统的场景里非常常见顺手写在这里免得大家在驱动上瞎折腾半天。6. 救砖方法论复盘以后遇到类似问题怎么快速定位整个过程走完我把经验沉淀成了一套可以复用的排查方法。下次遇到装完系统没网这类问题不用再从零开始试按下面这几步走基本能在半小时内定位并解决。6.1 五步定位法先从日志和状态入手第一步确认物理网卡是否存在。lspci | grep -i ethernet没有输出的话要么是BIOS禁用要么是硬件故障先回BIOS查。第二步确认驱动是否绑定。lspci -nnk | grep -A3 -i ethernet看Kernel driver in use是不是(none)。如果是none问题锁定在驱动层面。第三步确认接口是否建立。ip link show如果接口不在继续走驱动/内核路线如果接口在但state DOWN重点查网线、交换机、对端设备。第四步确认接口是否有IP地址。ip addr show如果接口UP但没有inet地址查DHCP和网络管理器配置。第五步确认DNS解析是否正常。ping 8.8.8.8通但ping baidu.com不通查/etc/resolv.conf。这套方法的好处是每一步都有明确的命令和明确的判断标准不靠猜一次到位。6.2 三条路线的选择决策表诊断结果推荐路线理由modprobe能找到模块路线一配置模块自动加载改动最小一步到位Realtek网卡且驱动源码易得路线二编译厂商驱动无需换内核对老系统影响面最小多种新硬件并存/Intel新网卡路线三换HWE内核覆盖面广一次解决多个驱动问题机器有重要业务不敢重启先走路线二维持当前内核换内核必须重启风险高离线环境无法下deb手机USB共享联网后走路线三换内核只要一次联网下载实际项目中如果机器上没有必须死守5.4内核的软件我会推荐直接换HWE内核省心。如果有那就用厂商驱动软解或者外挂一张老型号网卡。很多工业软件对内核版本有硬性要求换内核前一定要先查软件兼容性清单。比如某些版本的PetaLinux在5.4下跑得好好的升到5.15就可能报错这种时候就宁可让板载网卡吃灰先插一张旧PCIe网卡顶上。6.3 下次装机提前做好这三件事这次救砖经历之后我给自己定了一套装老系统前的固定流程分享出来供参考。第一装系统前先用新版本Live CD启动一次确认硬件能被现代内核完整识别至少确认网卡、显卡、硬盘控制器没有问题再转头装老版本系统。第二如果是做工业开发必须用20.04时把linux-modules-extra、linux-firmware、新内核deb包提前下载好放到U盘里。装完系统第一件事不是配置界面而是先把这些包装上再开始折腾别的。别等断网了再临时找驱动。第三备好一个USB有线网卡或者一台能共享网络的手机。USB有线网卡其实是最稳的救砖工具——插上就能被老内核识别物理接口出现联网、装驱动、换内核一路畅通。很多用Linux做开发的朋友工具箱里都应该常备一个关键时刻能救命。回到文章开头的场景那台2025年的新机器现在跑着Ubuntu 20.04 5.15 HWE内核PetaLinux工具链编译正常Zynq-7000的交叉编译也很顺利有线网卡稳稳跑在2.5Gbps。但说句实在话如果当初装系统前就预料到要趟这一圈我会直接把软件源里的HWE内核提前准备好省下在BIOS、交换机、驱动、固件之间反复折腾的两天。这篇文章写给所有准备在新硬件上装老系统的朋友——旧系统的兼容性是省心的反面动手之前把网卡、内核、固件这三件事先想明白。