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私の状況に適用されると仮定しました。 (そうではありませんでした。)ドライバーが自分のカードに接続していないときにカードが正常に機能するには、そうする方法が必要です。それはちょっとした路地です。

解決策はナビゲーションです。Realtek Webサイトまたそれ自体です。また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ではありません!)。共有133 MB / sの帯域幅が設定に影響を与える可能性があります(参照:ギガビットイーサネット:ねえ、私の帯域幅はどこですか?)第二に、CPUは最高周波数2200MHzの2003年の信頼できる古いAMD Athlon 64 3200+シングルコアであり、私の経験によると、比較的普通のレベルのCPUはx86/ 64またはARMです。 50MB/sで十分です。

関連情報