So lässt man die Realtek-Netzwerkkarte den R8168-Treiber verwenden

So lässt man die Realtek-Netzwerkkarte den R8168-Treiber verwenden

Ich habe in den letzten Tagen (erfolglos) versucht, meine Realtek-Ethernet-Karte zum Laufen zu bringen. Ich habe keine Probleme mit meiner drahtlosen Verbindung: Nur die Ethernet-Verbindung funktioniert nicht.

Ich habe Ubuntu 16.10 auf einem Dell Inspiron mit einer RTL8101/2/6E PCI Express-Karte. Die Karte verwendet den r8169-Treiber, der fehlerhaft und unzuverlässig zu sein scheint (wie inHier). Da die Lösung darin zu liegen scheint, den r8168-Treiber zu verwenden, gehe ich wie folgt vor:

  • das Paket r8168-dkmsüber apt-get installiert,
  • das r8169Modul auf die schwarze Liste gesetzt in/etc/modprobe.d/
  • neugestartet.

Es funktionierte nicht, da lsmoddas Modul immer noch als in Verwendung aufgeführt war und lspci -vmir weiterhin angezeigt wurde, dass die Karte den Treiber und das Modul r8169 verwendete.

Mir ist es endlich gelungen, das Modul, das die Option an Grub weitergibt, auf die schwarze Liste zu setzen, indem ich es modprobe.blacklist=r8169zur Standardbefehlszeile in hinzugefügt habe /etc/default/grub.

Das Problem ist, dass das r8168Modul einwandfrei geladen wird (ich sehe es in lsmod), aber es ist nicht mit der Karte verknüpft, sodass es nicht in angezeigt wird ifconfig(genau wie es passiert istLichtInSorgen Sie dafür, dass Linux für das jeweilige Gerät (Realtek NIC) einen spezifischen Treiber lädt.).

Dies ist der relevante Teil meines 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

Mein Gerät:

> 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>

Bitte beachten Sie, dass in der obigen Ausgabe lspciweder verwendete Treiber noch Kernelmodule angezeigt werden.

Schließlich habe ich versucht, meine Netzwerkkarte dazu zu bringen, den r8168Treiber zu verwenden (wie in diesemAntwort), umsonst:

% 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.

Was übersehe ich? Gibt es eine andere Möglichkeit, einem Gerät mitzuteilen, dass es einen Treiber verwenden soll? Alle Links, Hinweise oder Hinweise dazu, was als nächstes zu lesen ist, wären hilfreich und sehr willkommen.

Antwort1

Sie können dies tun, beachten Sie jedoch, dass der Treiber möglicherweise nicht vollständig mit Ihrem Gerät kompatibel ist!

Es ist auch eine Neukompilierung des Kernelmoduls erforderlich. Wenn Sie sich also darüber Sorgen machen, rate ich Ihnen zur Vorsicht. Insbesondere, da die meisten Netzwerkkarten das Laden eines maßgeschneiderten binären Firmware-Blobs erfordern, der Ihre Hardware beschädigen kann. Seien Sie also gewarnt und recherchieren Sie ein wenig, um einen kompatiblen Firmware-Blob zu finden.

Gerne weitermachen? Gut :)

Zuerst müssen Sie die Treiberquelle für Ihren laufenden Kernel finden. Ich gehe davon aus, dass diese bereits irgendwo auf Ihrem System vorhanden ist, da Sie dkms verwenden. Wenn Sie diese haben, suchen Sie den Ort, an dem sie MODULE_DEVICE_TABLEregistriert ist. Eine schnelle Online-Suche ergab beispielsweise, dass die Datei r8169.c diesen Abschnitt enthält:

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); 

Hier wird dem Kernel also mitgeteilt, dass dieser Treiber verwendet werden soll, wenn ein Gerät mit einer der aufgelisteten PCI-IDs gefunden wird. Sie müssen dieser Struktur eine zusätzliche Zeile hinzufügen, die die PCI-Geräte-ID Ihrer Netzwerkkarte enthält, neu kompilieren (hoffentlich nur mithilfe von dkms) und neu starten.

verwandte Informationen