現在のカーネルをコンパイルしようとしたときにサブレベルのバージョンが一致しない

現在のカーネルをコンパイルしようとしたときにサブレベルのバージョンが一致しない

実行中のカーネルに対して Ubuntu 18.10 でモジュールを再コンパイルしようとしていますsound/usb。コンパイル エラーは発生しませんが、モジュールをロードしようとすると次のエラーが発生します。

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

私も同じような問題を抱えていました。問題はカーネルソースの入手方法とカーネルを「ビルド」する方法にあります。公式の方法へのリンクがあります。私はhttps://help.ubuntu.com/community/Kernel/コンパイル見たところ、古くて読みづらい内容のようです。

状況から判断して、私は公式にリリースされたUbuntuカーネル(他の場所からではなく)を使いたいapt-get source xxxxx。それはDebianフォルダとtarボールの入ったフォルダです。そして、私は以下の部分的な指示に従います。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。 途中で、1 つの amd gpu ヘッダー ファイルを手動で不足している場所にコピーする必要があります。そうしないと、コンパイルが失敗します。 このように、 は実行中のカーネル構成 ( )fakeroot debian/rulesを使用します。uname -r

および .configを使用するとmake menuconfigure、あなたと同じ問題が発生します。したがって、私のサンプルを使用して、公式にリリースされた Ubuntu カーネルを使用してfakeroot debian/rulesコンパイルすることができます。モジュールのバージョンは一致している可能性があります。

私のバージョンは Ubuntu 18.04 で、私のはuname -r5.3.0-51 です。2020-4-15 頃に apt-get を使用してソースを取得しました。

makeの代わりにを使用する他の方法もあると思いますfakeroot debian/rules。これは、ツリー内モジュールの構築に役立つ可能性があります。

関連情報