在过去的几天里,我一直在尝试(但没有成功)让我的 Realtek 以太网卡正常工作。我的无线连接没有任何问题:只有以太网连接不起作用。
我在 Dell Inspiron 上安装了 Ubuntu 16.10,并配有 RTL8101/2/6E PCI Express 卡。该卡使用了 r8169 驱动程序,该驱动程序似乎有缺陷且不可靠(如这里)。由于解决方案似乎是使用 r8168 驱动程序,我:
r8168-dkms
通过 apt-get安装软件包,r8169
将模块列入黑名单/etc/modprobe.d/
- 重新启动。
它不起作用,因为lsmod
仍然列出了正在使用的模块,并且lspci -v
仍然告诉我该卡正在使用 r8169 驱动程序和模块。
我最终设法将选项传递给 grub 的模块列入黑名单,方法是将其添加modprobe.blacklist=r8169
到/etc/default/grub
.
问题是r8168
模块加载正常(我在 中看到它lsmod
),但它与卡没有关联,因此它不会出现在ifconfig
(正如它所发生的那样)卢米在使 Linux 为给定设备(Realtek NIC)加载特定驱动程序)。
这是我的相关部分lshw -C network
:
*-network UNCLAIMED
description: Ethernet controller
product: RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller
vendor: Realtek Semiconductor Co., Ltd.
physical id: 0
bus info: pci@0000:01:00.0
version: 07
width: 64 bits
clock: 33MHz
capabilities: pm msi pciexpress msix vpd bus_master cap_list
configuration: latency=0
resources: ioport:3000(size=256) memory:b0600000-b0600fff memory:b0400000-b0403fff
我的设备:
> lspci -v -s 01:00
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller (rev 07)
Subsystem: Dell RTL8101/2/6E PCI Express Fast/Gigabit Ethernet controller
Flags: bus master, fast devsel, latency 0, IRQ 11
I/O ports at 3000 [size=256]
Memory at b0600000 (64-bit, non-prefetchable) [size=4K]
Memory at b0400000 (64-bit, prefetchable) [size=16K]
Capabilities: <access denied>
请注意,上面的输出中lspci
没有显示任何正在使用的驱动程序或内核模块。
最后,我尝试让我的网卡使用r8168
驱动程序(如本中所述回答),无济于事:
% sudo echo 10ec 8168 > /sys/bus/pci/drivers/r8168/new_id
/sys/bus/pci/drivers/r8168/new_id: File exists.
% sudo echo "0000:01:00.0" > /sys/bus/pci/drivers/r8168/bind
/sys/bus/pci/drivers/r8168/bind: File exists.
我缺少什么?还有其他方法告诉设备使用驱动程序吗?任何有关接下来要阅读的内容的链接、线索或指示都会有所帮助,并且非常感激。
答案1
您可以执行此操作,但显然要注意该驱动程序可能与您的设备不完全兼容!
它还涉及重新编译内核模块,所以如果您担心的话,那么我建议您小心。特别是大多数 NIC 需要加载定制的二进制固件 blob,这可能会破坏您的硬件 - 因此请注意,并做一些功课来找到兼容的固件 blob。
高兴继续吗?好的 :)
首先,您需要找到正在运行的内核的驱动程序源 - 我假设,当您使用 dkms 时,它已经在您系统的某个位置了。一旦你有了这个,找到注册的地方MODULE_DEVICE_TABLE
。例如,通过在线快速搜索,文件 r8169.c 中有以下部分:
static const struct pci_device_id rtl8169_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8129), 0, 0, RTL_CFG_0 },
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8136), 0, 0, RTL_CFG_2 },
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8161), 0, 0, RTL_CFG_1 },
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8167), 0, 0, RTL_CFG_0 },
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8168), 0, 0, RTL_CFG_1 },
{ PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8169), 0, 0, RTL_CFG_0 },
{ PCI_VENDOR_ID_DLINK, 0x4300,
PCI_VENDOR_ID_DLINK, 0x4b10, 0, 0, RTL_CFG_1 },
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4300), 0, 0, RTL_CFG_0 },
{ PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4302), 0, 0, RTL_CFG_0 },
{ PCI_DEVICE(PCI_VENDOR_ID_AT, 0xc107), 0, 0, RTL_CFG_0 },
{ PCI_DEVICE(0x16ec, 0x0116), 0, 0, RTL_CFG_0 },
{ PCI_VENDOR_ID_LINKSYS, 0x1032,
PCI_ANY_ID, 0x0024, 0, 0, RTL_CFG_0 },
{ 0x0001, 0x8168,
PCI_ANY_ID, 0x2410, 0, 0, RTL_CFG_2 },
{0,},
};
MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
因此,这是告诉内核如果找到具有任何列出的 PCI ID 的设备,则使用此驱动程序。您需要向该结构添加一行额外的行,其中包含您的 NIC 的 PCI 设备 ID,重新编译(希望只是使用 dkms)并重新启动。