web-dev-qa-db-ja.com

独自のLinuxカーネルをコンパイルする利点は何ですか?

Linuxカーネルを自分でコンパイルすることで、どのようなメリットがありますか?ハードウェアに合わせてカスタマイズすることで効率を上げることができますか?

107
jjclarkson

私の考えでは、独自のLinuxカーネルをコンパイルすることで得られる唯一の利点は、次のとおりです。

独自のLinuxカーネルをコンパイルする方法を学びます。

それはあなたが必要とするものではありませんより高速/メモリ/ xxx何でもします。それがあなたが開発の段階にいると感じる段階であるなら、それは価値あることです。この「オープンソース」の全体が何であるか、カーネルのさまざまな部分がどのようにどのようなものであるかについてより深く理解したい場合は、それを試してみてください。起動時間を3秒だけ高速化したい場合は、...要点は... SSDを購入してください。興味があるなら、あなたが学びたいなら、あなた自身のカーネルをコンパイルすることは素晴らしいアイデアであり、おそらくそれから多くを得るでしょう。

とはいえ、独自のカーネルをコンパイルすることが適切である場合には、いくつかの特定の理由があります(他の回答で指摘されている人もいます)。一般に、これらは特定の結果に対する特定のニーズから生じます。次に例を示します。

  • リソースが限られたハードウェアでシステムを起動/実行する必要がある
  • パッチをテストして、開発者にフィードバックを提供する必要があります
  • 競合を引き起こしているものを無効にする必要があります
  • Linuxカーネルを開発する必要がある
  • サポートされていないハードウェアのサポートを有効にする必要があります
  • システムの現在の制限に達しているため、xのパフォーマンスを向上させる必要があります(そして、私は何をしているのかを知っています)

問題は、すべてが本来の方法ですでに機能している場合に、独自のカーネルをコンパイルすることには本質的な利点があるという考えにあり、私はそうは思わない。必要のないものを無効にして調整可能なものを微調整するのに数え切れないほどの時間を費やすことができますが、事実、Linuxカーネルは(ディストリビューションによって)mostユーザーの状況。

75
gabe.

ほとんどのユーザーは独自のカーネルをコンパイルする必要はありません。ディストリビューションはこの作業をユーザーのために行っています。通常、ディストリビューションには、ディストリビューションの動作の特定の部分と統合する一連のパッチ、デバイスドライバーのバックポート、および新しいがリリースされていないバージョンのカーネルまたはユーザーが開発している機能が含まれます。

独自のカーネルをコンパイルする場合、いくつかのオプションがあります。公式のLinus Torvaldsカーネルをコンパイルできます。これには、ディストリビューションによって追加されたパッチやカスタマイズ(善または悪の可能性があります)は含まれません。ディストリビューションの再構築ツールを使用して、独自のカーネルを構築します。

カーネルを再構築する必要がある理由は次のとおりです。

  • バグ全体にパッチを当てたり、本番システムに特定の機能を追加したりする場合。1つまたは2つの修正でカーネル全体をアップグレードするリスクを実際には負うことはできません。
  • 特定のデバイスドライバーまたは新機能を試すには
  • カーネルを拡張するには、それに取り組みます
  • 「アルファ」モジュールまたは機能の一部をテストする。

多くの開発者は、それを使用して、特別なデバイスドライバーが必要な場合や、不要な機能を削除したい場合に、組み込みシステムやセットトップボックス用のカーネルのカスタムバージョンを作成します。

36
miguel.de.icaza

カーネルを自分でコンパイルすると、コンピュータに関連する部分のみを含めることができるため、特に起動時に、カーネルが小さくなり、潜在的に高速になります。汎用カーネルは、できるだけ多くのハードウェアのサポートを含める必要があります。ブート時に、コンピューターに接続されているハードウェアを検出して適切なモジュールをロードしますが、すべてを実行するには時間がかかり、コードをカーネルに直接焼き付けるのではなく、動的モジュールをロードする必要があります。コンピューターにCPUが1つしかない場合にカーネルが400の異なるCPUをサポートするようにしたり、Bluetoothマウスがない場合にBluetoothマウスをサポートしたりする必要はありません。解放できるスペースはすべて無駄になります。

30
Michael Mrozek

私がここで受け入れられた答えが「もっとスピード/メモリ/ xxxのためにあなたがする必要があるものではない」と言っているのを信じることはできません。

これは完全に誤りです。カーネルを定期的にカスタムビルドして、不要なコードを削除するだけでなく、主にハードウェアに関連するパフォーマンス強化コードを含めるようにしました。たとえば、一部の古いハードウェアを実行しており、このビルトインが搭載されている一部の古いMoBosでHPT36xチップセットサポートなど、めったに有効化されていないカーネルドライバーを有効にすることで、パフォーマンスの向上を試すことができます。

別の例として、Slackwareの下のBIG SMPがデフォルトであり、たとえばDell 2800では、かなり大きなフットプリントを消費して(カーネルモジュールとしてではなく)GFSDを実行します。必要ありません。同様にNFSDと他のキャッチオールがすべての考え方を喜ばせるために、Linuxを箱に入れて実行しようとしているだけなら問題ありませんが、「速度/メモリー/ xxx何でも」に関心がある場合、これらは重要であり機能します。

私のプロダクションボックスはすべてカスタムカーネルです。 Dellシリーズ(2800、2850、2900など)などの一般的なハードウェアを使用している場合は、カーネルの.configファイルを各ボックスにコピーし、カーネルをコンパイルしてインストールするだけです。

24
Eric

以下に、独自のカーネルをコンパイルすることが役立つ状況をいくつか示します。

  • モジュールの読み込みを無効にしたカーネルはより安全です。これには、モジュールとしてコンパイルするのではなく、必要なモジュールを選択してカーネルの一部として含める必要があります。

  • / dev/kmemのサポートを無効にするか、適切なコンパイラオプションを使用してサポートを無効にすることは、セキュリティの面で優れています。ほとんどのディストリビューションでは、デフォルトでこれを行っていると思います。

  • 可能な場合は、initrdを使用したくない。カーネルをブート元のハードウェアにカスタマイズすると、initrdが不要になります。

  • 後のバージョンのカーネルには必要な機能が含まれていることがありますが、これは今日では非常にまれです。私が最初にDebianを使い始めたときは2.4カーネルを使っていましたが、udevサポートには2.6カーネルが必要でした。

  • 不要なネットワークプロトコル/オプションを無効にすると、TCP/IPのパフォーマンスが向上します。

  • 不要なオプションを無効にすると、カーネルのメモリフットプリントが低下します。これは、低RAM環境で重要です。256MBを使用している場合RAMルータ、これは役立ちます。

  • / dev内のすべての「tty」デバイスは、一般的にシリアルまたはsshを介してのみログインするシステムの迷惑なものです。

14
LawrenceC

独自のカーネルをコンパイルすると、カーネル開発プロセスに参加できます。これは、新しいデバイスを機能させる既存のドライバーにPCI/USBデバイスIDを提供するなどの単純なものであるかどうかに関係なく、コアの争いに深く関与しますカーネル開発。

また、ハードウェアで開発カーネルをテストし、リグレッションに気付いた場合にフィードバックを提供することもできます。これは、珍しいハードウェアを使用している場合に特に役立ちます。ディストリビューションカーネルを待つ場合、問題レポートからの修正が新しいディストリビューションカーネルリリースにフィルター処理されるまでに時間がかかる場合があります。

個人的には、自分のカーネルをコンパイルして、自分が持っているハードウェアのみのサポートを含めることも好きです。ディストリビューションカーネルを実行してlsmod(8)の出力を見ると、持っていないハードウェア用に読み込まれたモジュールがたくさんあります。これは、モジュールリスト、/ proc、/ sys、およびログを汚染する可能性があるため、何かを検索しているときに、ノイズの中に隠れてしまう可能性があります。また、これらのモジュールが診断しようとしている問題の原因となっていないことを100%確信することはできません。

7
camh

私はgabe。の2番目の回答です(コメントが長すぎるため、回答として投稿しています)。

非常に特殊な目的(組み込みマシン、厳密なセキュリティプロファイリングなど)がない限り、自分のカーネルをコンパイルすることには、それがどのように行われるかを確認する以外に実際的なメリットはありません。オプションを系統的にレビューすることにより、システムを構築するためにオプションが相互にどのように相互作用するかを確認することは、システムの動作を理解するための優れた方法です。達成しようとしているタスクの目的が何もないように見えるコンポーネントを削除しようとすると、驚くべき結果が得られます。

ただし注意してください。うさぎの穴を飛び降りるのは間違いなく爽快で、あなたが考えているよりも多くの夜と週末を取り戻します。

6
gvkv

職場では、vserverやunionfsなどのツリー外パッチを適用するために、手作業のカーネルを使用しています。

自宅では、経験しているバグを導入したコミットを見つけるために、手作業でカーネルをコンパイルしています。それが終わったら、ディストリビューション(Debian)でバグが修正されるまで、手作業のカーネルを使用します。その時点で、再びカーネルに戻ります。

3
jmtd

このスレッドは古くなっていますが、質問があったときと同じように、今日でも有効です!

答えは次のとおりです。あなたはあなたのニーズと要件に従ってあなたが選んだLinuxカーネルをコンパイルします。

多くのシナリオが有効です:

  1. あなたはエンジニアであり、システムのパフォーマンスとセキュリティの要件/要求を満たすためにビルドを必要とし、指定された基準を満たすため、および/または超えるために再コンパイルします。

  2. あなたは通常のユーザーであり、できる限り長く使い続けたい古いシステムを持っています。古いシステムを最適化しておくために、コンポーネントを追加/削除するために再コンパイルします。

  3. 最新の最速ハードウェアを使用している通常のユーザーであり、十分なメモリ/ RAMを備えている。再コンパイルする必要はありませんが、システムについてもう少し詳しく知りたい場合は、再コンパイルできます。

  4. MicrosoftやMacの日常的なユーザーのようになりたいだけで、再コンパイルせずに、上流のディストリビューションからのアップデートをそのまま使用してください。

  5. 今後のシナリオを続ける:-)

Mac/Windowsユーザーとは異なり、Linuxが提供するのは選択肢です。簡単にするか、要件に合わせてシステムを最適化するかの選択。

2
user4565

カスタムコンパイルカーネルを使用するためにここで言及した多くのケースのほかの別のケースは、モジュールのロードが実行できず、特定のタスクのために完全に機能するカーネルを特定のマシンに渡す必要がある特殊なネットワークブート環境をセットアップすることです。

1
Caleb

カスタムカーネルをコンパイルするこの理由について誰も言及しなかったことに驚いています。

別のC/c ++コンパイラを使用したいからです。 GCCはLinuxカーネルのコンパイルに非常に適しています。しかし、そこには非常に優れたコンパイラがあります! GCCの最適化は、IntelのC/C++コンパイラより少し遅れています。また、インテルはパフォーマンスプリミティブライブラリとvtuneツールを提供しています。どちらも、高性能のLinuxカーネルを作成するために不可欠です。ここまでは、GCCとG ++でしか取得できません。実際には、何をしても結果はコンパイラーによって制限されます。それで、私はIntelコンパイラーとパフォーマンスライブラリを使用します。これは少し大きいです-1.5GBのダウンロードですが、これは良いコンパイラーに何が含まれているのかについて少し考えを与えます。

インテルのC/C++コンパイラーは、非営利目的で無料で利用できます。しかし、インテルのWebサイトを検索するには、非商用ライセンスのインテルc ++コンパイラダウンロードページをググる方が簡単です。通常、GCC/G ++は何にも使用しません。そして、あなたはプログラマーである必要はありません。環境を設定し、makeファイルの2行をIntelのコンパイラを指すように変更するだけです。

次に、いくつかの深刻な速度を得ることができます!

1
SwanSword

ほとんどの用途で、一般的なカーネルはほとんどすべてのハードウェアに適しています。さらに、通常はディストリビューション固有のパッチが含まれているため、独自のカーネルをコンパイルすると問題が発生する可能性があります。

独自のカーネルをコンパイルする理由は次のとおりです。

  • ソースベースのディストリビューションを使用しているため、「汎用」カーネルはありません
  • あなたはカーネル開発者であり、カーネルを開発しています
  • ハードドライブが非常に限られている組み込みデバイスなどのカーネルをカスタマイズする必要があります
  • 一部のドライバーはコンパイルされていません(非常にまれなケース)
  • カーネルにパッチを適用したい[〜#〜] and [〜#〜]何をしているか知っている
  • カーネルのコンパイル方法を学びたい

ソースベースのディストリビューションを使用していなかった場合、カーネルをまったくコンパイルしませんでした。

1