Как использовать драйвер r8168 для сетевого адаптера Realtek

Вопрос или проблема

Я пытался (безуспешно) последние несколько дней заставить работать свою сетевую карту 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

  1. Убедитесь, что вы установили пакет r8168-dkms через apt-get. Выполните следующую команду в терминале:
    sudo apt-get update
    sudo apt-get install r8168-dkms

Шаг 2: Черный список драйвера r8169

  1. Вам необходимо добавить драйвер r8169 в черный список, чтобы система не загружала его во время загрузки. Создайте или отредактируйте файл черного списка:
    echo "blacklist r8169" | sudo tee /etc/modprobe.d/blacklist-r8169.conf

Шаг 3: Настройка загрузчика GRUB

  1. Если черный список драйвера не помогает, вы можете добавить параметр загрузки для GRUB. Откройте файл конфигурации:

    sudo nano /etc/default/grub

    Найдите строку, которая начинается с GRUB_CMDLINE_LINUX_DEFAULT, и добавьте modprobe.blacklist=r8169. Например:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash modprobe.blacklist=r8169"
  2. Сохраните изменения и закройте редактор. Затем обновите конфигурацию GRUB:

    sudo update-grub

Шаг 4: Перезагрузка и проверка

  1. Перезагрузите компьютер:

    sudo reboot
  2. После перезагрузки проверьте, загружается ли модуль r8168:

    lsmod | grep r8168

    Также проверьте, что r8169 не загружен:

    lsmod | grep r8169

Шаг 5: Привязка устройства к драйверу

  1. Если r8168 загружен, но устройство все еще не связано с драйвером, вам нужно будет сделать это вручную. Вы можете выполнить:

    echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/r8168/bind

    Замените 0000:01:00.0 на соответствующий адрес вашего устройства, если это необходимо.

Проверка состояния сети

  1. Проверьте, появилось ли ваше устройство в списке сетевых интерфейсов:
    ifconfig -a

Поиск дополнительных проблем

Если ваше устройство по-прежнему не распознается, выполните следующие команды для получения дополнительной информации:

  • Проверка состояния оборудования:

    lshw -C network
  • Проверка вывода lspci для вашего устройства:

    lspci -v -s 01:00

Заключение

Если все шаги выполнены успешно, ваш Realtek NIC должен использовать драйвер r8168, и Ethernet-подключение должно заработать. Если вы по-прежнему испытываете проблемы, возможно, стоит обратиться на форум поддержки вашего дистрибутива или в группу пользователей для дальнейшей диагностики.

Оцените материал
Добавить комментарий

Капча загружается...