在過去的幾天裡,我一直在嘗試(但沒有成功)讓我的 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)並重新啟動。