Linux가 특정 장치(Realtek NIC)에 대해 특정 드라이버를 로드하도록 합니다.

Linux가 특정 장치(Realtek NIC)에 대해 특정 드라이버를 로드하도록 합니다.

이는 Linux 3.11(Mint 배포판이지만 중요하지 않다고 생각함)을 실행하는 구형 시스템(AMD K8, Nvidia 칩셋)에서 발생하는 드라이버 문제입니다.

claudius ~ # uname -a
Linux claudius 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
claudius ~ # lspci
00:00.0 Host bridge: NVIDIA Corporation nForce3 250Gb Host Bridge (rev a1)
00:01.0 ISA bridge: NVIDIA Corporation nForce3 250Gb LPC Bridge (rev a2)
00:01.1 SMBus: NVIDIA Corporation nForce 250Gb PCI System Management (rev a1)
00:02.0 USB controller: NVIDIA Corporation CK8S USB Controller (rev a1)
00:02.1 USB controller: NVIDIA Corporation CK8S USB Controller (rev a1)
00:02.2 USB controller: NVIDIA Corporation nForce3 EHCI USB 2.0 Controller (rev a2)
00:05.0 Bridge: NVIDIA Corporation CK8S Ethernet Controller (rev a2)
00:08.0 IDE interface: NVIDIA Corporation CK8S Parallel ATA Controller (v2.5) (rev a2)
00:0a.0 IDE interface: NVIDIA Corporation nForce3 Serial ATA Controller (rev a2)
00:0b.0 PCI bridge: NVIDIA Corporation nForce3 250Gb AGP Host to PCI Bridge (rev a2)
00:0e.0 PCI bridge: NVIDIA Corporation nForce3 250Gb PCI-to-PCI Bridge (rev a2)
00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] HyperTransport Technology Configuration
00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] Address Map
00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] K8 [Athlon64/Opteron] Miscellaneous Control
01:00.0 VGA compatible controller: NVIDIA Corporation NV34 [GeForce FX 5200] (rev a1)
02:05.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8169 PCI Gigabit Ethernet Controller (rev 10)

목록 끝에서 볼 수 있는 Realtek 8169 PCI 이더넷 카드용 대체 드라이버를 커널에 로드하고 싶습니다 02:05.0. 세부사항은 다음과 같습니다:

claudius ~ # lspci -s 02:05.0 -vv -nn
02:05.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8169 PCI Gigabit Ethernet Controller [10ec:8169] (rev 10)
    Subsystem: Realtek Semiconductor Co., Ltd. RTL8169/8110 Family PCI Gigabit Ethernet NIC [10ec:8169]
    Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx-
    Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Interrupt: pin A routed to IRQ 19
    Region 0: I/O ports at e800 [size=256]
    Region 1: Memory at febffc00 (32-bit, non-prefetchable) [size=256]
    Expansion ROM at febc0000 [disabled] [size=128K]
    Capabilities: [dc] Power Management version 2
        Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=375mA PME(D0-,D1+,D2+,D3hot+,D3cold+)
        Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-

문제는 단순히 r8169작동하지 않는다는 것입니다. Linux가 충돌할 수도 있습니다. 나는 그것을 블랙리스트에 올렸다 /etc/modprobe.d/.

해결책은 다음과 같습니다.r8168대신 드라이버를 사용하세요. (아직 하나 남았는데이 웹사이트에 대한 질문.) Realtek에서 소스 코드를 다운로드하여 컴파일하고 설치할 수 있는데, 제가 한 일입니다. 이렇게 하면 modprobe r8168로드는 잘 되지만 하드웨어와 연결되지 않으므로 카드가 ifconfig.

나는 이것이 modalias(하드웨어 정보 인코딩) 및 /lib/modules/*/modules.alias.

claudius ~ # cat /sys/devices/pci0000\:00/0000\:00\:0e.0/0000\:02\:05.0/modalias 
pci:v000010ECd00008169sv000010ECsd00008169bc02sc00i00

이것은 내 카드입니다. 다음은 시스템의 Realtek 드라이버 매핑입니다.

claudius ~ # grep r816 /lib/modules/3.11.0-12-generic/modules.alias
alias pci:v00001186d00004300sv00001186sd00004C00bc*sc*i* r8169
alias pci:v000010ECd00008169sv*sd*bc*sc*i* r8169
alias pci:v000010ECd00008167sv*sd*bc*sc*i* r8169
alias pci:v00001186d00004300sv00001186sd00004B10bc*sc*i* r8168
alias pci:v000010ECd00008168sv*sd*bc*sc*i* r8168

파일 끝에 다음 줄을 추가해 보았습니다(수동 편집을 수행하면 안 된다는 것을 알고 있음).

alias pci:v000010ECd00008169sv000010ECsd00008169bc02sc00i00 r8168

그런 다음 을 언로드했다가 다시 로드 r8168하지만 카드가 구성되지는 않습니다 dmesg.

내 네트워크 카드를 드라이버에 매핑하는 올바른 방법은 무엇입니까 r8168? 내 카드를 처리할 수 있다고 주장하려면 드라이버를 다시 빌드해야 합니까? 아니면 일부 구성 데이터를 추가해야 합니까?

답변1

바인딩을 사용하여 장치가 특정 장치를 사용하도록 강제할 수 있습니다. 장치를 이미 다른 드라이버가 소유하고 있는 경우 먼저 바인딩을 해제해야 합니다.

PCI 공급업체 ID( 10ecRealtek의 경우)와 장치 ID 조합이 인식되지 않으면 런타임에 다음 명령을 사용하여 식별할 수 있습니다.

# echo 10ec 8169 > /sys/bus/pci/drivers/r8169/new_id

예:

# lspci -s 04: -nnvvv
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8129 [10ec:8129] (rev 10)
        Subsystem: Coreco Inc RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) [11ec:8129]
        Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 3
        Region 0: I/O ports at c000 [size=256]
        Region 1: Memory at f7b40000 (32-bit, non-prefetchable) [size=256]
        [virtual] Expansion ROM at f7b00000 [disabled] [size=256K]
        Capabilities: [dc] Power Management version 1
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: pci-stub

# echo 0000:04:00.0 > /sys/bus/pci/drivers/pci-stub/unbind
# echo 0000:04:00.0 > /sys/bus/pci/drivers/r8169/bind
# lspci -s 04: -nnvvv
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8129 [10ec:8129] (rev 10)
        Subsystem: Coreco Inc RTL8111/8168 PCIe Gigabit Ethernet (misconfigured) [11ec:8129]
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV+ VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 32 (8000ns min, 8000ns max), Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 19
        Region 0: I/O ports at c000 [size=256]
        Region 1: Memory at f7b40000 (32-bit, non-prefetchable) [size=256]
        [virtual] Expansion ROM at f7b00000 [disabled] [size=256K]
        Capabilities: [dc] Power Management version 1
                Flags: PMEClk- DSI- D1- D2- AuxCurrent=55mA PME(D0-,D1-,D2-,D3hot-,D3cold+)
                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Kernel driver in use: r8169

답변2

나는 성공했다. (아래를 참조하세요.)

그렇지 않았더라면 그렇게 많은 시간을 낭비하지 않았을 텐데성급하게 결론을 내리다. Linux에서 할당한 RTL8169 PCI 네트워크 카드가 있습니다.커널 트리 r8169드라이버. 이 드라이버는 내 PCI ​​RTL8169에서 작동하지 않으며 시스템이 충돌할 수도 있습니다. 그런 다음 Hetzner 페이지(관련 링크 참조)를 발견하고 Realtek 사용에 대한 조언이 r8168내 상황에 적용될 것이라고 가정했습니다. (그렇지 않았습니다.) 운전자가 내 카드와 연결하지 않을 때 카드가 제대로 작동하려면 그렇게 할 수 있는 방법이 있어야 한다고 고집스럽게 생각했습니다. 그것은 막 다른 골목입니다.

해결책은 탐색하는 것입니다.리얼텍 웹사이트또 그 자체입니다. 또한 r8169Linux 커널의 제대로 작동하지 않는 드라이버와 같은 드라이버도 있습니다 . 나는 반년 전에 그것을 시도했다. 아마도 내 무능력 때문일 것입니다. 어쨌든, Realtek은 2014년 3월에 업데이트된 드라이버를 출시했고 실제로 작동합니다! 리얼텍 감사합니다!

행복한 결과는 다음과 같습니다( 사용 smbclient).

smb: \> get "Zwölf Uhr mittags.ts"
getting file \Zwölf Uhr mittags.ts of size 4703186788 as Zwölf Uhr mittags.ts
(47839,3 KiloBytes/sec) (average 47839,3 KiloBytes/sec)

smb: \> get "Die heiße Spur.ts"
getting file \Die heiße Spur.ts of size 6841251568 as Die heiße Spur.ts
(48516,1 KiloBytes/sec) (average 48516,1 KiloBytes/sec)

나는 100MB/s의 처리량을 달성하려고 하지 않습니다. WDC WD800AAJS-00B4A0 하드 드라이브의 속도는 약 95MB/s( dd if=/dev/zero of=test.out bs=8k count=200k)이지만 먼저 PCI 버스가 있습니다(PCIe가 아닙니다!).공유됨133MB/s 대역폭이 설정에 영향을 줄 수 있습니다(참조:기가비트 이더넷: 이봐, 내 대역폭은 어디 있지?) 둘째, CPU는 최고 주파수가 2200MHz인 2003년의 믿을 수 있는 오래된 AMD Athlon 64 3200+ 싱글 코어이며 내 경험에 따르면 비교적 보통 수준의 CPU는 x86/ 64 또는 ARM. 50MB/s이면 충분합니다.

관련 정보