Realtek NIC で r8168 ドライバーを使用する方法

Realtek NIC で r8168 ドライバーを使用する方法

ここ数日、Realtek イーサネット カードを動作させようと試みていますが、うまくいきません。ワイヤレス接続には問題はありません。イーサネット接続だけが動作しません。

私はDell InspironにUbuntu 16.10をインストールしており、RTL8101/2/6E PCI Expressカードを搭載しています。このカードは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使用中のドライバーやカーネル モジュールは表示されないことに注意してください。

最後に、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 では、ハードウェアを破損する可能性のある特注のバイナリ ファームウェア ブロブをロードする必要があるため、注意してください。互換性のあるファームウェア ブロブを見つけるために少し調べてください。

続けてもいいですか?いいですね :)

まず、実行中のカーネルのドライバー ソースを見つける必要があります。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 のみを使用) して再起動する必要があります。

関連情報