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
r8169
Modul auf die schwarze Liste gesetzt in/etc/modprobe.d/
- neugestartet.
Es funktionierte nicht, da lsmod
das Modul immer noch als in Verwendung aufgeführt war und lspci -v
mir 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=r8169
zur Standardbefehlszeile in hinzugefügt habe /etc/default/grub
.
Das Problem ist, dass das r8168
Modul 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 lspci
weder verwendete Treiber noch Kernelmodule angezeigt werden.
Schließlich habe ich versucht, meine Netzwerkkarte dazu zu bringen, den r8168
Treiber 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_TABLE
registriert 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.