web-dev-qa-db-ja.com

Ubuntu 16.10 Intel e1000eドライバーはコンパイルできません。エラー:「struct net_device」には「trans_start」という名前のメンバーがありません

Intelギガビットイーサネットコントローラーの組み込みe1000eドライバーはUbuntuで動作しません。これは既知の問題であり、既知の解決策があります。IntelWebサイトからドライバーをダウンロードし、コンパイルし、通常のカーネルモジュールに従ってカーネルモジュールをインストールしますインストール手順。

Intel e1000e-3.3.4ドライバーを https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-underからダウンロードしました-Linux-?product = 70831

解凍した後、makeを実行するとこのエラーが発生します。

cc1: error: code model kernel does not support PIC mode /bin/sh: 1: [:
-ge: unexpected operator
Makefile:181: *** *** Aborting the build. *** This driver is not supported on kernel versions older than 2.4.0.  Stop.

sourceforgeの誰か によると、Ubuntuのリポジトリ(Sudo apt remove gcc)からgccを削除し、ソースから再インストールする必要があります。もちろんbbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-primeもアンインストールされるため、それはできません。

PIEについてのこのページ へのリンクを見つけましたが、PIEを有効または無効にするための簡単なコピーと貼り付けの指示、またはこのネットワークドライバーモジュールをコンパイルするために必要なことは含まれていません。

Unix Stack Exchangeで、関連する場合と関連しない場合がある質問を見つけました。また、パッチを適用する必要があるものにパッチを適用するための明確な指示も含まれていません: https://unix.stackexchange.com/questions/320470/apply-kernel-patch-to-support-pic-mode

私のuname -a

Linux kerbol 4.8.0-27-generic #29-Ubuntu SMP Thu Oct 20 21:03:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

UPDATE 2016-12-02

Gcc-4.8、rmgcc/usr/binからインストールして、新しいシンボリックリンクを作成することをお勧めしました。頑固な私は、代わりにこれを行いました(これは、物事を行うのに推奨される「Ubuntu Way」だと思います):

Sudo apt install gcc-4.8
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
Sudo update-alternatives --config gcc

makeを再度実行すると、別のエラーが発生しました。進捗!

make -C /lib/modules/4.8.0-27-generic/build SUBDIRS=/home/amedee/e1000e-3.3.4/src modules
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic'
  CC [M]  /home/amedee/e1000e-3.3.4/src/netdev.o
gcc: error: unrecognized command line option ‘-fstack-protector-strong’
scripts/Makefile.build:289: recipe for target '/home/amedee/e1000e-3.3.4/src/netdev.o' failed
make[2]: *** [/home/amedee/e1000e-3.3.4/src/netdev.o] Error 1
Makefile:1489: recipe for target '_module_/home/amedee/e1000e-3.3.4/src' failed
make[1]: *** [_module_/home/amedee/e1000e-3.3.4/src] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'
Makefile:247: recipe for target 'default' failed
make: *** [default] Error 2

「gcc:error:unrecognized command line option ‘-fstack-protector-strong’」でGoogleを検索した場合、gcc-4.8ではなくgcc-4.9は必要ないことがわかります。だから私はやった:

Sudo apt install gcc-4.9
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
Sudo update-alternatives --config gcc

makeを再度実行すると、さらに別のエラーが発生しました。

make -C /lib/modules/4.8.0-27-generic/build SUBDIRS=/home/amedee/e1000e-3.3.4/src modules
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic'
  CC [M]  /home/amedee/e1000e-3.3.4/src/netdev.o
In file included from ./include/linux/kernel.h:13:0,
                 from ./include/linux/list.h:8,
                 from ./include/linux/module.h:9,
                 from /home/amedee/e1000e-3.3.4/src/netdev.c:24:
/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000e_dump’:
/home/amedee/e1000e-3.3.4/src/netdev.c:250:25: error: ‘struct net_device’ has no member named ‘trans_start’
    netdev->state, netdev->trans_start, netdev->last_rx);
                         ^
./include/linux/printk.h:283:34: note: in definition of macro ‘pr_info’
  printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
                                  ^
/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000_xmit_frame’:
/home/amedee/e1000e-3.3.4/src/netdev.c:6545:8: error: ‘struct net_device’ has no member named ‘trans_start’
  netdev->trans_start = jiffies;
        ^
scripts/Makefile.build:289: recipe for target '/home/amedee/e1000e-3.3.4/src/netdev.o' failed
make[2]: *** [/home/amedee/e1000e-3.3.4/src/netdev.o] Error 1
Makefile:1489: recipe for target '_module_/home/amedee/e1000e-3.3.4/src' failed
make[1]: *** [_module_/home/amedee/e1000e-3.3.4/src] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'
Makefile:247: recipe for target 'default' failed
make: *** [default] Error 2

4.7カーネルから変更されたものを見つけたと思うので、今では興味深いものになっています。 error: ‘struct net_device’ has no member named ‘trans_start’のグーグルで、行を変更する必要があると言われました6545

-netdev->trans_start = jiffies;
+netif_trans_update(netdev);

実際、これにより6545行目のエラーが削除されました。これにより、249〜250行目にエラーが残ります。これは現在のコードです:

pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
  netdev->state, netdev->trans_start, netdev->last_rx);

netdev->trans_startを他のものに置き換える必要があることは知っていますが、何がわからないのですか。 pr_infoの4番目のパラメーターとしてnetif_trans_update(netdev)を使用しても機能しません。

/home/amedee/e1000e-3.3.4/src/netdev.c: In function ‘e1000e_dump’:
/home/amedee/e1000e-3.3.4/src/netdev.c:249:3: error: invalid use of void expression
   pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
   ^

それでは、代わりに何を置く必要がありますか?

どうやらpr_infoはロギングの目的に使用されるので、コメントに249〜250行目を入れるとどうなるでしょうか?その結果、ドライバーは最終的にビルドします(イェーイ!)が、コードのコメントが間違っていると感じるのは、その機能がわからない場合です。特にカーネルドライバーコード。

コンパイルするドライバーを使用しても、実行した後もネットワークがありません

Sudo rmmod e1000e
Sudo modprobe e1000e

更新:デュアルブートシステムのソリューションは、Windowsを起動し、ネットワークカードのドライバー設定に移動し、電源管理に関連するすべてを無効にすることです。次に、Linuxをブートし、Linuxをリブートして(はい、2回!)、カーネルが提供するデフォルトのドライバーを使用します。

1

グーグルでnetif_trans_updateを実行すると、次のコードが得られます。

/* legacy drivers only, netdev_start_xmit() sets txq->trans_start */
 static inline void netif_trans_update(struct net_device *dev)
 {
         struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);

        if (txq->trans_start != jiffies)
                 txq->trans_start = jiffies;
 }

これは、trans_startをpr_infoに戻す良い方法は、置き換えることであることを示唆しています

netdev->trans_start

netdev_get_tx_queue(netdev,0)->trans_start.

しかし、あなたは正しい、これはログ関数であり、それを修正してもドライバーは修正されないでしょう。

1
Bill Reynolds
Sudo apt install gcc-4.9
Sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 50
Sudo update-alternatives --config gcc

e1000e-3.3.5.3.tar.gz と組み合わせて:

tar -xzvf e1000e-3.3.5.3.tar.gz
cd e1000e-3.3.5.3/src
Sudo make install
Sudo rmmod e1000e;Sudo modprobe e1000e

カーネル4.8.0-37-genericを使用して、Ubuntu 16.10に変更を加えることなく、完全にビルドおよびインストールします。

e1000eを永続的にするために/ etc/modulesに追加することを忘れないでください:

Sudo echo e1000e>>/etc/modules
0
rootw0rm

マザーボードに応じて、名前付きe1000e-3.3.5.3ソースを使用する場合、カーネルバージョン4.4。*または4.8。*を使用する場合、NVM CRCチェック機能を削除してnetdev.cソースコードを変更する必要があります。

0
brain