version.h
にファイルがあります/usr/include/linux
。多くのヘッダーファイルにはこのdefines
ファイルが含まれていますifdefs
。
しかし、私のカーネルをコンパイルするときにそれを適切に反映する方法はわかりません version.h
。
実際、これはすべてのカーネル関連ヘッダファイルに適用されます。 AFAICSは、常に実行中のカーネルまたは通過する/usr/include/linux
カーネルではなく、ディストリビューションに付属のカーネルを表します。make
SYSSRC
過去に私は自分のカーネルソースへのシンボリックリンクを作成する方法を使用していましたが、これが正しいアプローチではないと思います。
これはどのように機能しますか?カスタムカーネル(カーネルモジュールなど)をどのようにコンパイルしますか?
答え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を使用して代替カーネルソースの場所を指定できます。