カスタムカーネル(Debian)用にコンパイルするには?

カスタムカーネル(Debian)用にコンパイルするには?

version.hにファイルがあります/usr/include/linux。多くのヘッダーファイルにはこのdefinesファイルが含まれていますifdefs

しかし、私のカーネルをコンパイルするときにそれを適切に反映する方法はわかりません version.h

実際、これはすべてのカーネル関連ヘッダファイルに適用されます。 AFAICSは、常に実行中のカーネルまたは通過する/usr/include/linuxカーネルではなく、ディストリビューションに付属のカーネルを表します。makeSYSSRC

過去に私は自分のカーネルソースへのシンボリックリンクを作成する方法を使用していましたが、これが正しいアプローチではないと思います。

これはどのように機能しますか?カスタムカーネル(カーネルモジュールなど)をどのようにコンパイルしますか?

ベストアンサー1

カスタムカーネル用にシステムを設定するときは、変更されたカーネルソースの現在のバージョンに名前を追加することをお勧めします。

たとえば、Armbianでは独自のカーネルパッケージを作成し、kernel.releaseに-sunxiを追加します。

4.6.3 カーネルバージョンの修正を例にしてみましょう。

root@ruir:/usr/src/linux-headers-4.6.3-sunxi# grep -ri 4.6.3-sunxi *
include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi

また、カーネルモジュールの場合は、次の場所にあります/lib/modules/4.6.3-sunxi/build

include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/auto.conf.cmd:ifneq "$(KERNELVERSION)" "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi

(望むよりARM / Arbian Jessieにsysdigをインストールする - カーネルバージョンが正しくコンパイルされたモジュール)

私たちが見たように、これは次のように行うことができますuname -r

$uname -r
4.6.3-sunxi

カスタムカーネルパッケージの場合:

$dpkg -l | grep sunxi
ii  linux-dtb-next-sunxi             5.16                                  armhf        Linux DTB, version 4.6.3-sunxi
ii  linux-firmware-image-next-sunxi  5.16                                  armhf        Linux kernel firmware, version 4.6.3-sunxi
ii  linux-headers-next-sunxi         5.16                                  armhf        Linux kernel headers for 4.6.3-sunxi on armhf
ii  linux-image-next-sunxi           5.16                                  armhf        Linux kernel, version 4.6.3-sunxi

独自のコンパイルされたカーネルヘッダーを追加する方法については、以下を参照してください。カーネルヘッダファイル(太字は私が強調したものです。)マイナーカーネルバージョンを置き換える場合make headers_install

ユーザー空間プログラム

通常、ユーザー空間プログラムは、ディストリビューションによって提供されるヘッダーファイル、通常は glibc-devel、glibc-kernheaders、または linux-libc-dev というパッケージから構築されます。これらのヘッダーファイルは通常古いカーネルバージョンから取得され、glibcを再構築しない限り安全に置き換えることはできません。特に /usr/src/linux/include または /lib/modules/*/build/include/linux へのシンボリックリンクとして /usr/include/linux をインストールしないことをお勧めします。アプリケーションの再構築が中断されることが多いからです。 。たとえば、古いカーネルには、Arch/${arch}/include/asm ではなく include/asm-${arch} にアーキテクチャ固有のヘッダファイルがあり、アーキテクチャ固有のディレクトリへのシンボリックリンクがあります。

デプロイ用ヘッダーをパッケージ化する正しい方法は、カーネルソースディレクトリで "make headers_install" を実行してヘッダーを /usr/include にインストールし、特定のバージョン用にインストールされたばかりのカーネルヘッダーに依存して C ライブラリパッケージを再構築することです。 。 。

たとえば、プログラムがパッチ適用されたカーネルまたは最新のカーネルでのみ実行されるため、一部のカーネルヘッダーファイルの特定のバージョンに依存するユーザースペースプログラムをデプロイする場合は、/usr/includeにあるヘッダーファイルを使用できません。また、/usr/src/linux/includeまたは/lib/modules/*/build/include/にあるヘッダーファイルは、ユーザースペースに含める準備ができていないため使用できません。これを試みると、カーネルが警告し、このwikiページを教えてくれます。この問題を解決する正しい方法は、新しいカーネルにパッチされた単一のヘッダーファイルなど、必要な特定のインタフェースを分離して、プログラムで使用される文字デバイスにioctl番号を提供することです。自分のプログラムにこのソースファイルのコピーを追加し、新しいカーネルバージョンと同期を維持する必要があることに注意してください。あなたのプログラムがGPLv2に基づいてライセンスされていない場合は、ファイル作成者から自分のプログラムライセンスに従って配布することを許可されていることを確認してください。プログラムは通常のカーネルにはないかもしれないカーネルインターフェイスに依存しているので、カーネルがインターフェイスを理解し、古いインターフェイスに戻ることなく有用なエラーメッセージを提供することを確認するためにランタイムチェックを追加することをお勧めします。

カーネルの開発にも便利です。あるいは、複数のバージョンのカーネルがインストールされている別のカーネルまたは異なるサーバー用のカーネル/モジュールをコンパイルするときは、SYSSRCを使用して代替カーネルソースの場所を指定できます。

おすすめ記事