이는 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( 10ec
Realtek의 경우)와 장치 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
내 상황에 적용될 것이라고 가정했습니다. (그렇지 않았습니다.) 운전자가 내 카드와 연결하지 않을 때 카드가 제대로 작동하려면 그렇게 할 수 있는 방법이 있어야 한다고 고집스럽게 생각했습니다. 그것은 막 다른 골목입니다.
해결책은 탐색하는 것입니다.리얼텍 웹사이트또 그 자체입니다. 또한 r8169
Linux 커널의 제대로 작동하지 않는 드라이버와 같은 드라이버도 있습니다 . 나는 반년 전에 그것을 시도했다. 아마도 내 무능력 때문일 것입니다. 어쨌든, 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이면 충분합니다.