Realtek nic에서 r8168 드라이버를 사용하는 방법

Realtek nic에서 r8168 드라이버를 사용하는 방법

저는 지난 며칠 동안 Realtek 이더넷 카드를 작동시키려고 (실패했습니다) 노력해 왔습니다. 무선 연결에는 문제가 없습니다. 이더넷 연결만 작동하지 않습니다.

RTL8101/2/6E PCI Express 카드와 함께 Dell Inspiron에 Ubuntu 16.10이 있습니다. 카드는 r8169 드라이버를 사용했는데, 이는 버그가 많고 신뢰할 수 없는 것 같습니다(예:여기). 해결책은 r8168 드라이버를 사용하는 것 같으므로 다음을 수행합니다.

  • r8168-dkmsapt-get을 통해 패키지를 설치했습니다 .
  • 모듈 을 블랙리스트 r8169에 올렸습니다./etc/modprobe.d/
  • 재부팅되었습니다.

lsmod여전히 모듈이 사용 중인 것으로 표시되어 작동하지 않았고 , lspci -v카드가 r8169 드라이버와 모듈을 사용하고 있다는 메시지가 계속 표시되었습니다.

modprobe.blacklist=r8169마침내 .NET의 기본 명령줄에 추가하여 grub에 옵션을 전달하는 모듈을 블랙리스트에 올렸습니다 /etc/default/grub.

문제는 r8168모듈이 잘 로드되지만( 에서 확인됨 lsmod) 카드와 연결되어 있지 않아 에서 표시되지 않는다는 것입니다 ifconfig.루미~에Linux가 특정 장치(Realtek NIC)에 대해 특정 드라이버를 로드하도록 합니다.).

이것은 my의 관련 부분입니다 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사용 중인 드라이버나 커널 모듈이 표시되지 않습니다.

마지막으로 드라이버를 사용하도록 NIC를 만들려고 했습니다 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

이렇게 할 수는 있지만 드라이버가 장치와 완전히 호환되지 않을 수 있다는 점에 유의하세요!

또한 커널 모듈을 다시 컴파일하는 작업도 포함되므로 걱정된다면 주의하는 것이 좋습니다. 특히 대부분의 NIC에는 하드웨어를 손상시킬 수 있는 맞춤형 바이너리 펌웨어 blob을 로드해야 하므로 주의하고 호환되는 펌웨어 blob을 찾으려면 약간의 숙제를 하십시오.

계속하시겠습니까? 좋은 :)

먼저, 실행 중인 커널에 대한 드라이버 소스를 찾아야 합니다. 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 ID 중 하나라도 있는 장치가 발견되면 이 드라이버를 사용하라고 커널에 지시하는 곳입니다. NIC의 PCI 장치 ID를 포함하는 추가 행을 이 구조체에 추가하고 다시 컴파일하고(dkms를 사용하여) 다시 시작해야 합니다.

관련 정보