Не удалось собрать 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,

Другие вопросы по тегам