カーネルモジュールを1つだけビルドする方法(レシピ)


35

Linuxカーネルモジュールにバグがあり、Ubuntu 14.04カーネルがおかしくなります(クラッシュ)。

そのため、その単一のカーネルモジュールのみのソースを編集 / パッチして、デバッグ出力を追加したいのです。問題のカーネルモジュールは、起動するために必要ではありません。そのため、initrdイメージを更新する必要はありません。mvsas

多くの情報を読んで(以下に示すように)、セットアップとビルドプロセスの混乱を見つけました。次の2つのレシピが必要です。

  1. ビルド環境を一度セットアップ/構成するには
  2. このカーネルモジュールのソースファイルを編集した後の手順(.cおよび.h)、その編集を新しいカーネルモジュールに変換する(.ko

使用されているソースは次のとおりです。



おそらく、この記事では、あまりにも役立ちます:stackoverflow.com/questions/8744087/...
オレグKokorin

回答:


33

カスタムモジュールを作成するレシピは、3つのセクションに分割する必要がある場合があります。

一度セットアップする

$ cd ~
$ apt-get source linux-source-3.13.0 

mvsas固有のドライバーソースファイルをコピーするのが面倒です。それらをすべて現在の作業ディレクトリにコピーするだけです。ソースURIの欠落apt-getに関するエラーメッセージが表示される場合は、下部の注4を参照してください。

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

これにより、カーネルモジュールのビルドに必要ないくつかのファイルが準備されます。

各カーネルバージョン

$ apt-get install linux-headers-$(uname -r)

これにより、ヘッダーとそのカーネルバージョンのUbuntuカーネル構成ファイルが/ lib / modulesにインストールされます。

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

これにより、insmodまたはmodprobeでモジュールをロードするときに「module_layoutのシンボルバージョンがありません」というメッセージが表示されなくなります。

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

これにより、元の(Ubuntuビルド)カーネルモジュールの名前が変更され、カスタムパッチが適用されたカーネルモジュールがロードされるようになります。

各編集

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

これらは編集用です。

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

これ.koにより、ストックされて/lib/modules/$(uname -r)/いるUbuntuディストリビューションのカーネル構成を使用して、カーネルモジュールファイルがコンパイルおよびビルドされます。

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

これにより、カーネルモジュールがにインストールされ/lib/modules/$(uname -r)/extra/ます。ディストリビューションカーネルモジュールファイルの名前を変更しなかった場合、ディストリビューションモジュールは上書きされません。このmvsasの場合、depmodも実行されます

$ lsmod | grep mvsas

これにより出力が発生する場合、mvsasモジュールはmodprobe -r mvsas最初に()でアンロードする必要があります。

$ sudo modprobe -v mvsas

これにより、新しいカーネルモジュールがロードされます。

出力をチェックして、/lib/modules/.../extra/mvsas.koロードされていることを確認します。

Modprobeエラー:挿入できませんでした

場合によってmodprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)は、冗長modprobeの出力でinsmod、カーネルのデフォルトの場所からモジュールをロードしようとしていることがわかります。例えば:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

その場合、手動でdepmodを実行し、モジュールを再度ロードする必要があります。

# depmod
# sudo modprobe -v mvsas

ノート

  1. 結果の.koモジュールファイルは、Ubuntuによって配布された元のモジュールファイルよりもサイズがはるかに大きい(たとえば20倍)場合があります。その場合、このmake prepare手順により、カーネル構成ファイルをデバッグするLinux開発者が作成され、ソースディレクトリからビルドできます。あなたの-C予想通りparamが機能しない場合があります。
  2. make modules_prepareおよびなどの他のコマンドを使用したガイドを見てきましたmake M=scripts/modが、これらはこの場合には必要ではないと思います。
  3. に置き換え-C /lib/modules/$(uname -r)/buildて、Linux開発者のデバッグ設定を使用できます。-C /usr/src/linux-headers-$(uname -r)
  4. デフォルト設定でapt-get source linux-sourcesは、エラーが返されますE: You must put some 'source' URIs in your sources.list。この問題を修正するには、最初の行の/etc/apt/sources.listコメントを外す(先頭の行を削除する#)ことでファイルを変更できますdeb-src。Ubuntu 17.10の例:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted。を実行するsudo apt-get updateと、コマンドがソースを配信します。これを行うためのGUIメソッドも説明されているこの質問も参照してください。

エラーが発生しました:/ bin / sh:arm-none-linux -gnueabi-gcc:not found
Dr.jacky

$(uname-r)明らかに間違っている...あなたが呼び出す必要がshellビルトイン:$(shell uname -r)
アルバス・ダンブルドア

2
@AlbusDumbledore 動作しない場合もあり$(shell uname -r)ます。どうして$(uname -r)そんなに明らかに間違っているのですか?
プロバックアップ

また、を呼び出して、で更新されたファイルが表示されるecho "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confようにしdepmodました.../extra
マーティンペッカ

1
モジュール署名エラーの処理方法、回避方法 `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko main.c:158で:-SSL error:02001002:system library:fopen:No such file or directory: bss_file.c:175 - SSLエラー:2006D080:BIOルーチン:BIO_new_file:いいえそのようなファイル:bss_file.c:178サインファイル:本命/ signing_key.pem:そのようなファイルやディレクトリはありません`` `
Envek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.