O driver interno e1000e para um controlador Intel Gigabit Ethernet não funciona no Ubuntu, isso é um problema conhecido, com uma solução conhecida: baixe o driver do site da Intel, compile-o e instale o módulo do kernel conforme instruções de instalação do módulo kernel.
Eu baixei o driver Intel e1000e-3.3.4 de
Após a untarring, recebo este erro quando executo 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.
De acordo com alguém no sourceforge , eu devo remover gcc
do repositório do Ubuntu ( sudo apt remove gcc
) , e reinstalá-lo de sua fonte. Isso, é claro, não pode ser feito, porque isso também desinstala o bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime
.
Encontrei um link para esta página sobre o PIE , mas ele não contém instruções simples de copiar e colar para ativar ou desativar TORTA, ou o que diabos precisa ser feito para obter este módulo de driver de rede compilado.
No Unix Stack Exchange, encontrei uma pergunta que pode ou não estar relacionada, e também não contém instruções claras para corrigir o que precisa ser corrigido: link
Meu 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
ATUALIZAÇÃO 2016-12-02
Fui aconselhado a instalar o gcc-4.8, rm
gcc
de /usr/bin
e fazer um novo symlink. Teimoso como eu sou, eu fiz isso em vez disso (que eu acredito que é o "Modo Ubuntu" recomendado de fazer as coisas):
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
Quando eu executei make
novamente, recebi outro erro. Progresso!
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
Se você usar o Google para "gcc: erro: opção de linha de comando não reconhecida '-fstack-protector-strong'", você descobrirá que não precisa de gcc-4.8
mas gcc-4.9
. Então eu fiz:
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
Quando eu executei make
novamente, recebi outro erro:
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
Agora está ficando interessante porque acho que encontrei algo que mudou a partir dos kernels 4.7.
Pesquisando por error: ‘struct net_device’ has no member named ‘trans_start’
me disse que eu tinha que mudar de linha 6545 :
-netdev->trans_start = jiffies;
+netif_trans_update(netdev);
Na verdade, isso removeu o erro na linha 6545. Isso ainda me deixa com um erro na linha 249-250. Este é o código atual:
pr_info("%-15s %016lX %016lX %016lX\n", netdev->name,
netdev->state, netdev->trans_start, netdev->last_rx);
Eu sei que preciso substituir netdev->trans_start
por outra coisa, mas não sei o quê. Usar netif_trans_update(netdev)
como o quarto parâmetro de pr_info
não funcionará porque isso me dá
/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,
^
Então, o que preciso colocar lá?
Aparentemente pr_info
é usado para fins de registro, então pensei, e se eu colocar as linhas 249-250 nos comentários? O resultado foi que o driver finalmente constrói (yay!), Mas parece errado comentar o código se você não sabe qual é sua função . Especialmente o código do driver do kernel.
E mesmo com um driver que compila, ainda não tenho rede depois de fazer
sudo rmmod e1000e
sudo modprobe e1000e
ATUALIZAÇÃO: A solução para um sistema de inicialização dupla é inicializar no Windows, ir para as configurações do driver da placa de rede e desativar tudo relacionado ao gerenciamento de energia. Em seguida, inicialize no Linux, reinicialize no Linux (sim, duas vezes!) E use o driver padrão fornecido pelo kernel.