Я пытаюсь (безуспешно) последние несколько дней заставить работать свою сетевую карту Realtek. У меня нет проблем с беспроводным соединением: не работает только сетевое соединение.
У меня Ubuntu 16.10 на Dell Inspiron с картой 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)).
Это соответствующая часть моего 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
Вы можете это сделать, но имейте в виду, что драйвер может быть не полностью совместим с вашим устройством!
Это также включает в себя перекомпиляцию модуля ядра, так что если это вас беспокоит, то я бы посоветовал быть осторожнее. Тем более, что большинство сетевых карт требуют загрузки специального бинарного блоба прошивки, который может сломать ваше оборудование - так что, пожалуйста, будьте осторожны и сделайте небольшую домашнюю работу, чтобы найти совместимый блоб прошивки.
Рады продолжить? Хорошо :)
Во-первых, вам нужно найти исходный код драйвера для вашего работающего ядра - я предполагаю, что, поскольку вы используете 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 будет найдено, то использовать этот драйвер. Вам нужно будет добавить дополнительную строку в эту структуру, содержащую идентификатор устройства PCI вашего сетевого адаптера, перекомпилировать (надеюсь, просто используя dkms) и перезапустить.