web-dev-qa-db-ja.com

displaylinkドライバーをインストールするevdiのビルドに失敗しました

だから私は このドライバー をインストールしてdisplaylinkを有効にしようとしています。 12.04に、カーネルが古くなっていると警告されたため、3.14カーネルをインストールしました。その後、カーネルチェックに合格しましたが、evdiカーネルの構築に失敗しました。次に、OS全体とカーネルを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
Blaine

これは次のいずれかで修正できます

  • ubuntu 14.04 LTSからUbuntu 16.04 LTSへのアップグレードまたは
  • 公式に14.04 LTSにバックポートされた16.04 LTSからカーネルをインストールします。

これを buntu用DisplayLink USBグラフィックソフトウェア(1.3.54) でテストしました。14.04LTSおよび16.04 LTSの64ビットバージョンを実行しているVirtualBox仮想マシンで。

手動でインストールしたカーネルをアンインストールします(または少なくとも使用を停止します)。

14.04にアップグレードする前に、12.04でインストールした3.14カーネルを現在実行しています。14.04LTSには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-upgradesPrompt=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:バックポート4.4カーネルをインストールする

ただし、 14.04は2019年4月までサポートされます で、使用しない一般的な理由はありません。さらに、14.04を使い続けることをお勧めするさまざまな理由があります。特に、 systemdではなくUpstart に依存している(または単に好んでいる)場合、それが14.04を長く続ける理由かもしれません。

UbuntuのLTSリリースは、新しいハードウェアとドライバーをサポートするために、新しいUbuntuリリースから公式にバックポートされたカーネルを取得します-まさにあなたがいる状況 Ubuntu 16.04 LTSの4.4カーネルは、公式に14.04 LTSにバックポートされています。インストールする1つの方法は、単に実行することです。

Sudo apt install linux-generic-lts-xenial

次に再起動します。

DisplayLinkドライバーをエラーなしでビルドおよびインストールするために必要なことはそれだけでした。ただし、私の14.04システムはGUIがインストールされていない仮想マシンです。

これがデスクトップシステムの場合(つまり、グラフィカルデスクトップ環境を実行している場合)、then 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-getaptに変更しました。これにより、多少人間が読める出力が生成されます。 (14.04にはaptがあります。一部の以前のリリースにはありません。)--install-recommendsフラグは デフォルト であり、変更する可能性は低いため、おそらく不要です。危害を加えないでください。

ドライバーをインストールする

公式のUbuntuカーネル(バージョン番号が十分に高い)を使用すると、インストールは成功します。このセクションは、主に、ドライバーをインストールしたときまでに行ったことのない他の読者向けに提供されています。 あなた(およびドライバーの残りのインストール方法を知っている他の人)は、自分でこの部分に従う必要はありません。

依存関係をインストールします。

Sudo apt update
Sudo apt install build-essential linux-headers-generic dkms

cdDisplayLink 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デバイスが接続されていない場合、モジュールはカーネルに自動的にロードされません。接続されている場合、shouldをロードする必要があります。 Sudo modprobe evdiを試すことができます。このドライバーで発生する問題についての新しい質問を投稿するためにそれをインストールした後、私はlsmodの完全な出力を含めることを推奨します(つまり、| grep evdiなし) )およびuname -a

2
Eliah Kagan