Ubuntu > カーネル(モジュール)のコンパイル

update 2014-02-09
広告
以下、Ubuntu 12.04 (linux 3.2.0)の例です。 コンパイルに必要なパッケージをインストールします。
$ sudo apt-get install build-essential kernel-package
使用中のカーネルのソースコードをダウンロードします。
$ sudo apt-get source linux-image-$(uname -r)
linux-3.2.0というディレクトリにソースコードが展開されるはずです。 カーネル設定(コンフィグ)ファイルが無いので、現在の設定をコピーしておきます。
$ cd linux-3.2.0
$ cp /boot/config-3.2.0-58-generic .config
コンフィグを変更したければ、make menuconfig します。
$ make menuconfig
以下のエラーが出る場合があります。
 *** Unable to find the ncurses libraries or the
 *** required header files.
 *** 'make menuconfig' requires the ncurses libraries.
 *** 
 *** Install ncurses (ncurses-devel) and try again.
そのときは、ncurses-dev をインストールしましょう。
$ sudo apt-get install ncurses-dev
ソフトウェア割り込みの頻度(CONFIG_HZ)を変更したいなら、Processor type and features -> Timer frequency で変更しましょう。 また、ソースコードに手を加えるなら、ここで変更しておきます。

カーネルのコンパイル

次に、コンパイルする前に、クリーンして、、、
$ make-kpkg clean
コンパイルの実行です。
$ fakeroot make-kpkg -j4 --initrd --append-to-version=-new kernel_image kernel_headers
これで、カーネルをコンパイルできます。 30分から1時間くらいかかります。 親ディレクトリに、linux-headers-3.2.xx-new_3.2.xx-new-10.00.Custom_amd64.deb と linux-image-3.2.xx-new_3.2.xx-new-10.00.Custom_amd64.deb というファイルが作成されるので、インストールします。
$ sudo dpkg -i linux-image-3.2.53-new_3.2.53-new-10.00.Custom_amd64.deb
$ sudo dpkg -i linux-headers-3.2.53-new_3.2.53-new-10.00.Custom_amd64.deb
これで、再起動すればOKです。

モジュールのコンパイル

モジュールだけコンパイルする場合は、make menuconfigで設定ファイルを用意したら、以下のように、コンパイルの準備を行います。
$ make prepare
$ make scripts
そして、コンパイルしたいモジュールのディレクトリに移動します。 例えばBroadcomのイーサネットカードのドライバをコンパイルするなら、以下に移動します。
$ cd drivers/net/ethernet/broadcom/
システムヘッダを参照して、コンパイルします。
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) 
モジュールオブジェクト(.ko ファイル)が作成されるはずです。 現在使用しているモジュールオブジェクトは /lib/modules/ 以下にあるので(この例だと /lib/modules/3.2.0-58-generic/kernel/drivers/net/ethernet/broadcom にある)、生成したオブジェクトで上書きします。 上書きする前に、バックアップしておいたほうがよいでしょう。 あとは rmmod して、insmod すればよいはずです。
$ sudo rmmod bnx2.ko
$ sudo insmod bnx2.ko

Invalid module format

カーネルのソースコードのバージョンや、コンパイル時に参照するシステムヘッダのバージョンが、使用中のカーネルのバージョンと違っていると、insmod したときに以下のようなエラーになります。
$ sudo insmod bnx2.ko
insmod: error inserting 'bnx2.ko': -1 Invalid module format
modinfoコマンドで、モジュールファイルのバージョンを見れます。重要なのは vermagic です。
$ modinfo bnx2.ko | grep vermagic
vermagic:       3.2.53 SMP mod_unload modversions 
この3.2.53が、バージョンです。 現在使用中のモジュールのバージョンと、insmodしようとしているモジュールのバージョンが違っていると、エラーになります。
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system