ここ数日、Realtek イーサネット カードを動作させようと試みていますが、うまくいきません。ワイヤレス接続には問題はありません。イーサネット接続だけが動作しません。
私はDell InspironにUbuntu 16.10をインストールしており、RTL8101/2/6E PCI Expressカードを搭載しています。このカードはr8169ドライバを使用していましたが、どうやらバグが多く信頼性が低いようです(ここ) 解決策としては r8168 ドライバーを使うことのようなので、次の操作を行います。
r8168-dkms
apt-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 のみを使用) して再起動する必要があります。