Вопрос или проблема
Я пытался (безуспешно) последние несколько дней заставить работать свою сетевую карту Realtek. У меня нет проблем с беспроводным соединением: только Ethernet-соединение не работает.
У меня установлена Ubuntu 16.10 на Dell Inspiron с PCI Express картой RTL8101/2/6E. Карта использовала драйвер r8169, который, похоже, имеет ошибки и ненадежен (как указано здесь). Поскольку решение, похоже, заключается в использовании драйвера r8168, я:
- установил пакет
r8168-dkms
через apt-get, - добавил модуль
r8169
в черный список в/etc/modprobe.d/
- перезагрузил систему.
Это не сработало, так как lsmod
все еще показывал, что модуль используется, а lspci -v
все равно говорил мне, что карта использует драйвер и модуль r8169.
Наконец, мне удалось добавить модуль в черный список, передав опцию в grub, добавив modprobe.blacklist=r8169
в стандартную командную строку в /etc/default/grub
.
Проблема в том, что модуль r8168
загружается нормально (я вижу его в lsmod
), но он не ассоциирован с картой, поэтому не отображается в ifconfig
(ровно как это произошло с lumi в сделайте так, чтобы Linux загружал конкретный драйвер для заданного устройства (Realtek NIC)).
Вот соответствующая часть моего lshw -C network
:
*-network НЕЗАЯВЛЕН
описание: Ethernet-контроллер
продукт: RTL8101/2/6E PCI Express Fast/Gigabit Ethernet контроллер
производитель: Realtek Semiconductor Co., Ltd.
физический id: 0
информация о шине: pci@0000:01:00.0
версия: 07
ширина: 64 бита
тактовая частота: 33MHz
возможности: pm msi pciexpress msix vpd bus_master cap_list
конфигурация: задержка=0
ресурсы: ioport:3000(размер=256) память:b0600000-b0600fff память:b0400000-b0403fff
Мое устройство:
> lspci -v -s 01:00
01:00.0 Ethernet-контроллер: Realtek Semiconductor Co., Ltd. RTL8101/2/6E PCI Express Fast/Gigabit Ethernet контроллер (rev 07)
Субсистема: Dell RTL8101/2/6E PCI Express Fast/Gigabit Ethernet контроллер
Флаги: master шины, быстрый devsel, задержка 0, IRQ 11
I/O порты на 3000 [размер=256]
Память на b0600000 (64-бит, не предвыборочная) [размер=4K]
Память на b0400000 (64-бит, предвыборочная) [размер=16K]
Возможности: <доступ запрещен>
Обратите внимание, что в выводе выше lspci
не показывает никаких драйверов или модулей ядра, которые используются.
Наконец, я пытался заставить свою сетевую карточку использовать драйвер r8168
(как объяснено в ответе), но безуспешно:
% sudo echo 10ec 8168 > /sys/bus/pci/drivers/r8168/new_id
/sys/bus/pci/drivers/r8168/new_id: Файл существует.
% sudo echo "0000:01:00.0" > /sys/bus/pci/drivers/r8168/bind
/sys/bus/pci/drivers/r8168/bind: Файл существует.
Что я пропускаю? Есть ли другой способ указать устройству использовать драйвер? Будут полезны любые ссылки, подсказки или указания о том, что читать дальше.
Вы можете это сделать, но, конечно, имейте в виду, что драйвер может быть не полностью совместим с вашим устройством!
Это также включает в себя перекомпиляцию модуля ядра, так что если это вас беспокоит, то я бы посоветовал быть осторожным. Особенно, поскольку большинству сетевых карт требуется загрузка специализированного двоичного программного обеспечения, что может повредить ваше оборудование – поэтому, пожалуйста, будьте осторожны и немного поработайте, чтобы найти совместимое программное обеспечение.
Готовы продолжить? Хорошо 🙂
Сначала вам нужно будет найти исходный код драйвера для вашего работающего ядра – я предполагаю, раз вы используете 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-id вашего сетевого интерфейса, перекомпилировать (надеюсь, просто с использованием dkms) и перезагрузить.
Ответ или решение
Убедитесь, что ваша сетевая карта Realtek использует драйвер r8168 вместо r8169, может потребовать нескольких шагов. Давайте пройдемся по процессу, чтобы помочь вам решить вашу проблему.
Шаг 1: Установка драйвера r8168
- Убедитесь, что вы установили пакет
r8168-dkms
черезapt-get
. Выполните следующую команду в терминале:sudo apt-get update sudo apt-get install r8168-dkms
Шаг 2: Черный список драйвера r8169
- Вам необходимо добавить драйвер r8169 в черный список, чтобы система не загружала его во время загрузки. Создайте или отредактируйте файл черного списка:
echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf
Шаг 3: Настройка загрузчика GRUB
-
Если черный список драйвера не помогает, вы можете добавить параметр загрузки для GRUB. Откройте файл конфигурации:
sudo nano /etc/default/grub
Найдите строку, которая начинается с
GRUB_CMDLINE_LINUX_DEFAULT
, и добавьтеmodprobe.blacklist=r8169
. Например:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash modprobe.blacklist=r8169"
-
Сохраните изменения и закройте редактор. Затем обновите конфигурацию GRUB:
sudo update-grub
Шаг 4: Перезагрузка и проверка
-
Перезагрузите компьютер:
sudo reboot
-
После перезагрузки проверьте, загружается ли модуль r8168:
lsmod | grep r8168
Также проверьте, что r8169 не загружен:
lsmod | grep r8169
Шаг 5: Привязка устройства к драйверу
-
Если r8168 загружен, но устройство все еще не связано с драйвером, вам нужно будет сделать это вручную. Вы можете выполнить:
echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/r8168/bind
Замените
0000:01:00.0
на соответствующий адрес вашего устройства, если это необходимо.
Проверка состояния сети
- Проверьте, появилось ли ваше устройство в списке сетевых интерфейсов:
ifconfig -a
Поиск дополнительных проблем
Если ваше устройство по-прежнему не распознается, выполните следующие команды для получения дополнительной информации:
-
Проверка состояния оборудования:
lshw -C network
-
Проверка вывода lspci для вашего устройства:
lspci -v -s 01:00
Заключение
Если все шаги выполнены успешно, ваш Realtek NIC должен использовать драйвер r8168, и Ethernet-подключение должно заработать. Если вы по-прежнему испытываете проблемы, возможно, стоит обратиться на форум поддержки вашего дистрибутива или в группу пользователей для дальнейшей диагностики.