web-dev-qa-db-ja.com

カーネルソースツリーには何が含まれていますか?これはLinuxカーネルヘッダーに関連していますか?

本では、通常、通常のサブディレクトリセット(Archblockcrypto、...)を使用して、/usr/src/linuxにあるLinuxソースツリーへの参照を読みます。 。

このツリーには、カーネルを構成するバイナリファイルが含まれていると思っていました。私のシステム(Ubuntu 10.04)では...

  1. 私が持っているさまざまなカーネル(手動でインストールするのではなく、自動ソフトウェアダウンロードを使用)の場合、次のように、各カーネルの2つのサブディレクトリではなく、この場所にあります。

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. サブディレクトリでは、特にバイナリファイルを期待していました。しかし、かなりの量のツリーをチェックしたところ、ここからの最後のサブディレクトリには常にMakefileがあるようです(これを読むと、通常、構成ファイルよりもインストールファイルのように聞こえます)。ときどきいくつかの孤立した他のファイル(主にKconfig)。

私の質問はナイーブかもしれませんが、私は少し混乱しています。 (2)カーネルソースツリーに表示されるはずです。そして、なぜ「ヘッダー」への明示的な参照があるのですか?他のいくつかのソフトウェアのためにlinux-generic-headersをしばらく前にインストールする必要がありましたが、これが関連しているかどうかはわかりません。 makefileには正当な理由がある(たとえば、/ driverサブディレクトリにモジュールをインストールする)ことに気づきましたが、(かなり)makefileだけですか?

25
gnometorule

ディストリビューションkernel-headerパッケージには、その名前が示すように、カーネルモジュールなどのソフトウェアをビルドするために必要なカーネルヘッダーファイル(および必要な配管)のみが含まれています。

ビルド出力を除いて、カーネルsourceディレクトリでバイナリファイルを見つけることを期待するべきではありません。 (自分でカーネルを構成および構築する場合、カーネルソースディレクトリには、コンパイルされたオブジェクト、モジュール、構築されたカーネル自体、およびそれを機能させる他のいくつかのバイナリビットと断片も含まれます。)
KConfigファイルは、特定のディレクトリ/モジュールで使用できるカーネル構成オプション(およびその依存関係)の説明です。
それとは別に、すべて(主に)Cソースコード、ヘッダーファイル、およびMakefilesです。あちこちにヘルパースクリプトがいくつかあり、Assemblyソースもあります。

ヘッダーパッケージ(インストールしたもの)には、上記のheader部分のみが含まれます(すべてではありません)それ-「エクスポートされた」ヘッダーのみ)、およびビルドインフラストラクチャの一部。だからあなたが見ているものは期待されています。ヘッダーパッケージにはCソースコードは含まれません(一部のスタブとビルドインフラストラクチャコードを除く)。このタイプのパッケージを持つことの要点は、スペース(および帯域幅)を節約することです。Linuxカーネルソースツリー全体はかなり大きく、カーネルを自分でコンパイルするつもりがない場合は完全に不要です。ヘッダーパッケージは、モジュールのビルドに必要な適切なものだけを提供するために、ディストリビューションによってビルドおよび出荷されます。 (確かにコンパイルされたカーネルは含まれていません。)

コメントへの対応:ヘッダーパッケージはどこにも再配置されません。カーネルの特定のバージョン用にビルドされ、特定のディレクトリにパッケージ化されています。それは単なるファイルのセットです。 (ヘッダーパッケージは必ずしも現在の安定したカーネルバイナリパッケージと同じバージョンである必要はありません-ヘッダーパッケージは一般的なものであり、実行中の実際のカーネルよりも遅れることがあります。ただし、カーネルからのものであってはなりません。現在インストールされている(またはターゲット)カーネルよりも新しいバージョン。)

インストールされたカーネルバイナリは通常、ブートローダーバイナリと設定ファイルとともに/bootディレクトリにインストールされます。 (これは、デフォルトではマウントされない、独立したファイルシステムの場合もあります。)ファイルの正確な名前は、カーネルとディストリビューションによって異なります。 (ブートローダーもそうです。)

インストールされたカーネルモジュールは、以下のサブディレクトリにあります:

/lib/modules/`uname -r`/

たとえば、私のシステムでは、それらは現在

/lib/modules/3.1.4-gentoo/

完全なカーネルソースコード:Ubuntuでは、完全なカーネルソースでカーネルを自分で構築する場合は、指示に従ってインストールする必要があります こちら

また、kernel.orgからソースtarballをダウンロードしてどこかに解凍することもできます(このtarballを使用する場合は、Ubuntuがインストールしたファイルを上書きしますnot上書きします)。 RPM別で管理)。

/usr/src/linuxは、カーネルソースを配置する従来の場所ですが、カーネルソースを他の場所に配置することを妨げるものはありません。このパスは、ディレクトリへのシンボリックリンクである場合もあります。例えば私は自分のマシンにこれを持っています:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

シンボリックリンクは、カーネルソースに依存するアプリケーションの構築を簡単にするためにあります。そのパスを実行中の(またはターゲット)カーネルにリンクすると、モジュールをツリー外で構築するときに正確なバージョンまたはパス情報を指定する必要がなくなります。少なくともソースベースのディストリビューションの束を助けます。

30
Mat