Linuxカーネルモジュールにバグがあり、ストックのUbuntu 14.04カーネルでエラーが発生します(クラッシュ)。
だからこそ、edit/patchそれだけのソースをシングルカーネルモジュールを追加して、デバッグ出力を追加します。問題のカーネルモジュールはmvsas
であり、起動する必要はありません。そのため、initrdイメージを更新する必要はありません。
多くの情報を読んで(以下に示すように)、セットアップとビルドプロセスの混乱を見つけました。次の2つのレシピが必要です。
.c
および.h
)を編集し、その編集を新しいカーネルモジュール(.ko
)に変換した後の手順使用されているソースは次のとおりです。
カスタムモジュールを作成するレシピは、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: 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メソッドも説明されています。