Несоответствие версии подуровня при попытке скомпилировать текущее ядро

Я пытаюсь перекомпилировать модуль sound/usb в Ubuntu 18.10 для работающего ядра. Я не получаю ошибок компиляции, но когда я пытаюсь загрузить модуль, я получаю эту ошибку:

Invalid module format

Я использую ядро ​​4.18.0-21-lowlatency.

Таким образом, я получаю исходный код ядра

apt source linux

Это загружает и извлекает исходный код ядра 4.18.0 в папку linux-4.18.0.

Я копирую файлы .config и Module.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
задан 13 June 2019 в 01:13

1 ответ

У меня была похожая проблема. Проблема заключается в том, как вы получаете исходный код ядра и как вы «собираете» ядро. Есть ссылка на то, что официальный способ сделать это. Я следовал за ним с https://help.ubuntu.com/community/Kernel/Compile. Судя по всему, он устарел и долго читается.

Исходя из ситуации, я хочу использовать официально выпущенное ядро ​​Ubuntu (а не откуда-либо еще) apt-get source xxxxx. Это папка с папкой Debian и tar-шаром. Затем я следую частичным инструкциям из Попытка собрать ядро ​​​​18.04. Нет опции editconfigs

  1. Загрузить исходники ядра (deb-src следует раскомментировать в /etc/apt/sources.list)

    $ apt-get install linux-source kernel -упаковка
    
  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 сборка-депозитный исходный код linux
    $ mkdir дебиан/штампы
    

Затем я могу запустить fakeroot debian/rules clean и fakeroot debian/rules binary-headers binary-generic binary-perarch. В середине мне приходится вручную копировать один заголовочный файл amd gpu в отсутствующее место, иначе компиляция не удалась. Таким образом, fakeroot debian/rules использует вашу текущую конфигурацию ядра (uname -r).

Если я использую make menuconfigure и .config, у меня та же проблема, что и у вас. Таким образом, вы можете использовать мой пример для использования официального выпущенного ядра Ubuntu и fakeroot debian/rules для компиляции. Версия модуля может совпадать.

Моя версия — Ubuntu 18.04, а uname -r — 5.3.0-51. Я использую apt-get для получения исходного кода около 2020-4-15.

Я полагаю, что есть другие способы использовать make вместо fakeroot debian/rules, и это может помочь в построении модулей в дереве.

0
ответ дан 9 May 2020 в 18:53

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

Похожие вопросы: