GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxの汚染されたカーネル?

特定の条件下では、Linuxカーネルが汚染される場合があります。 。たとえば、独自のビデオドライバをカーネルにロードすると、カーネルが汚染されます。この状態は、システムログ、カーネルエラーメッセージ(おっと、パニック)、およびlsmodなどのツールを介して表示される場合があります。 、システムが再起動されるまで残ります。

これは何を意味するのでしょうか?システムを使用する能力に影響しますか?また、サポートオプションにどのように影響しますか?

承認された回答:

カーネルが汚染されている場合は、コミュニティでサポートされていない状態にあることを意味します。 。ほとんどのカーネル開発者は、汚染されたカーネルに関連するバグレポートを無視します。コミュニティのメンバーは、カーネルに関連する問題の診断に進む前に、汚染状態を修正するように求める場合があります。さらに、カーネルが汚染されていると、一部のデバッグ機能とAPI呼び出しが無効になる場合があります。

プロプライエタリドライバが関係するほとんどの場合、汚染状態を安全に無視できます 、しかし、カーネルが汚染される原因となるいくつかのシナリオは、深刻なシステムの問題を示している可能性があります。

この機能は、カーネルの問題を適切にトラブルシューティングするのを困難にする可能性のある状態を特定することを目的としています。たとえば、プロプライエタリモジュールをロードすると、カーネル開発者がモジュールのソースコードにアクセスできず、モジュールがカーネルに対して何をしたかを判断できないため、カーネルデバッグ出力の信頼性が低下する可能性があります。同様に、カーネルで以前にエラー状態が発生した場合、または重大なハードウェアエラーが発生した場合、カーネルによって生成されたデバッグ情報は信頼できない可能性があります。

カーネルはいくつかの理由で汚染される可能性があります 、以下を含みます(ただしこれらに限定されません):

  • プロプライエタリ(または非GPL互換)カーネルモジュールの使用-これはカーネルの汚染の最も一般的な原因であり、通常、プロプライエタリのNVIDIAまたはAMDビデオドライバーをロードした結果です
  • ステージングの使用 カーネルソースコードの一部であるが、完全にはテストされていないドライバー
  • ツリー外の使用 Linuxカーネルのソースコードに含まれていないモジュール
  • カーネルモジュールの強制的なロードまたはアンロード(現在のバージョンのカーネル用に構築されていないモジュールを強制的に挿入するなど)
  • サポートされていない特定のユニプロセッサCPU、主に古いAMDAthlonプロセッサでのSMP(マルチプロセッサ)カーネルの使用
  • ACPI DSDTのオーバーライド。電源管理のバグを修正するために必要になる場合があります(詳細はこちらをご覧ください)
  • マシンチェックの例外やカーネルのループなど、特定の重大なエラー状態
  • カーネルが回避しなければならないシステムファームウェア(BIOS、UEFI)の特定の重大なバグ

これらの各条件は、カーネル内の特定のフラグによって表されます。 SUSEなどの一部のLinuxベンダーは、汚染フラグを追加しています ベンダーによってサポートされていないモジュールのロードなどの条件を示すため。

詳細については、カーネルのドキュメントを参照してください。そこにリストされている汚染フラグがあります(_「空白」の代用)

  • G | P :ロードされたすべてのモジュールにGPLまたは互換性のあるライセンスがある場合はG、それ以外の場合は独自のモジュールがロードされています。 MODULE_LICENSEがないモジュール、またはinsmodによってGPL互換として認識されないMODULE_LICENSEがあるモジュールは、独占的であると見なされます。
  • F | _ :いずれかのモジュールが「insmod-f」によって強制的にロードされた場合、それ以外の場合はすべてのモジュールが正常にロードされた場合。
  • S | _ :マルチプロセッサを実行するのに安全であると認定されていないハードウェアで実行されているSMPカーネルでoopsが発生した場合。現在、これはSMPに対応していないさまざまなアスロンでのみ発生します。
  • R | _ :モジュールがrmmod -fによって強制的にアンロードされた場合 、それ以外の場合、すべてのモジュールが正常にアンロードされた場合。
  • M | _ :いずれかのプロセッサがマシンチェック例外を報告した場合、
    それ以外の場合、マシンチェック例外は発生していません。
  • B | _ :ページ解放関数が不正なページ参照または予期しないページフラグを検出した場合。
  • U | _ :ユーザーまたはユーザーアプリケーションが汚染フラグの設定を特に要求した場合。
  • D | _ :カーネルが最近死んだ場合、つまりOOPSまたはBUGがあった場合。
  • A | _ :ACPIテーブルがオーバーライドされている場合。
  • W | _ :以前にカーネルによって警告が発行された場合(ただし、一部の警告はより具体的な汚染フラグを設定する場合があります)。
  • C | _ :ステージングドライバーがロードされている場合。
  • I | _ :カーネルがプラットフォームファームウェア(BIOSなど)の重大なバグを回避している場合。
  • O | _ :外部で構築された(「ツリー外」)モジュールがロードされている場合。
  • E | _ :署名されていないモジュールが、モジュール署名をサポートするカーネルにロードされている場合。
  • L | _ :以前にシステムでソフトロックアップが発生した場合。
  • K | _ :カーネルにライブパッチが適用されている場合。
関連:Linux –コマンドをバックグラウンドで遅延させて実行する方法は?
Linux
  1. Linux –カーネル:名前空間のサポート?

  2. Linux –カーネルIP転送?

  3. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  1. Linux –カーネルモジュールを適切にリロードする方法は?

  2. カーネル モジュール パラメータの変更 (/sys/module を使用)

  3. Linux カーネル モジュール内からユーザー空間関数を呼び出す

  1. Linux でのカーネル モジュール構成の初心者向けガイド

  2. Linux カーネルモジュールのコーディング方法は?

  3. CLion で Linux カーネルモジュールを開発することは可能ですか?