Le pilote intégré e1000e pour un contrôleur Intel Gigabit Ethernet ne fonctionne pas sous Ubuntu. Il s'agit d'un problème connu avec une solution connue: téléchargez le pilote sur le site Web d'Intel, compilez-le et installez le module du noyau conformément au module du noyau habituel. instructions d'installation.
J'ai téléchargé le pilote Intel e1000e-3.3.4 à partir de https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCI-E-Gigabit-Network-Connections-under -Linux-? Product = 70831
Après avoir annulé la conversation, je reçois cette erreur lorsque je lance 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.
Selon quelqu'un sur sourceforge , je devrais retirer gcc
du référentiel d'Ubuntu (Sudo apt remove gcc
), et le réinstaller à partir de sa source. Cela ne peut évidemment pas être fait car cela désinstallerait également bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime
.
J'ai trouvé un lien vers cette page à propos de PIE , mais il ne contient pas d'instructions simples de copier-coller pour activer ou désactiver PIE, ou quoi que ce soit d'autre qui doit être fait pour compiler ce module de pilote réseau.
Sur Unix Stack Exchange, j’ai trouvé une question qui n’était peut-être pas liée, et elle ne contient pas non plus d'instructions claires pour corriger les problèmes à corriger: https://unix.stackexchange.com/questions/320470/apply-kernel-patch-to-support-pic-mode
Mon 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
On m'a conseillé d'installer gcc-4.8, rm
gcc
à partir de /usr/bin
et de créer un nouveau lien symbolique. Têtu comme je le suis, je l’ai fait à la place (ce qui, à mon avis, est la "méthode à suivre Ubuntu" recommandée):
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
Lorsque j'ai exécuté à nouveau make
, une autre erreur s'est produite. Le progrès!
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
Si vous recherchez Google "gcc: erreur: option de ligne de commande non reconnue" -fstack-protector-strong "", vous constaterez que vous n’avez pas besoin de gcc-4.8
mais de gcc-4.9
. Alors j'ai fait:
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
Quand j'ai de nouveau exécuté make
, j'ai encore une autre erreur:
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
Maintenant cela devient intéressant parce que je pense avoir trouvé quelque chose qui a changé à partir des noyaux 4.7. Googler pour error: ‘struct net_device’ has no member named ‘trans_start’
m'a dit que je devais changer de ligne 6545 :
-netdev->trans_start = jiffies;
+netif_trans_update(netdev);
En effet, cela a supprimé l'erreur à la ligne 6545. Cela me laisse toujours une erreur à la ligne 249-250. C'est le code actuel:
pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
netdev->state, netdev->trans_start, netdev->last_rx);
Je sais que je dois remplacer netdev->trans_start
par quelque chose d'autre, mais je ne sais pas quoi. Utiliser netif_trans_update(netdev)
comme 4ème paramètre de pr_info
ne fonctionnera pas car cela me donne
/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,
^
Alors, que dois-je y mettre à la place?
Apparemment pr_info
est utilisé à des fins de journalisation. Je me suis donc demandé si je mettais les lignes 249 à 250 dans les commentaires. Le résultat est que le pilote construit enfin (yay!) Mais il est inacceptable de commenter le code si vous ne savez pas quelle est sa fonction . Surtout le code du pilote du noyau.
Et même avec un pilote qui compile, je n'ai toujours pas de réseau après.
Sudo rmmod e1000e
Sudo modprobe e1000e
MISE À JOUR: La solution pour un système à double démarrage consiste à démarrer Windows, accéder aux paramètres de pilote de la carte réseau et désactiver tout ce qui concerne la gestion de l'alimentation. Ensuite, démarrez sous Linux, redémarrez sous Linux (oui, deux fois!) Et utilisez le pilote par défaut fourni par le noyau.
Googling netif_trans_update donne le code suivant:
/* 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;
}
ce qui suggère qu'un bon moyen de récupérer le trans_start dans pr_info serait de remplacer
netdev->trans_start
avec
netdev_get_tx_queue(netdev,0)->trans_start.
mais vous avez raison, il s’agit d’une fonction de journalisation, sa résolution ne réglera probablement pas votre pilote.
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
couplé avec 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
construit et installe parfaitement sans aucune modification sous Ubuntu 16.10 avec le noyau 4.8.0-37-generic
.
n'oubliez pas d'ajouter e1000e à/etc/modules pour le rendre permanent:
Sudo echo e1000e>>/etc/modules
Selon votre carte mère, lorsque vous utilisez la source nommée e1000e-3.3.5.3, vous devrez peut-être modifier le code source netdev.c lorsque vous utilisez la version 4.4. * Ou 4.8. * Du noyau en supprimant la fonction de contrôle CRC de NVM.