「カーネルモジュールのコンパイル」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(リンクを修正)
 
(2人の利用者による、間の4版が非表示)
1行目: 1行目:
 
[[Category:カーネル]]
 
[[Category:カーネル]]
  +
[[bs:Compile kernel module]]
 
[[en:Compile kernel module]]
 
[[en:Compile kernel module]]
 
{{Related articles start}}
 
{{Related articles start}}
22行目: 23行目:
   
 
=== 慣習的な方法 ===
 
=== 慣習的な方法 ===
[[カーネル/コンパイル/伝統的な方法#カーネルソースダウンロード]]を見てください。[[Git]] を使って最新のカーネルを取得する場合、タグを使って必要なバージョンをチェックアウトしてください (例: v4.1)。
+
[[カーネル/伝統的なコンパイル方法#カーネルソースダウンロードする]] を見てください。[[Git]] を使って最新のカーネルを取得する場合、タグを使って必要なバージョンをチェックアウトしてください (例: v4.1)。
   
 
=== Arch Build System ===
 
=== Arch Build System ===
Arch Build System に関しての概略は [[Arch Build System|ABS]] を参照して下さい。ソースコードの入手方法やディレクトリ構成、その他の詳細は、[[カーネル/コンパイル/Arch Build System]] を参照して下さい。
+
Arch Build System に関しての概略は [[Arch Build System|ABS]] を参照して下さい。ソースコードの入手方法やディレクトリ構成、その他の詳細は、[[カーネル/Arch build system]] を参照して下さい。
   
 
== ソースの設定 ==
 
== ソースの設定 ==
48行目: 49行目:
 
== モジュールのコンパイル ==
 
== モジュールのコンパイル ==
   
モジュールのコンパイルとロードをクリーンに行うためには、現在のカーネルバージョンの EXTRAVERSION 部分を知る必要があります。カーネルソースと正確に対応させることができるようになります。EXTRAVERSION 変数はカーネルのトップにある Makefile で設定します。しかし元のソースコードでは、 EVTRAVERSION は空になっていて、 Arch カーネルのビルドプロセスにおいて設定されます。現在のカーネルの EXTRAVEERSION は {{ic|uname -r}} から確認することができます。概して、カーネルバージョンは3つの成分の合成になっていて、それぞれバージョン番号、 EXTRAVERSION, LOCALVERSIONです。さらにバージョン番号は3つの数字から成ります。 [[PKGBUILD]] ファイルからビルドされた場合には、LOCALVERSION は {{ic|pkgrel}} 変数にハイフンを付けたもの、 EXTRAVERSION は {{ic|pkgver}} の後半部分で、3つめの数字からの値で、ピリオドがハイフンに代わったものです。例えば、 linux パッケージ {{ic|linux 5.5.8.arch1-1}}の場合は LOCALVERSION は {{ic|-1}}で、 EXTRAVRSION は {{ic|-arch1}} になります。{{ic|uname -r}} の出力は、この場合 {{ic|5.5.8-arch1-1}}になります。
+
モジュールのコンパイルとロードをクリーンに行うためには、現在のカーネルバージョンの EXTRAVERSION 部分を知る必要があります。カーネルソースと正確に対応させることができるようになります。EXTRAVERSION 変数はカーネルのトップにある Makefile で設定します。しかし元のソースコードでは、 EVTRAVERSION は空になっていて、 Arch カーネルのビルドプロセスにおいて設定されます。現在のカーネルの EXTRAVEERSION は {{ic|uname -r}} から確認することができます。概して、カーネルバージョンは3つの成分の合成になっていて、それぞれバージョン番号、 EXTRAVERSION, LOCALVERSIONです。さらにバージョン番号は3つの数字から成ります。 [[PKGBUILD]] ファイルからビルドされた場合には、LOCALVERSION は {{ic|pkgrel}} 変数にハイフンを付けたもの、 EXTRAVERSION は {{ic|pkgver}} の後半部分で、3つめの数字からの値で、ピリオドがハイフンに代わったものです。例えば、 linux パッケージ {{ic|linux 5.5.8.arch1-1}}の場合は LOCALVERSION は {{ic|-1}}で、 EXTRAVRSION は {{ic|-arch1}} になります。{{ic|uname -r}} の出力は、この場合 {{ic|5.5.8-arch1-1}}になります。
   
 
EXTRAVERSION 値が分かったら、次の様にして設定してソースコードの準備を行います:
 
EXTRAVERSION 値が分かったら、次の様にして設定してソースコードの準備を行います:
88行目: 89行目:
 
== モジュールのインストール ==
 
== モジュールのインストール ==
   
コンパイルが完了したら gzip で圧縮して、使用しているカーネルのところにコピーする必要があります。
+
コンパイルが完了したら適切なフォーマットで圧縮して、使用しているカーネルのところにコピーする必要があります。
   
 
既存のモジュールを置き換える場合、ファイルを上書きしてください ({{Pkg|linux}} を再インストールするとデフォルトのモジュールに置き換わるので注意):
 
既存のモジュールを置き換える場合、ファイルを上書きしてください ({{Pkg|linux}} を再インストールするとデフォルトのモジュールに置き換わるので注意):
   
$ gzip fs/btrfs/btrfs.ko
+
$ xz fs/btrfs/btrfs.ko
# cp -f fs/btrfs/btrfs.ko.gz /usr/lib/modules/`uname -r`/kernel/fs/btrfs/
+
# cp -f fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/kernel/fs/btrfs/
   
 
もしくは、updates フォルダにモジュールを配置することもできます (フォルダが存在しない場合は作成してください):
 
もしくは、updates フォルダにモジュールを配置することもできます (フォルダが存在しない場合は作成してください):
   
$ cp fs/btrfs/btrfs.ko.gz /usr/lib/modules/`uname -r`/updates
+
$ cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/updates
   
 
新しいモジュールを追加する場合は extramodules にコピーします (以下はあくまで例です。btrfs はこのフォルダからはロードされません):
 
新しいモジュールを追加する場合は extramodules にコピーします (以下はあくまで例です。btrfs はこのフォルダからはロードされません):
   
# cp fs/btrfs/btrfs.ko.gz /usr/lib/modules/`uname -r`/extramodules/
+
# cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/extramodules/
   
 
モジュールをコンパイルして (ブートの初期段階でロードされるように) [[initramfs]] にコピーする場合は initramfs を再生成するようにしてください (そうしないとコンパイルしたモジュールがロードされません)。さらに、"updates" フォルダを使用するときは、[[initramfs]] を再生成する前に "depmod" でモジュールの依存ツリーを再ビルドする必要があります。
 
モジュールをコンパイルして (ブートの初期段階でロードされるように) [[initramfs]] にコピーする場合は initramfs を再生成するようにしてください (そうしないとコンパイルしたモジュールがロードされません)。さらに、"updates" フォルダを使用するときは、[[initramfs]] を再生成する前に "depmod" でモジュールの依存ツリーを再ビルドする必要があります。
   
 
# mkinitcpio -p linux
 
# mkinitcpio -p linux
  +
  +
== 考えられるエラー ==
  +
もし、EXTRAVERSION が正しく設定されていない場合、次のエラーが起き得ます:
  +
  +
# insmod mymod.ko
  +
insmod: ERROR: could not insert module mymod.ko: Invalid module format
  +
# modprobe mymod
  +
modprobe: ERROR: could not insert 'mymod': Exec format error
  +
  +
バージョンの不一致によるもので、これを無視する場合には {{ic|force-vermagic}}オプションを付けてロードします:
  +
  +
$ modprobe mymod -force-vermagic
   
 
== 参照 ==
 
== 参照 ==
   
* [http://kernelnewbies.org/ Linux Kernel Newbies]
+
* [https://kernelnewbies.org/ Linux Kernel Newbies]
* [http://www.tldp.org/LDP/lkmpg/2.6/html/ The Linux Kernel Module Programming Guide]
+
* [https://www.tldp.org/LDP/lkmpg/2.6/html/ The Linux Kernel Module Programming Guide]

2023年6月10日 (土) 18:52時点における最新版

関連記事

カーネル全体を再コンパイルするのではなく Linux のカーネルモジュールだけをコンパイルしたいという場合のガイドです。

ノート: 既存のモジュールを置き換えるときは、モジュール (M) としてコンパイルされていて、カーネルに組み込まれてない (y) ことが前提です。

ビルド環境

まずコンパイラ (base-devel) やカーネルヘッダ (linux-headers) などのビルドに必要なパッケージをインストールする必要があります。

そして今使っているバージョンのカーネルのソースコードを取得してください。新しいバージョンのカーネルソースを使ってみることもできますが、大抵の場合、コンパイルしたモジュールはロードされません。

カーネルのバージョンを確認するには:

$ uname -r

ソースコードの入手方法には大きく2つの選択肢があります。それぞれの選択肢で僅かに使い方や、ディレクトリ構成が異なります。

慣習的な方法

カーネル/伝統的なコンパイル方法#カーネルのソースをダウンロードする を見てください。Git を使って最新のカーネルを取得する場合、タグを使って必要なバージョンをチェックアウトしてください (例: v4.1)。

Arch Build System

Arch Build System に関しての概略は ABS を参照して下さい。ソースコードの入手方法やディレクトリ構成、その他の詳細は、カーネル/Arch build system を参照して下さい。

ソースの設定

ソースコードを手に入れたら、ディレクトリに移動して下さい。ソースコードの入手に #Arch Build System を使用した場合は、ディレクトリは PKGBUILD が存在する場所から見て src/archlinux-linux/ になっているはずです。

make help の出力が有益です。次のコマンドを実行してクリーンしてください。

$ make mrproper
ノート: これによって .config.old が削除されるため、これが必要な場合にはクリーンの実行前にどこか別の場所へ移動してください。

適切な .config ファイルが必要です。設定ファイルがなく、対象のカーネルバージョンが動作中のカーネルと同じであれば、その設定ファイルが利用できます。次で得られます:

$ zcat /proc/config.gz > .config

次にカーネルソースにあわせて設定を調整します。現在使っているバージョンのカーネルソースを使う場合は何も訊かれませんが、新しいバージョンのソースを使用する場合、新しいオプションについて設定が問われます。いずれにせよ #Arch Build System を使っている場合は、 PKGBUILD::prepare() 関数が使えます。

コンパイルするモジュールにデバッグビルドなどのコンパイルオプションを与えたいが、まだコンパイルされていない場合、次の様にしてカーネルの設定を修正できます (ときには修正しなくてはならないです):

$ make oldconfig

モジュールのコンパイル

モジュールのコンパイルとロードをクリーンに行うためには、現在のカーネルバージョンの EXTRAVERSION 部分を知る必要があります。カーネルソースと正確に対応させることができるようになります。EXTRAVERSION 変数はカーネルのトップにある Makefile で設定します。しかし元のソースコードでは、 EVTRAVERSION は空になっていて、 Arch カーネルのビルドプロセスにおいて設定されます。現在のカーネルの EXTRAVEERSION は uname -r から確認することができます。概して、カーネルバージョンは3つの成分の合成になっていて、それぞれバージョン番号、 EXTRAVERSION, LOCALVERSIONです。さらにバージョン番号は3つの数字から成ります。 PKGBUILD ファイルからビルドされた場合には、LOCALVERSION は pkgrel 変数にハイフンを付けたもの、 EXTRAVERSION は pkgver の後半部分で、3つめの数字からの値で、ピリオドがハイフンに代わったものです。例えば、 linux パッケージ linux 5.5.8.arch1-1の場合は LOCALVERSION は -1で、 EXTRAVRSION は -arch1 になります。uname -r の出力は、この場合 5.5.8-arch1-1になります。

EXTRAVERSION 値が分かったら、次の様にして設定してソースコードの準備を行います:

$ make EXTRAVERSION=<YOUR EXTRAVERSION HERE> modules_prepare

例えば:

$ make EXTRAVERSION=-arch1 modules_prepare

代わりに、もしモジュールのロードを modprobe によって行ない、 --force-vermagic オプションを付けてもよいならば、単に次のように準備します (この場合、modprobe はカーネルバージョンの矛盾を無視します):

$ make modules_prepare
ノート: コマンドラインからの手動での EXTRAVERSION の指定を避けるために、トップレベルにある Makefileに記述されている EXTRAVERSION 値を用いる場合、バージョンの矛盾が起き得ます。カーネルビルドプロセスはこれを認識して、LOCALVERSION の設定に + を追加します。 例: 5.5.8-arch1-1+

最後に、コンパイルしたいモジュールのディレクトリ名を指定して、コンパイルを行います。モジュールの場所は、 modinfofind から探せます。

$ make M=fs/btrfs

動かなかった場合の最後の手段として、次ができます:

$ make modules

これはカーネル設定から、全てのモジュールをビルドします。

ツリー外のモジュールのコンパイル

#Arch Build Systemにあるように、現在動作している linux カーネルの公式ソースコードを入手します:

$ cd && make build
$ asp update linux
$ asp checkout linux

コンパイルを行うとき、ソースをチェックアウトします:

$ cd build/mymod
$ make -C ~/buld/linux/trunk/src/arclinux-linux M=$PWD modules

モジュールのインストール

コンパイルが完了したら適切なフォーマットで圧縮して、使用しているカーネルのところにコピーする必要があります。

既存のモジュールを置き換える場合、ファイルを上書きしてください (linux を再インストールするとデフォルトのモジュールに置き換わるので注意):

$ xz fs/btrfs/btrfs.ko
# cp -f fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/kernel/fs/btrfs/

もしくは、updates フォルダにモジュールを配置することもできます (フォルダが存在しない場合は作成してください):

$ cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/updates

新しいモジュールを追加する場合は extramodules にコピーします (以下はあくまで例です。btrfs はこのフォルダからはロードされません):

# cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/extramodules/

モジュールをコンパイルして (ブートの初期段階でロードされるように) initramfs にコピーする場合は initramfs を再生成するようにしてください (そうしないとコンパイルしたモジュールがロードされません)。さらに、"updates" フォルダを使用するときは、initramfs を再生成する前に "depmod" でモジュールの依存ツリーを再ビルドする必要があります。

# mkinitcpio -p linux

考えられるエラー

もし、EXTRAVERSION が正しく設定されていない場合、次のエラーが起き得ます:

# insmod mymod.ko
insmod: ERROR: could not insert module mymod.ko: Invalid module format
# modprobe mymod
modprobe: ERROR: could not insert 'mymod': Exec format error

バージョンの不一致によるもので、これを無視する場合には force-vermagicオプションを付けてロードします:

$ modprobe mymod -force-vermagic

参照