현재 커널을 컴파일하려고 할 때 하위 수준 버전이 일치하지 않습니다.

현재 커널을 컴파일하려고 할 때 하위 수준 버전이 일치하지 않습니다.

sound/usb실행 중인 커널에 대해 Ubuntu 18.10에서 모듈을 다시 컴파일하려고 합니다 . 컴파일 오류는 발생하지 않지만 모듈을 로드하려고 하면 다음 오류가 발생합니다.

Invalid module format

커널 을 실행 중입니다 4.18.0-21-lowlatency.

이런 식으로 커널 소스를 얻습니다.

apt source linux

그러면 커널 소스가 폴더 4.18.0에 다운로드되어 추출됩니다 linux-4.18.0.

커널 소스 디렉토리의 루트에 .configModule.symvers파일을 복사합니다 ./lib/modules/4.18.0-21-lowlatency/build

나는 달리고 make EXTRAVERSION=-21-lowlatency modules_prepare, 그리고 나서make EXTRAVERSION=-21-lowlatency M=sound/usb

실행 insmod결과에 다음 오류가 기록됩니다.syslog

snd_usb_audio: version magic '4.18.20-21-lowlatency SMP preempt mod_unload ' should be '4.18.0-21-lowlatency SMP preempt mod_unload '

modinfo /lib/modules/uname -r을 실행하면 /kernel/sound/usb/snd-usb-audio.ko | grep vermagic다음이 반환됩니다.

vermagic:       4.18.0-21-lowlatency SMP preempt mod_unload

modinfo새로 컴파일된 모듈을 실행 하면 다음이 반환됩니다.

vermagic:       4.18.20-21-lowlatency SMP preempt mod_unload

나는 문제의 처음 몇 줄을 추적했습니다.Makefile

VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 20

SUBLEVEL를 변경한 0다음 컴파일하면 모듈을 성공적으로 로드할 수 있습니다.

4.18.0따라서 커널을 실행 중이고 커널 apt source linux을 다운로드하는 것처럼 보이 더라도 4.18.0다운로드한 파일의 버전은 4.18.20.

이것이 정상입니까, 아니면 뭔가 빠졌습니까?

답변1

비슷한 문제가있었습니다. 문제는 커널 소스를 얻는 방법과 커널을 "구축"하는 방법에 있습니다. 공식적인 방법에 대한 링크가 있습니다. 나는 그것을 따랐다.https://help.ubuntu.com/community/Kernel/Compile. 겉보기에는 시대에 뒤떨어져 오래 읽은 것 같습니다.

상황에 따라 공식 출시된 Ubuntu 커널(다른 곳이 아닌)을 사용하고 싶습니다 apt-get source xxxxx. 데비안 폴더와 타르볼이 들어있는 폴더입니다. 그런 다음 부분 지침을 따릅니다.18.04에서 커널을 빌드하려고 합니다. editconfigs 옵션 없음

  1. 커널 소스 다운로드( deb-src에서 주석 처리를 제거해야 함 /etc/apt/sources.list)

    $ apt-get install linux-source kernel-package
    
  2. 커널 소스가 있는 폴더로 이동하여 압축을 푼다

    $ cd /usr/src/linux-source-x.x.x
    $ tar jxvf linux-source-x.x.x.tar.bz2
    
  3. 콘텐츠를 현재 폴더로 이동
    $ mv linux-source-x.x.x/* .
    $ rm -rf linux-source-x.x.x/
    
  4. 필요한 패키지 받기
    $ apt-get build-dep linux-source
    $ mkdir debian/stamps
    

그런 다음 실행할 수 fakeroot debian/rules clean있습니다 fakeroot debian/rules binary-headers binary-generic binary-perarch. 중간에 하나의 amd GPU 헤더 파일을 누락된 위치에 수동으로 복사해야 합니다. 그렇지 않으면 컴파일이 실패합니다. 이 방법은 fakeroot debian/rules실행 중인 커널 구성( uname -r)을 사용하고 있습니다.

및 .config를 사용하면 make menuconfigure귀하와 동일한 문제가 발생합니다. 따라서 내 샘플을 사용하여 공식 출시된 Ubuntu 커널을 사용하고 fakeroot debian/rules컴파일할 수 있습니다. 모듈 버전이 일치할 수 있습니다.

내 버전은 Ubuntu 18.04이고 uname -r5.3.0-51입니다. 나는 apt-get을 사용하여 2020-4-15쯤에 소스를 얻습니다.

make대신에 사용할 수 있는 다른 방법이 있다고 생각하며 fakeroot debian/rules, 트리 내 모듈을 구축하는 데 도움이 될 수 있습니다.

관련 정보