
简介这是一份适用于Linux系统的Realtek RTL8168B网卡驱动源码包版本8.013.00面向在Fedora 6等较旧发行版中因缺少该有线网卡驱动而无法联网的用户解决了PCI-E接口以太网控制器在Linux下的驱动安装与兼容性问题尤其适合服务器运维、嵌入式开发等需要手工管理内核模块的场景。包内共有11个文件整体仅58KB包含3个C源文件、3个头文件、2个Makefile其中一个针对Linux 2.4.x内核、README与下载说明文档完整呈现了构建内核模块所需的源码与配置结构。该资源已有2869人学习使用说明它在老版本Linux系统维护中仍具实用价值也值得作为内核模块学习的入门样例。借助下载说明和Makefile读者可以了解驱动从编译到加载的完整流程同时通过阅读源代码学习内核模块的编写与组织方式对于需要离线编译驱动的运维人员以及Linux内核学习者都是不错的参考资料。插上网卡没网Realtek网卡在Linux下的驱动折腾实录前段时间给一台老机器装Linux系统装完发现有线网卡不工作ip link里只有lo连eth0的影子都看不见。查了下硬件是Realtek RTL8111这大概是Linux桌面用户和服务器运维最常撞见的网卡之一。更麻烦的是如果你用的是RTL8125这种2.5G网卡装完系统能识别但跑不满速、频繁断流的情况也不少见。这篇文章把我这些年折腾Realtek网卡驱动有线无线的经验完整写出来包含判断方法、编译流程、黑名单切换、安全启动/initramfs等一连串问题适合刚装完Linux发现没网的新手也适合被2.5G网卡断流折磨的进阶用户参考。1. 先别急着下载驱动判断你的网卡到底缺不缺驱动很多人一遇到网卡不工作就奔着Realtek官网下驱动其实这是最浪费时间的做法。Linux下网卡不工作至少有一半情况不是缺驱动而是驱动没被加载、被内核里的另一个驱动抢先绑定或者固件文件缺失。先花两分钟做判断能省掉后面一堆编译报错的折腾。1.1 用lspci确认网卡的具体型号第一步永远是确认硬件型号别靠眼睛猜。在终端执行lspci -nn | grep -i realtek输出大致长这样03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)关键信息是方括号里的[10ec:8168]10ec是Realtek的PCI厂商ID8168是设备ID。这个设备ID决定了你该用哪套驱动方案。常见几个设备ID对应型号内核自带驱动备注8168RTL8111/8168/8411千兆r8169老型号通吃千兆没问题8125RTL8125 2.5Gr81692.5G能用但问题多建议官方r8168驱动8126RTL8126 5Gr8169新卡内核版本低了不行8188gu等USB无线RTL8188GUr8188eu部分内核大量USB无线网卡需要自行编译1.2 三步检查模块、dmesg、接口状态确认型号后按顺序执行三条命令# 1. 查看内核是否加载了对应驱动模块 lsmod | grep r8169 # 2. 查看内核日志里网卡相关的报错 dmesg | grep -i r8169 # 3. 查看所有网络接口含未启动的 ip link我之前遇到过一台机器lsmod显示r8169模块已加载dmesg里也没有报错但ip link就是没有有线网卡。最后排查发现是主板BIOS里把板载网卡禁用了一半进BIOS恢复默认设置就解决了。所以如果前三步都正常但网卡没出现先别怀疑驱动去翻BIOS设置。还有一种常见情况是dmesg里出现firmware: failed to load rtl_nic/rtl8168g-3.fw这说明网卡芯片需要单独的固件文件而系统里没有装linux-firmware包。Debian/Ubuntu系执行sudo apt install linux-firmwareFedora系执行sudo dnf install linux-firmware重启后大部分情况能解决。1.3 一条live CD先验证硬件没坏如果你怀疑是硬件本身的问题最直接的验证方式是用Ubuntu的Live USB启动系统。Live系统自带大量驱动如果Live系统里网卡正常工作那硬件肯定没问题问题出在你装的系统上。这个方法在排查新装系统没网时特别好用能快速把问题范围缩小到驱动没装上还是硬件坏了或BIOS问题。2. 有线网卡驱动安装r8169与官方r8168驱动的取舍确认是RTL8111/8168且内核模块确实没加载后就进入正式装驱动环节。这里有个很多教程没讲清楚的关键点内核自带的r8169驱动和Realtek官方发布的r8168驱动是两个不同的驱动名字就差一个数字但代码来源完全不同。2.1 先试内核自带r8169别急着编译对于RTL8111/8168千兆网卡现代内核4.15自带的r8169驱动其实已经非常成熟大多数情况下只要模块被加载就能正常工作。如果你遇到的是系统装完没网建议先尝试sudo modprobe r8169然后ip link看看接口是否出现。如果出现说明只是模块没自动加载。这个情况下编辑/etc/modules-load.d/r8169.conf写入r8169重启就能自动加载。千兆网卡我建议直接使用内核自带的r8169不要折腾官方驱动。原因有两个官方r8168驱动的源码编译依赖内核头文件每次内核升级都要重新编译麻烦。r8169驱动在主干内核里持续维护bug修复比官方驱动更及时。2.2 RTL8125 2.5G网卡r8169能识别但你可能想换掉但如果你用的是2.5G网卡RTL8125情况就不一样了。我从实际使用和大量论坛反馈来看r8169驱动对RTL8125的支持存在两个典型问题2.5G速率下协商不稳定有时会掉回千兆。高负载传输比如持续拷贝大文件时出现断流网卡直接消失又恢复。如果你的主板是这两年买的带2.5G网口的型号大概率就是RTL8125。先执行lspci -nn | grep -i realtek确认设备ID是8125然后考虑切换成Realtek官方发布的r8168驱动。2.3 官方r8168驱动编译流程RTL8125适用Realtek官方驱动的下载地址在官网的Communications Network IC目录下搜索RTL8125即可找到Linux驱动目前是r8168-8.xxx.tar.gz。编译流程如下# 1. 安装编译工具链和内核头文件Debian/Ubuntu sudo apt install build-essential linux-headers-$(uname -r) dkms # 2. 解压并进入目录 tar -xvf r8168-8.052.01.tar.bz2 cd r8168-8.052.01 # 3. 编译并安装 sudo make install # 4. 卸载r8169并将r8168加入黑名单 sudo modprobe -r r8169 echo blacklist r8169 | sudo tee /etc/modprobe.d/blacklist-r8169.conf # 5. 加载新驱动并确认 sudo modprobe r8168 ip link这里有个细节make install脚本本身已经会处理modprobe相关的操作但黑名单r8169这一步仍然需要手动做否则重启后r8169和r8168两个驱动会争抢设备导致随机性的接口命名混乱和断流。我遇到过几次重启后网卡接口名从enp3s0变成enp4s0的情况每次都是这个原因。编译过程中最常见的报错是找不到linux/version.h这通常是因为没装对应内核版本的headers包。Debian/Ubuntu下执行sudo apt install linux-headers-$(uname -r)即可装完重新执行make clean make。2.4 用dkms管理驱动避免内核升级后网卡消失直接用make install安装的驱动在内核升级后会失效因为模块是编译进旧内核的/lib/modules/$(uname -r)/目录下的。换个新内核后网卡又没了。这是我踩过最深的坑也是很多教程没写清楚的部分。解决方案是用DKMSDynamic Kernel Module Support。把官方驱动注册进DKMS后每次内核升级DKMS会自动为新内核重新编译并安装这个模块。注册步骤如下# 解压官方驱动后在源码目录下创建dkms.conf sudo vim /usr/src/r8168-8.052.01/dkms.conf内容参考PACKAGE_NAMEr8168 PACKAGE_VERSION8.052.01 BUILT_MODULE_NAME[0]r8168 DEST_MODULE_LOCATION[0]/kernel/drivers/net/ethernet/realtek AUTOINSTALLyes MAKE[0]make clean make KVER${kernelver}然后执行sudo cp -r r8168-8.052.01 /usr/src/ sudo dkms add -m r8168 -v 8.052.01 sudo dkms build -m r8168 -v 8.052.01 sudo dkms install -m r8168 -v 8.052.01之后每次升级内核DKMS都会自动干活省心很多。3. USB无线网卡RTL8188GU/RTL8188EU官方源码编译与常见坑相比有线网卡USB无线网卡才是真正的重灾区。尤其是一堆廉价USB WiFi网卡用的RTL8188GU、RTL8188EU芯片内核自带驱动的支持情况混乱经常要靠rtl8188fu、rtl8188eu这些第三方驱动项目才能驱动起来。3.1 确认芯片型号lsusb里看设备IDlsusb输出中找Realtek相关的行Bus 002 Device 003: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EU 802.11n0bda是Realtek的USB厂商ID后面的8179就是设备ID。不同的USB设备ID对应不同的芯片变体比如RTL8188GU通常是0bda:1f00。这个信息决定你该用哪个驱动源码。3.2 编译RTL8188GU驱动的完整流程目前社区维护比较活跃的是rtl8188gu驱动项目GitHub上有不少镜像。以RTL8188GU为例完整流程# 1. 安装编译依赖 sudo apt install git build-essential dkms linux-headers-$(uname -r) # 2. 克隆源码 git clone https://github.com/xxx/rtl8188gu cd rtl8188gu # 3. 直接make并安装 make sudo make install # 4. 加载模块 sudo modprobe 8188gu编译过程中有几个高频报错提前说下**报错1make[1]: *** 没有规则可以创建目标“modules”**基本就是内核头文件没装全。确认/lib/modules/$(uname -r)/build目录存在且非空。报错2unknown symbol或编译警告后insmod失败通常是源码版本和当前内核版本不兼容。RTL8188GU这个芯片比较特殊部分源码用的是老内核的API在5.15内核上会出现导出符号缺失。解决方式是找更新的源码分支或者打补丁。报错3USB网卡插上后不识别看dmesg | tail如果出现usb 2-1: reset high-speed USB device反复循环多半是供电不足。换个USB口尽量用主板背板的接口别用机箱前面板延长线能解决一半问题。3.3 解决USB无线网卡与NetworkManager的连接不上问题驱动加载成功后iwconfig能看到wlan0接口但NetworkManager可能一直显示未连接点扫描也扫不到任何WiFi。这种情况十有八九是NetworkManager默认不管理这个新接口或者rfkill把无线信号给禁用了。# 查看rfkill状态如果是blocked就解锁 rfkill list sudo rfkill unblock all # 让NetworkManager接管接口 nmcli device status nmcli device set wlan0 managed yes如果依然有问题检查是不是driver的电源管理导致USB网卡频繁休眠。写入echo options 8188gu rtw_power_mgnt0 | sudo tee /etc/modprobe.d/8188gu.conf这个参数的意思是关闭网卡的电源管理功能。USB无线网卡用着用着断流、要重新插拔才好的问题有相当高的比例是这个电源管理在作祟尤其在一些USB3.0接口转USB2.0设备时容易触发。4. 驱动装好重启又失效initramfs与Secure Boot的连环坑如果你装的是加密磁盘系统或者用LVM可能会有这样的经历驱动编译安装完modprobe加载也成功了网卡能正常用。但一重启网卡又消失了。这不是驱动没装上而是initramfs初始内存盘里没有包含这个驱动。4.1 把驱动打进initramfsDebian/Ubuntu系使用update-initramfsFedora系使用dracut。操作如下# Debian/Ubuntu sudo update-initramfs -u # Fedora/RHEL sudo dracut --force在加密磁盘LUKS的场景里系统要解密磁盘就需要网卡驱动比如网络解锁磁盘的场景所以initramfs里必须包含r8168或8188gu模块。即使不是加密磁盘/usr/lib/modules下的模块加载顺序和initramfs不一致也可能导致驱动加载失败所以装完官方驱动后执行一次update-initramfs -u应该成为固定动作。注意如果用的是dkms安装驱动dkms本身在安装新版内核时也会触发initramfs更新。但如果你手动用make install装的务必记得执行这一步。4.2 Secure Boot导致的模块签名问题现在新买的电脑基本默认开启UEFI Secure Boot。Secure Boot开启时内核只会加载经过签名的模块。你自己编译的驱动模块没有签名于是启动时直接被拒绝加载但modprobe手动加载通常不会报错如果不验证签名的话。判断方法# 查看Secure Boot状态 mokutil --sb-state如果输出是SecureBoot enabled而你编译的模块加载失败大概率是签名问题。两种解决思路思路1关闭Secure Boot。进BIOS/UEFI设置找到Security - Secure Boot设为Disabled。这个方法最简单但如果你依赖Windows 11的强制安全要求可能会犹豫。思路2给模块签名。用mokutil导入自签名证书每次编译驱动后用/usr/src/linux-headers-$(uname -r)/scripts/sign-file签名。流程不复杂但步骤较多# 1. 生成密钥对 openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj /CNMy Custom Module # 2. 导入MOK到UEFI sudo mokutil --import MOK.der # 这里会提示设置一个密码重启后进入蓝色MokManager界面确认导入 # 3. 签名内核模块 sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /path/to/r8168.ko考虑到便利性如果这台机器是个人服务器或工作机我通常会直接关掉Secure Boot。但如果虚拟机模板、无头服务器或者公司统一管控的机器还是用签名方案稳妥。5. 固件缺失与dmesg排查让驱动问题自我暴露驱动装上、模块加载了但网卡仍然不工作这时候需要看内核日志。这一节专门讲怎么从dmesg输出里快速定位问题以及最常见的固件缺失情况。5.1 dmesg里最值得关注的几类输出sudo dmesg | grep -Ei realtek|r8168|r8169|8188gu|firmware常见的输出和对应问题r8169 0000:03:00.0: firmware: failed to load rtl_nic/rtl8168g-3.fw (-2)固件文件缺失安装linux-firmware包。RTL8211B Gigabit PHYPHY芯片初始化正常物理层没问题。rtl8188gu: Unknown symbol模块编译时内核API不兼容需要换源码版本。Generic PHYPHY驱动没加载好但一般不影响使用。link down/link up反复横跳要么是网线/交换机问题要么是驱动电源管理参数问题可以试试ethtool。5.2 固件文件缺了手动放进去如果系统里确实缺固件文件而apt/dnf源里又没有对应包比如用了一个很老的内核配很新的网卡可以手动下载固件。Realtek网卡的固件路径通常是/lib/firmware/rtl_nic/文件名形如rtl8168g-3.fw、rtl8125a-3.fw。从Linux内核固件仓库linux-firmware的Git仓库拉取对应文件放到/lib/firmware/rtl_nic/目录执行sudo update-initramfs -u重启即可。5.3 网络管理工具和网卡失联的关联问题还有一种情况驱动和模块都正常ip link能看到接口但就是无法通过DHCP获取IP。排查过程中我发现有时是NetworkManager对有线网卡接口的配置有问题特别是从别的机器迁移过来的系统/etc/NetworkManager/system-connections/里可能有旧接口名的配置。nmcli device status nmcli networking off nmcli networking on如果还是不行检查/etc/network/interfacesDebian系是否写了auto eth0这种固定接口名的配置。现代系统里接口名是enp3s0这种Predictable Network Interface Names如果你以前的配置写死了eth0那肯定起不来。要么改配置要么在GRUB里加net.ifnames0恢复传统命名。我的一点经验收尾这篇文章写到最后把我自己的操作习惯也分享下。现在我在任何一台Linux机器上处理网卡问题都会按这个顺序来先lspci -nn确认型号再lsmod看模块然后dmesg看报错最后才决定要不要编译。这四步做完大概能解决80%的问题真正需要动手编译官方驱动的场景其实远没有想象中那么多。另外强烈建议无论你在哪台机器上编译过Realtek驱动都顺手把dkms配置做了。内核升级后网卡突然消失的体验试过一次就再也不想有第二次了。如果你现在就遇到了编译报错、断流或者固件缺失的问题把lspci -nn和dmesg | grep -i realtek的输出贴到搜索引擎里配合本文里的排查思路大概率能找到解决方案。本文还有配套的精品资源点击获取