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


25

ブックでは、私は一般的にLinuxのソースツリーへの参照を読んで/usr/src/linux、サブディレクトリの通常のセットで(archblockcrypto、...)。

このツリーには、カーネルを構成するバイナリファイルが含まれていると予想していました。私のシステム(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だけですか?

回答:


30

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

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

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

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

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

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

/lib/modules/`uname -r`/

例えば私のシステムでは、彼らは現在

/lib/modules/3.1.4-gentoo/

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

また、ソースのtarballをダウンロードしkernel.orgてどこかで展開することもできます(このtarballを使用する場合は、Ubuntuがインストールしたファイルを上書きしないでください。

/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

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


この詳細でかなり完全な回答をありがとうございます。これはしばらくの間私を悩ませていました。私の歓迎を過度に拡張していない場合、そして時間を見つけた場合、親切に追加することができます:(a)上記の私の場合(自己インストールされたカーネルではない)ディレクトリには、カーネルCおよびアセンブラーのソースコードが含まれている必要があります。それはどこにありますか-完全なリストではなく、サブディレクトリの20-30のブラウジングのように、私は1つにも出くわしませんでしたか?kernel.orgからカーネルソースファイルをダウンロードしました。私のシステムをよりよく理解することを意味します。(b)...
gnometorule

...それでは、私の場合のように、自分でカーネルをインストールしない場合、(一般的に)カーネルバイナリはどこにありますか?(c)私が「linux-generic-headers」として取得した「header packages」を参照します。それらのパッケージから見えるツリーはありますか?はいの場合、ソースツリーをインストールする前にどこにでも再配置しますか?どうもありがとう。
gnometorule

(私は、少なくともあなたの助けのためにもう一度あなたをupvoteすることができますので、あなたは、使用」answer'notコメントに答える場合)
gnometorule

少し拡大しました。ヘッダーパッケージはヘッダー用です。完全なソースパッケージは完全なソースコードを提供します。バイナリパッケージはバイナリのみを提供します。
マット

5
linux-sourceアップストリームソースが含まれ、apt-get source linux-image-$(uname -r)Ubuntuのパッチを含むカーネルのソースを取得します。
レケンステイン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.