
実行中のカーネルに対して 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オプションがありません
カーネルソースをダウンロードする(
deb-src
のコメントを解除する必要があります/etc/apt/sources.list
)$ apt-get install linux-source kernel-package
カーネルソースのあるフォルダに移動して解凍します
$ cd /usr/src/linux-source-x.x.x $ tar jxvf linux-source-x.x.x.tar.bz2
- コンテンツを現在のフォルダに移動する
$ mv linux-source-x.x.x/* . $ rm -rf linux-source-x.x.x/
- 必要なパッケージを入手する
$ 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 -r
5.3.0-51 です。2020-4-15 頃に apt-get を使用してソースを取得しました。
make
の代わりにを使用する他の方法もあると思いますfakeroot debian/rules
。これは、ツリー内モジュールの構築に役立つ可能性があります。