# 飞牛系统安装后板载 Realtek 网卡无法获取 IP 的排查与修复
## 飞牛系统吃灰很久没用,升级后Photos无法启动,垃圾系统,应用软件升级的兼容性都做不好,备份数据后重装最新的系统,板载网卡无IP我也是服了,临时使用 usb 网卡连上网,让 Codex 帮忙修复这个问题,给大家一个参考
## 问题现象
全新安装飞牛系统后,板载有线网卡无法获取 IP,路由器后台也看不到该设备。临时插入 USB 网卡后,系统可以正常联网。
系统中查看网卡状态:
ip -br link
ip -br addr
nmcli device status
异常表现类似:
enp1s0 DOWN <NO-CARRIER,BROADCAST,MULTICAST,UP>
enp1s0 unavailable
即使网口灯亮、网线插着,系统仍显示 NO-CARRIER。
## 环境信息
本次遇到的硬件和系统:
OS: 飞牛系统,Debian 12 bookworm 基础
Kernel: 6.18.18-trim
板载网卡: Realtek RTL8111/8168/8411
默认驱动: r8169
查看网卡型号:
lspci -nnk | grep -A3 -Ei 'Ethernet|Network'
问题网卡显示:
Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
Kernel driver in use: r8169
## 根因
这不是 DHCP 问题,而是 r8169 驱动与这块 Realtek 网卡/PHY 兼容性异常。
关键日志:
sudo dmesg -T | grep -Ei 'r8169|enp1s0|rtl|firmware|phy'
可以看到类似:
r8169 ... rtl_ocp_gphy_cond == 1
r8169_apply_firmware failed: -110
phy_poll_reset failed: -110
r8169 ... Link is Down
系统没有检测到物理链路,所以不会进入正常 DHCP 流程。
## 修复思路
用 Realtek 专用驱动 r8168 替代内核自带的 r8169。
建议先插 USB 网卡作为临时网络通道,避免操作过程中 SSH 断开。
安装依赖和驱动:
sudo apt-get update
sudo apt-get install -y r8168-dkms
如果你的内核较新,例如 6.18.18-trim,Debian 源里的 r8168-dkms 8.051.02 可能会编译失败。可查看日志:
sudo tail -n 200 /var/lib/dkms/r8168/8.051.02/build/make.log
本次失败点包括:
strlcpy implicit declaration
ethtool_eee / ethtool_keee 类型不兼容
del_timer_sync / from_timer / skb_gso_segment API 变化
## 兼容补丁
先备份源码:
sudo cp -a /usr/src/r8168-8.051.02/r8168_n.c \
/usr/src/r8168-8.051.02/r8168_n.c.bak
编辑 /usr/src/r8168-8.051.02/r8168_n.c。
在 #include <linux/completion.h> 后加入:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,18,0)
#include <linux/string.h>
#include <net/gso.h>
#ifndef strlcpy
#define strlcpy(dst, src, size) strscpy((dst), (src), (size))
#endif
#define del_timer_sync(timer) timer_delete_sync(timer)
#ifndef from_timer
#define from_timer(var, callback_timer, timer_fieldname) \
container_of((callback_timer), typeof(*(var)), timer_fieldname)
#endif
#endif
然后把 .get_eee 和 .set_eee 那段条件从:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)
改成:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0) && LINUX_VERSION_CODE < KERNEL_VERSION(6,18,0)
重新构建并安装 DKMS 模块:
sudo dkms build r8168/8.051.02 -k $(uname -r)
sudo dkms install r8168/8.051.02 -k $(uname -r)
sudo dpkg --configure r8168-dkms
sudo update-initramfs -u -k $(uname -r)
确认模块别名已经指向 r8168:
modprobe -R pci:v000010ECd00008168sv*sd*bc*sc*i*
应返回:
r8168
## 重启验证
重启:
sudo reboot
重启后检查:
lspci -nnk -s 01:00.0
ip -br addr
ethtool -i enp1s0
ethtool enp1s0
正常结果应类似:
Kernel driver in use: r8168
driver: r8168
Speed: 1000Mb/s
Duplex: Full
Link detected: yes
enp1s0 UP 192.168.x.x/24
也可以测试板载网口到路由器:
sudo ping -I enp1s0 -c 3 192.168.x.1
## 注意事项
- 操作前建议插 USB 网卡作为临时联网通道。
- 不要只看网口灯,系统里的 carrier 和 Link detected 更关键。
- 如果安装后仍用 r8169,检查 /etc/modprobe.d/r8168-dkms.conf 是否存在。
- 内核升级后,DKMS 需要为新内核重新编译 r8168,如果升级后网卡再次失效,优先检查:
sudo dkms status
## 最终结果
修复后板载网卡恢复正常:
驱动: r8168
链路: 1000Mb/s Full
状态: connected
DHCP: 正常获取 IPv4 地址
路由器后台: 可以看到板载网卡