Встроенный e1000e драйвер для контроллера Intel Gigabit Ethernet не работает в Ubuntu, это - известная проблема с известным решением: загрузите драйвер с веб-сайта Intel, скомпилируйте его и установите модуль ядра как обычно инструкции по установке модуля ядра.
Я загрузил драйвер 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, я должен удалить gcc
из репозитория Ubuntu (sudo apt remove gcc
), и переустановите его от, он - источник. Это, конечно, не может быть сделано, потому что это также удалило бы bbswitch-dkms build-essential dkms g++ gcc libcuda1-367 nvidia-367 nvidia-opencl-icd-367 nvidia-prime
.
Я нашел ссылку на эту страницу о КРУГЕ, но это не содержит простые copy&paste инструкции включить или отключить КРУГ, или независимо от того, что ад должен быть сделан, чтобы скомпилировать этот модуль сетевого драйвера.
На Exchange Стопки Unix я нашел вопрос, который может или не может быть связан, и он также не содержит четкие указания исправить безотносительно потребностей, которые будут исправлены: 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
ОБНОВЛЕНИЕ 02.12.2016
Мне рекомендовали установить gcc-4.8, rm
gcc
от /usr/bin
и сделайте новую символьную ссылку. Упрямый, как я, я сделал это вместо этого (которому я верю, рекомендуемая "Ubuntu Способ" выполнения вещей):
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
Если Вы Google для "gcc: ошибка: нераспознанный параметр командной строки ‘-fstack-protector-strong’", затем Вы найдете, что Вам не нужно 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 ядер. Поиск с помощью Google для 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
с чем-то еще, но я не знаю что. Используя netif_trans_update(netdev)
как 4-й параметр pr_info
не будет работать, потому что это дает мне
/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 в комментарии? Результат состоял в том, что драйвер наконец создает (yay!), но чувствует себя неправильным закомментировать код, если Вы не знаете то, что это - функция. Код особенно драйвера ядра.
И даже с драйвером, который компилирует, у меня все еще нет сети после того, как я делаю
sudo rmmod e1000e
sudo modprobe e1000e
ОБНОВЛЕНИЕ: решение для системы двойной загрузки состоит в том, чтобы загрузиться в Windows, перейдите к настройкам драйвера сетевой платы и отключите все связанное с управлением питанием. Затем начальная загрузка в Linux, перезагрузка в Linux (да, дважды!) и использование драйвер по умолчанию, обеспеченный ядром.
Поиск с помощью Google 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.
, но Вы правы, это - функция журнала, устранение его, вероятно, не починит Ваш драйвер.
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
сборки и установки, превосходные без модификаций на Ubuntu 16.10 с ядром 4.8.0-37-generic
.
не забывают добавлять e1000e к/etc/modules для создания этого постоянным:
sudo echo e1000e>>/etc/modules
В зависимости от Вашей материнской платы при использовании именованного e1000e-3.3.5.3 источника Вы, возможно, должны изменить netdev.c исходный код при использовании версии 4.4 ядер.* или 4.8.* путем удаления CRC NVM проверяют функцию.