ローダブル・カーネル・モジュール
Linuxカーネルのモジュールは後述する互換性の問題から、カーネルがリリースされる度にリビルドする必要がある。モジュールのビルドはカーネルソースコードに含まれるデバイスドライバに対するものとカーネルソースコードに含まれない外部のカーネルモジュールに対するものの2通りあるが、いずれもカーネルビルドのインフラを利用している。 通常、カーネルソースコードに含まれる一部のデバイスドライバはカーネルコンフィグレーション(Kconfig)にてカーネルに直接静的リンクするか、もしくはモジュールとして構築するかのいずれかを選ぶことができる。モジュールとして構築することを選択した場合、カーネルソースのMakefileにはmodulesというターゲットが存在し、予めこのディレクトリでカーネル(に直接関係し、カーネルイメージの生成前段階のファイルvmlinux)を作成した後、このmodulesターゲットを実行する事でモジュールのビルドと依存関係の解決用ファイルが生成される。そして、make installを実行すると、システムにカーネルとモジュールを同時にインストールする。
Linuxカーネルコミュニティによれば、LKMはカーネルの二次的著作物(derivative works)である。Linuxカーネル開発者はプロプライエタリなモジュールの配布を許容しているが、一部のカーネルシンボルはGPLのモジュールにのみ利用を許している。
汚染問題
プロプライエタリまたはGPL非互換な組み合わせでライセンスされているLKMをロードするとプロプライエタリモジュールがロードされたことを示すTainted(汚染)フラグが立つ。そのようなLKMを使ってバグが発生した場合、Linuxカーネル開発者は完全な原因を解明できない可能性が高いためユーザに通知するのである。LKMは事実上、動作中のカーネルの一部になる。したがってカーネルのデータ構造を破壊したり、バグを発生させたりする可能性があるが、プロプライエタリである限りその原因を調査できない。
このため2001年にリリースされた、バージョン2.4.10より、モジュール毎にMODULE_LICENSEマクロというモジュールが従うライセンス名を埋め込み、それが"GPL"などでない場合、LKMをロードして組み込む際にTaintedメッセージを表示するようになった。
MODULE_LICENSEマクロには、例えばGPLならば、MODULE_LICENSE("GPL");、BSDライセンス(BSDL)ならばMODULE_LICENSE("BSD");、GPLとBSDLのデュアルライセンスならばMODULE_LICENSE("Dual BSD/GPL");という文字列を埋め込む(引用符""も含める)。必要ならばカーネルソースコードに含まれるinclude/linux/module.