「カーネルモジュールのコンパイル」の版間の差分
(→モジュールのコンパイル: 英語版と同期) |
細 (リンクを修正) |
||
(2人の利用者による、間の5版が非表示) | |||
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)。 |
=== Arch Build System === |
=== Arch Build System === |
||
− | Arch Build System に関しての概略は [[Arch Build System|ABS]] を参照して下さい。ソースコードの入手方法やディレクトリ構成、その他の詳細は、[[カーネ |
+ | 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 は |
+ | モジュールのコンパイルとロードをクリーンに行うためには、現在のカーネルバージョンの 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 値が分かったら、次の様にして設定してソースコードの準備を行います: |
||
73行目: | 74行目: | ||
これはカーネル設定から、全てのモジュールをビルドします。 |
これはカーネル設定から、全てのモジュールをビルドします。 |
||
+ | |||
+ | == ツリー外のモジュールのコンパイル == |
||
+ | [[#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 |
||
== モジュールのインストール == |
== モジュールのインストール == |
||
− | コンパイルが完了したら |
+ | コンパイルが完了したら適切なフォーマットで圧縮して、使用しているカーネルのところにコピーする必要があります。 |
既存のモジュールを置き換える場合、ファイルを上書きしてください ({{Pkg|linux}} を再インストールするとデフォルトのモジュールに置き換わるので注意): |
既存のモジュールを置き換える場合、ファイルを上書きしてください ({{Pkg|linux}} を再インストールするとデフォルトのモジュールに置き換わるので注意): |
||
− | $ |
+ | $ xz fs/btrfs/btrfs.ko |
− | # cp -f fs/btrfs/btrfs.ko. |
+ | # cp -f fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/kernel/fs/btrfs/ |
もしくは、updates フォルダにモジュールを配置することもできます (フォルダが存在しない場合は作成してください): |
もしくは、updates フォルダにモジュールを配置することもできます (フォルダが存在しない場合は作成してください): |
||
− | $ cp fs/btrfs/btrfs.ko. |
+ | $ cp fs/btrfs/btrfs.ko.xz /usr/lib/modules/`uname -r`/updates |
新しいモジュールを追加する場合は extramodules にコピーします (以下はあくまで例です。btrfs はこのフォルダからはロードされません): |
新しいモジュールを追加する場合は extramodules にコピーします (以下はあくまで例です。btrfs はこのフォルダからはロードされません): |
||
− | # cp fs/btrfs/btrfs.ko. |
+ | # 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 |
||
== 参照 == |
== 参照 == |
||
− | * [ |
+ | * [https://kernelnewbies.org/ Linux Kernel Newbies] |
− | * [ |
+ | * [https://www.tldp.org/LDP/lkmpg/2.6/html/ The Linux Kernel Module Programming Guide] |
2023年6月10日 (土) 18:52時点における最新版
カーネル全体を再コンパイルするのではなく Linux のカーネルモジュールだけをコンパイルしたいという場合のガイドです。
目次
ビルド環境
まずコンパイラ (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
ファイルが必要です。設定ファイルがなく、対象のカーネルバージョンが動作中のカーネルと同じであれば、その設定ファイルが利用できます。次で得られます:
$ 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
最後に、コンパイルしたいモジュールのディレクトリ名を指定して、コンパイルを行います。モジュールの場所は、 modinfo
や find
から探せます。
$ 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