Realtek 네트워크 카드에서 r8168 드라이버를 사용하는 방법

Realtek 네트워크 카드에서 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마침내 grub 에 옵션을 전달하는 모듈을 /etc/default/grub.

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

나에게 관련 부분은 다음과 같습니다 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

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

커널 모듈을 다시 컴파일하는 작업도 포함되므로 걱정된다면 주의하는 것이 좋습니다. 특히, 대부분의 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만 사용하기를 바랍니다)하고 재부팅해야 합니다.

관련 정보