質問: カーネルモジュールを1つだけビルドする方法(レシピ) linuxカーネルモジュールにバグがあり、ストックのubuntu 14.04カーネルでエラーが発生します(クラッシュ)。だからこそ、edit/patchそれだけのソースをシングルカーネルモジュールを追加して、デバッグ出力を追加します。問題のカーネルモジュールはmvsasであり、起動する必要はありません。そのため、initrdイメージを更新する必要はありません。多くの情報を読んで(以下に示すように)、セットアップとビルドプロセスの混乱を見つけました。次の2つのレシピが必要です。 ビルド環境を一度セットアップ/構成するには このカーネルモジュールのソースファイル(.cおよび.h)を編集し、その編集を新しいカーネルモジュール(.ko)に変換した後の手順 使用されているソースは次のとおりです。 カーネルモジュールを1つ作成する-google検索 http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/ https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module http://www.pixelbeat.org/docs/rebuild_kernel_module.html 単一のツリー内カーネルモジュールをビルドする方法 http://ubuntuforums.org/showthread.php?t=1153067 http://ubuntuforums.org/showthread.php?t=2112166 http://ubuntuforums.org/showthread.php?t=111559 1つのカーネルモジュールubuntuをビルド-google検索 'make + single + kernel + module'-ubuntuに尋ねる 'make + kernel + module'-ubuntuに尋ねる 私のメイクファイルの結果:ターゲット `arch/x86/tools/relocs.c 'を作成するルールはありません '"無効なモジュール形式"'-ubuntuに問い合わせる ドライバーのインストール:新しいカーネルのソースコードのコンパイル modprobe: '無効な結節の形式'、まだinsmodの後でも動作します 「シンボルバージョンダンプ」「欠落」-google検索 https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one https://askubuntu.com/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutun sbhid.koを読み込もうとすると、module_layoutのシンボルバージョンがありません linuxヘッダーファイルフォルダー内の壊れたリンク 'make modules_install'-ubuntuに尋ねます 'modules_install'-ubuntuに尋ねる カスタムコンパイルされたカーネルの空のビルドディレクトリ https://askubuntu.com/questions/444345/not-able-to-see-pr-info-output https://askubuntu.com/questions/472496/in-which-directory-are-the-kernel-source-files-and-how-can-i-recompile-it パッチを当てたlibata-eh.cファイルをコンパイルしてインストールする方法は? 'modules_install + depmod'-ubuntuに尋ねる modules_install depmod-google検索 「make modules_install」-google検索 http://www.csee.umbc.edu/courses/undergraduate/cmsc421/fall02/burt/projects/howto_build_kernel.html https://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process https://wiki.ubuntu.com/kernelcustombuild http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html 「準備」-google検索 「準備する」「scripts/kconfig/conf --silentoldconfig kconfig」-google検索 http://ubuntuforums.org/showthread.php?t=1963515 ubuntuの「準備」バージョン-google検索 https://stackoverflow.com/questions/8276245/how-to-compile-a-kernel-module-against-a-new-source https://help.ubuntu.com/community/kernel/compile カーネルモジュールのコンパイル方法 カスタムドライバをカーネルに追加する方法 https://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
回答: カスタムモジュールを作成するレシピは、3つのセクションに分割する必要がある場合があります。一度セットアップする$ cd ~ $ apt-get source linux-source-3.13.0 mvsas固有のドライバーソースファイルをコピーするのが面倒です。それらをすべて現在の作業ディレクトリにコピーするだけです。 apt-getの結果、ソースuriの欠落に関するエラーメッセージが表示される場合は、下部の注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でモジュールをロードするときに、「no 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 これにより、/lib/modules/$(uname -r)/に保存されているストックubuntuディストリビューションのカーネル構成を使用して、カーネルモジュール.koファイルがコンパイルおよびビルドされます。$ 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出力でmodprobe: error: could not insert 'xyz': unknown symbol in module, or unknown parameter (see dmesg)が発生することがありますが、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 ノート 結果の.koモジュールファイルは、ubuntuによって配布された元のモジュールファイルよりもサイズがはるかに大きい(たとえば20倍)場合があります。その場合、make prepareステップは、カーネル構成ファイルをデバッグするlinux開発者を作成し、ソースディレクトリからビルドしている可能性があります。 -cパラメーターは期待どおりに機能しない可能性があります。 私はmake modules_prepareやmake m=scripts/modのような他のコマンドのガイドを見てきましたが、この場合にはこれらが必要だとは思いません。 -c /lib/modules/$(uname -r)/buildを-c /usr/src/linux-headers-$(uname -r)に置き換えることにより、linux開発者のデバッグ構成を使用できます。 デフォルト設定では、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メソッドも説明されています。