Не удалось собрать evdi с установкой драйверов displaylink
Поэтому я пытаюсь установить этот драйвер, чтобы включить displaylink. 12.04 Он предупредил, что мое ядро устарело, поэтому я установил ядро 3.14. Затем он прошел проверку ядра, но не смог собрать ядро evdi. Затем я обновил всю ОС до 14.04, а также ядро. Ошибка все еще показывает. Мой терминал выглядит так:
blaineatkins@ubuntu:~$ cd ~/Downloads
blaineatkins@ubuntu:~/Downloads$ sudo ./displaylink-driver-1.3.54.run
[sudo] password for blaineatkins:
Verifying archive integrity... All good.
Uncompressing DisplayLink Linux Driver 1.3.54 100%
DisplayLink Linux Software 1.3.54 install script called: install
Distribution discovered: Ubuntu 14.04.5 LTS
Installing
Configuring EVDI DKMS module
Registering EVDI kernel module with DKMS
Building EVDI kernel module with DKMS
ERROR (code 3): Failed to build evdi/1.3.54. Consult /var/lib/dkms/evdi/1.3.54/build/make.log for details..
blaineatkins@ubuntu:~/Downloads$
А вот содержимое журнала, в котором оно упоминается:
DKMS make.log for evdi-1.3.54 for kernel 3.14.0-031400-generic (x86_64)
Sat Jul 22 10:13:12 PHT 2017
make KBUILD_VERBOSE=1 SUBDIRS=/var/lib/dkms/evdi/1.3.54/build SRCROOT=/var/lib/dkms/evdi/1.3.54/build CONFIG_MODULE_SIG= -C /lib/modules/3.14.0-031400-generic/build modules
make[1]: Entering directory `/usr/src/linux-headers-3.14.0-031400-generic'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || ( \
echo >&2; \
echo >&2 " ERROR: Kernel configuration is invalid."; \
echo >&2 " include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 " Run 'make oldconfig && make prepare' on kernel src to fix it."; \
echo >&2 ; \
/bin/false)
mkdir -p /var/lib/dkms/evdi/1.3.54/build/.tmp_versions ; rm -f /var/lib/dkms/evdi/1.3.54/build/.tmp_versions/*
make -f scripts/Makefile.build obj=/var/lib/dkms/evdi/1.3.54/build
gcc -Wp,-MD,/var/lib/dkms/evdi/1.3.54/build/.evdi_drv.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/src/linux-headers-3.14.0-031400-generic/arch/x86/include -Iarch/x86/include/generated -Iinclude -I/usr/src/linux-headers-3.14.0-031400-generic/arch/x86/include/uapi -Iarch/x86/include/generated/uapi -I/usr/src/linux-headers-3.14.0-031400-generic/include/uapi -Iinclude/generated/uapi -include /usr/src/linux-headers-3.14.0-031400-generic/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m64 -mno-mmx -mno-sse -mpreferred-stack-boundary=3 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -Wframe-larger-than=1024 -fstack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO -Iinclude/drm -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(evdi_drv)" -D"KBUILD_MODNAME=KBUILD_STR(evdi)" -c -o /var/lib/dkms/evdi/1.3.54/build/.tmp_evdi_drv.o /var/lib/dkms/evdi/1.3.54/build/evdi_drv.c
if [ "-pg" = "-pg" ]; then if [ /var/lib/dkms/evdi/1.3.54/build/evdi_drv.o != "scripts/mod/empty.o" ]; then /usr/src/linux-headers-3.14.0-031400-generic/scripts/recordmcount "/var/lib/dkms/evdi/1.3.54/build/evdi_drv.o"; fi; fi;
gcc -Wp,-MD,/var/lib/dkms/evdi/1.3.54/build/.evdi_modeset.o.d -nostdinc -isystem /usr/lib/gcc/x86_64-linux-gnu/4.8/include -I/usr/src/linux-headers-3.14.0-031400-generic/arch/x86/include -Iarch/x86/include/generated -Iinclude -I/usr/src/linux-headers-3.14.0-031400-generic/arch/x86/include/uapi -Iarch/x86/include/generated/uapi -I/usr/src/linux-headers-3.14.0-031400-generic/include/uapi -Iinclude/generated/uapi -include /usr/src/linux-headers-3.14.0-031400-generic/include/linux/kconfig.h -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -O2 -m64 -mno-mmx -mno-sse -mpreferred-stack-boundary=3 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -DCONFIG_X86_X32_ABI -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -DCONFIG_AS_CFI_SECTIONS=1 -DCONFIG_AS_FXSAVEQ=1 -DCONFIG_AS_AVX=1 -DCONFIG_AS_AVX2=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -Wframe-larger-than=1024 -fstack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -pg -mfentry -DCC_USING_FENTRY -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO -Iinclude/drm -DMODULE -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(evdi_modeset)" -D"KBUILD_MODNAME=KBUILD_STR(evdi)" -c -o /var/lib/dkms/evdi/1.3.54/build/.tmp_evdi_modeset.o /var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c: In function ‘evdi_crtc_mode_set’:
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:67:10: error: ‘struct drm_crtc’ has no member named ‘primary’
if (crtc->primary == NULL) {
^
In file included from include/drm/drmP.h:45:0,
from /var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:14:
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:74:23: error: ‘struct drm_crtc’ has no member named ‘primary’
efb = to_evdi_fb(crtc->primary->fb);
^
include/linux/kernel.h:833:49: note: in definition of macro ‘container_of’
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
^
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:74:8: note: in expansion of macro ‘to_evdi_fb’
efb = to_evdi_fb(crtc->primary->fb);
^
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c: In function ‘evdi_sched_page_flip’:
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:136:11: error: ‘struct drm_crtc’ has no member named ‘primary’
fb = crtc->primary->fb;
^
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c: In function ‘evdi_crtc_page_flip’:
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:192:40: error: ‘struct drm_crtc’ has no member named ‘primary’
struct drm_framebuffer *old_fb = crtc->primary->fb;
^
/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.c:200:7: error: ‘struct drm_crtc’ has no member named ‘primary’
crtc->primary->fb = fb;
^
make[2]: *** [/var/lib/dkms/evdi/1.3.54/build/evdi_modeset.o] Error 1
make[1]: *** [_module_/var/lib/dkms/evdi/1.3.54/build] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.14.0-031400-generic'
make: *** [all] Error 2
1 ответ
Вы можете исправить это либо
- обновление с Ubuntu 14.04 LTS до Ubuntu 16.04 LTS или
- установка ядра от 16.04 LTS, которое было официально перенесено на 14.04 LTS.
Я проверил это с помощью графического программного обеспечения USB DisplayLink для Ubuntu (1.3.54) в виртуальных машинах VirtualBox, работающих под управлением 64-битных версий 14.04 LTS и 16.04 LTS.
Удалите (или хотя бы прекратите использовать) ядро, которое вы установили вручную.
В настоящее время вы используете ядро 3.14, которое вы установили в 12.04 перед обновлением до 14.04, потому что 14.04 LTS поставляется с ядром 3.13, и GRUB автоматически перечислит версию с наибольшим номером и загрузится с первой записанной в списке записью. Вы можете проверить это, запустив uname -r
, Обратите внимание на верхнюю строку в журнале сборки DisplayLink:
DKMS make.log for evdi-1.3.54 for kernel 3.14.0-031400-generic (x86_64)
Ошибки сборки, которые вы получаете, зависят от того, какое ядро вы установили. Я не могу воспроизвести их с официальным ядром Ubuntu.
Если вы установили его только для того, чтобы этот драйвер работал, то я рекомендую удалить его, прежде чем продолжить, хотя я не могу сказать вам, как это сделать, потому что я не знаю, как вы его установили. Хотя для DisplayLink требуется версия ядра 3.14 или выше, эта версия вам конкретно не нужна (и это не одна из версий, официально предоставленных для Ubuntu 14.04).
Я протестировал оба следующих параметра на виртуальных машинах и смог успешно построить и установить драйвер DisplayLink.
Вариант 1. Обновление до 16.04 LTS
Вы только что обновились с 12.04 LTS до 14.04 LTS. Если у вас нет особой причины, по которой вы хотите придерживаться версии 14.04, вам следует рассмотреть возможность обновления до 16.04. Это не только решит эту проблему, но и будет поддерживаться дольше, и для него официально упаковано другое более новое программное обеспечение.
Чтобы обновить, запустите:
do-release-upgrade
Опуская sudo
Это немного облегчает гарантию того, что вы случайно не обновитесь до неправильной версии. (Другой способ проверить /etc/update-manager/release-upgrades
имеет Prompt=lts
линия без ведущих #
характер.) Это должно сказать:
Checking for a new Ubuntu release
Get:1 Upgrade tool signature [836 B]
Get:2 Upgrade tool [1,265 kB]
Fetched 1,266 kB in 0s (0 B/s)
authenticate 'xenial.tar.gz' against 'xenial.tar.gz.gpg'
extracting 'xenial.tar.gz'
[sudo] password for blaineatkins:
То есть должен сказать xenial
как релиз, который будет обновлен до. Затем вы можете ввести свой пароль и выполнить обновление.
Вариант 2: Установите Backported 4.4 Ядро
Тем не менее, 14.04 поддерживается до апреля 2019 года, и нет никаких общих причин не использовать его. Кроме того, есть несколько причин, по которым вы можете придерживаться 14.04. В частности, если вы полагаетесь (или просто предпочитаете) Upstart, а не systemd, это может быть причиной для того, чтобы придерживаться 14.04 еще дольше.
Релизы Ubuntu LTS получают ядра, официально перенесенные из более поздних выпусков Ubuntu, для поддержки нового оборудования и драйверов - именно в той ситуации, в которой вы находитесь. Ядро 4.4 от Ubuntu 16.04 LTS официально перенесено в 14.04 LTS. Один из способов установить это просто запустить:
sudo apt install linux-generic-lts-xenial
Затем перезагрузите компьютер.
Это было все, что мне нужно было сделать, чтобы драйвер DisplayLink собирался и устанавливался без ошибок. Однако моя система 14.04 - это виртуальная машина без установленного графического интерфейса.
Если это настольная система (то есть вы используете графическую среду рабочего стола), тогда LTSEnablementStack рекомендует установить некоторые другие пакеты. Это может помочь вам избежать ситуации, когда вам придется устанавливать пакеты позже.
Вместо этого вы должны выполнить эту команду (и все равно перезагрузиться):
sudo apt install --install-recommends linux-generic-lts-xenial xserver-xorg-core-lts-xenial xserver-xorg-lts-xenial xserver-xorg-video-all-lts-xenial xserver-xorg-input-all-lts-xenial libwayland-egl1-mesa-lts-xenial
Я изменился apt-get
в apt
, который производит несколько более читабельный вывод. (14.04 имеет apt
; некоторые более ранние выпуски этого не делают.) --install-recommends
Флаг, вероятно, не нужен, так как это значение по умолчанию, и вы вряд ли изменили его, но это не принесет никакого вреда.
Установите драйвер
При официальном ядре Ubuntu (с достаточно большим номером версии) установка должна пройти успешно. Этот раздел предназначен в основном для других читателей, которые, возможно, не достигли того, что вы сделали при установке драйвера. Вы (и любой другой, кто знает, как сделать остальную часть установки драйвера) не должны следовать этой части самостоятельно.
Установить зависимости:
sudo apt update
sudo apt install build-essential linux-headers-generic dkms
После cd
в каталог, в который вы распаковали DisplayLink USB Graphics Software for Ubuntu 1.3.54.zip
файл, запустите установщик:
sudo ./displaylink-driver-1.3.54.run
Он должен создавать (хотя бы часть) драйвера за кулисами, и на некоторых компьютерах это может быть медленным, поэтому не беспокойтесь, если он не завершится немедленно.
Вы должны увидеть что-то вроде этого:
Verifying archive integrity... All good.
Uncompressing DisplayLink Linux Driver 1.3.54 100%
DisplayLink Linux Software 1.3.54 install script called: install
Distribution discovered: Ubuntu 16.04.2 LTS
Installing
Configuring EVDI DKMS module
Registering EVDI kernel module with DKMS
Building EVDI kernel module with DKMS
Installing EVDI kernel module to kernel tree
EVDI kernel module built successfully
Installing x64-ubuntu-1604/DisplayLinkManager
Installing libraries
Installing firmware packages
Installing license file
Adding udev rule for DisplayLink DL-3xxx/5xxx devices
Если вы видите что-то подобное и ошибок нет, значит установка прошла успешно. Я предлагаю перезагрузить компьютер, прежде чем пытаться использовать ваше устройство DisplayLink, хотя оно работает sudo modprobe evdi
похоже, что драйвер успешно загружается даже без промежуточной перезагрузки.
Поиск проблемы
Когда драйвер загружен в ядро, вывод lsmod | grep evdi
должно быть похоже на:
evdi 53248 0
drm_kms_helper 155648 2 evdi,vboxvideo
drm 364544 5 ttm,evdi,drm_kms_helper,vboxvideo
syscopyarea 16384 3 evdi,drm_kms_helper,vboxvideo
sysfillrect 16384 3 evdi,drm_kms_helper,vboxvideo
sysimgblt 16384 3 evdi,drm_kms_helper,vboxvideo
Если у вас нет подключенного устройства DisplayLink, модуль может не загружаться в ядро автоматически. Если он прикреплен, то он должен быть загружен. Ты можешь попробовать sudo modprobe evdi
, Для публикации нового вопроса о проблемах, которые возникают с этим драйвером после его установки, я рекомендую включить полный вывод lsmod
(т.е. без | grep evdi
) так же как uname -a
,