ターゲット「oldconfig」がLinuxカーネルのメイクファイルで正確に何をするのかを誰でも説明できますか?私はそれがいくつかのビルドドキュメントで参照されているのを見ますが、それが正確に何をするかを決して説明しませんでした。
既存の.config
ファイルを読み取り、ファイルにない現在のカーネルソースのオプションをユーザーに求めます。これは、既存の構成を取得して新しいカーネルに移動するときに役立ちます。
make oldconfig
を実行する前に、カーネル構成ファイルを古いカーネルから新しいカーネルのルートディレクトリにコピーする必要があります。
実行中のシステム上の古いカーネル構成ファイルのコピーは、/boot/config-3.11.0
にあります。または、カーネルソースコードのlinux-3.11.0/Arch/x86/configs/{i386_defconfig / x86_64_defconfig}
に構成があります
カーネルソースが/usr/src/linux
にある場合:
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
概要
by Ignacio で述べたように、カーネルソースを更新すると、.config
が更新されます。 git pull
で。
既存のオプションを保持しようとします。
そのためのスクリプトがあると便利です:
新しいオプションが追加されたか、古いオプションが削除された可能性があります
カーネルのKconfig構成形式には、次のオプションがあります。
select
を介して互いに暗示するdepends
を介して別のものに依存するこれらのオプションの関係により、手動の構成解決がさらに難しくなります。
.configを手動で変更して、構成を解決する方法を理解しましょう
最初にデフォルト設定を生成します:
make defconfig
生成された.config
ファイルを手動で編集して、カーネルの更新をエミュレートして実行します:
make oldconfig
何が起こるかを見るために。いくつかの結論:
タイプの行:
# CONFIG_XXX is not set
は単なるコメントではなく、実際にはパラメータが設定されていないことを示しています。
たとえば、次の行を削除した場合:
# CONFIG_DEBUG_INFO is not set
make oldconfig
を実行すると、次のメッセージが表示されます。
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
終了すると、.config
ファイルが更新されます。
行の文字を変更した場合、例えば# CONFIG_DEBUG_INFO
には、カウントされません。
タイプの行:
# CONFIG_XXX is not set
ただし、プロパティの否定には常に使用されますが、
CONFIG_XXX=n
は否定としても理解されます。
たとえば、# CONFIG_DEBUG_INFO is not set
を削除して答える場合:
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
N
の場合、出力ファイルには以下が含まれます。
# CONFIG_DEBUG_INFO is not set
ではなく:
CONFIG_DEBUG_INFO=n
また、行を手動で次のように変更した場合:
CONFIG_DEBUG_INFO=n
make oldconfig
を実行すると、行は次のように変更されます。
# CONFIG_DEBUG_INFO is not set
oldconfig
を求めずに。
依存関係が満たされていない構成は、.config
に表示されません。他のすべてが行います。
たとえば、次を設定します。
CONFIG_DEBUG_INFO=y
make oldconfig
を実行します。 DEBUG_INFO_REDUCED
、DEBUG_INFO_SPLIT
などの設定を求められます。
これらのプロパティは、以前のdefconfig
には表示されませんでした。
定義されているlib/Kconfig.debug
の下を見ると、DEBUG_INFO
に依存していることがわかります。
config DEBUG_INFO_REDUCED
bool "Reduce debugging information"
depends on DEBUG_INFO
したがって、DEBUG_INFO
がオフの場合、それらはまったく表示されませんでした。
オンになっている構成によってselected
である構成は、ユーザーに確認することなく自動的に設定されます。
たとえば、CONFIG_X86=y
の場合、次の行を削除します。
CONFIG_Arch_MIGHT_HAVE_PC_PARPORT=y
make oldconfig
を実行すると、DEBUG_INFO
とは異なり、私たちに尋ねることなく行が再作成されます。
これは、Arch/x86/Kconfig
に以下が含まれているために発生します。
config X86
def_bool y
[...]
select Arch_MIGHT_HAVE_PC_PARPORT
そして、selectはそのオプションをtrueにします。参照: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
制約が満たされていない構成が求められます。
たとえば、defconfig
は以下を設定していました。
CONFIG_64BIT=y
CONFIG_RCU_FANOUT=64
編集する場合:
CONFIG_64BIT=n
make oldconfig
を実行すると、次のメッセージが表示されます。
Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
これは、RCU_FANOUT
がinit/Kconfig
で次のように定義されているためです。
config RCU_FANOUT
int "Tree-based hierarchical RCU fanout value"
range 2 64 if 64BIT
range 2 32 if !64BIT
したがって、64BIT
がない場合、最大値は32
ですが、64
に.config
が設定されているため、一貫性がなくなります。
ボーナス
make olddefconfig
は、対話形式で問い合わせることなく、すべてのオプションをデフォルト値に設定します。 make
で自動的に実行され、私たちが行ったように手動で変更した場合に.config
の一貫性を確保します。参照: https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
はmake olddefconfig
と似ていますが、マージする構成フラグメントも受け入れます。このターゲットは、merge_config.sh
スクリプトによって使用されます。 https://stackoverflow.com/a/39440863/895245
.config
の変更を自動化する場合、それはそれほど単純ではありません。 Linuxカーネルの.configファイルの機能を非対話的にオンにするにはどうすればよいですか?
新しい/変更/削除されたオプションで古い構成を更新します。
これから ページ :
Oldconfigが.configを取得し、Kconfigファイルのルールに従って実行し、Kconfigルールに一致する.configを生成します。欠落しているCONFIG値がある場合、make oldconfigはそれらを要求します。
.configがすでにKconfigにあるルールと一致している場合、make oldconfigは基本的にノーオペレーションです。
Make oldconfigを実行してからmake oldconfigを2回実行した場合、2回目には追加の変更は行われません。
拷問です。汎用のconfファイルを含める代わりに、returnキーを9000回クリックして生成します。