カーネルが汚染されている場合、それはコミュニティによってサポートされていない状態であることを意味します .ほとんどのカーネル開発者は、汚染されたカーネルに関するバグ レポートを無視します。コミュニティ メンバーは、カーネルに関連する問題の診断を進める前に、汚染状態を修正するように依頼する場合があります。さらに、カーネルが汚染されている場合、一部のデバッグ機能と API 呼び出しが無効になる場合があります。
プロプライエタリ ドライバが関係するほとんどの場合、汚染状態を安全に無視できます 、しかし、カーネルが汚染されるいくつかのシナリオは、深刻なシステムの問題を示している可能性があります.
この機能は、カーネルの問題の適切なトラブルシューティングを困難にする状況を特定することを目的としています。たとえば、独自のモジュールをロードすると、カーネルのデバッグ出力が信頼できなくなる可能性があります。これは、カーネル開発者がモジュールのソース コードにアクセスできないため、モジュールがカーネルに対して行った可能性があることを判断できないためです。同様に、カーネルで以前にエラー状態が発生した場合、または重大なハードウェア エラーが発生した場合、カーネルによって生成されたデバッグ情報は信頼できない可能性があります。
いくつかの理由でカーネルが汚染される可能性があります 、以下を含みます (ただし、これらに限定されません):
- プロプライエタリ (または非 GPL 互換) カーネル モジュールの使用 — これは、カーネルの汚染の最も一般的な原因であり、通常、プロプライエタリの NVIDIA または AMD ビデオ ドライバをロードしたことが原因です。
- ステージングの使用 カーネル ソース コードの一部ですが、完全にはテストされていないドライバー
- out-of-tree の使用 Linux カーネル ソース コードに含まれていないモジュール
- カーネル モジュールの強制的なロードまたはアンロード (現在のバージョンのカーネル用にビルドされていないモジュールを強制的に挿入するなど)
- サポートされていない特定のユニプロセッサ CPU (主に古い AMD Athlon プロセッサ) での SMP (マルチプロセッサ) カーネルの使用
- ACPI DSDT のオーバーライド。電源管理のバグを修正する必要がある場合があります (詳細については、こちらを参照してください)
- マシン チェック例外やカーネル oopses など、特定の重大なエラー状態
- カーネルが回避しなければならないシステム ファームウェア (BIOS、UEFI) の特定の深刻なバグ
これらの各条件は、カーネル内の特定のフラグによって表されます。 SUSE などの一部の Linux ベンダーは、汚染フラグを追加しています ベンダーがサポートしていないモジュールをロードするなどの条件を示すため。
詳細については、カーネルのドキュメントを参照してください。そこにリストされている汚染フラグは次のとおりです (_ は「空白」の代用)
- G|P :ロードされたすべてのモジュールに GPL または互換ライセンスがある場合は G。それ以外の場合は、独自のモジュールがロードされています。 MODULE_LICENSE を持たないモジュール、または insmod によって GPL 互換として認識されない MODULE_LICENSE を持つモジュールは、独自仕様であると見なされます。
- F|_ :いずれかのモジュールが「insmod -f」によって強制的にロードされた場合、それ以外の場合は、すべてのモジュールが正常にロードされた場合。
- S|_ :マルチプロセッサを安全に実行できると認定されていないハードウェアで実行されている SMP カーネルで oops が発生した場合。現在、これは SMP に対応していないさまざまな Athlon でのみ発生します。
- R|_ :モジュールが
rmmod -f
によって強制的にアンロードされた場合 、それ以外の場合は、すべてのモジュールが正常にアンロードされた場合。 - M|_ :プロセッサがマシン チェック例外を報告した場合、それ以外の場合、マシン チェック例外は発生していません。
- B|_ :ページ解放関数が不適切なページ参照または予期しないページ フラグを検出した場合。
- U|_ :ユーザーまたはユーザー アプリケーションが、Tainted フラグを設定することを明確に要求した場合。
- D|_ :カーネルが最近停止した場合、つまり、OOPS またはバグがあった場合。
- A|_ :ACPI テーブルがオーバーライドされた場合。
- わ|_ :カーネルによって以前に警告が発行された場合 (ただし、警告によっては、より具体的な汚染フラグが設定される場合があります。)
- C|_ :ステージング ドライバがロードされている場合。
- 私|_ :カーネルがプラットフォーム ファームウェア (BIOS など) の重大なバグを回避している場合。
- O|_ :外部で構築された (「ツリー外」) モジュールがロードされている場合。
- E|_ :モジュール署名をサポートするカーネルに未署名のモジュールがロードされている場合。
- L|_ :以前にシステムでソフト ロックアップが発生した場合。
- K|_ :カーネルにライブ パッチが適用されている場合。