web-dev-qa-db-ja.com

Linuxカーネルのmakefileで「make oldconfig」が正確に行うことは何ですか?

ターゲット「oldconfig」がLinuxカーネルのメイクファイルで正確に何をするのかを誰でも説明できますか?私はそれがいくつかのビルドドキュメントで参照されているのを見ますが、それが正確に何をするかを決して説明しませんでした。

70
fred basset

既存の.configファイルを読み取り、ファイルにない現在のカーネルソースのオプションをユーザーに求めます。これは、既存の構成を取得して新しいカーネルに移動するときに役立ちます。

111

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
21
Angelo Babudro

概要

by Ignacio で述べたように、カーネルソースを更新すると、.configが更新されます。 git pullで。

既存のオプションを保持しようとします。

そのためのスクリプトがあると便利です:

  • 新しいオプションが追加されたか、古いオプションが削除された可能性があります

  • カーネルのKconfig構成形式には、次のオプションがあります。

    • selectを介して互いに暗示する
    • dependsを介して別のものに依存する

    これらのオプションの関係により、手動の構成解決がさらに難しくなります。

.configを手動で変更して、構成を解決する方法を理解しましょう

最初にデフォルト設定を生成します:

make defconfig

生成された.configファイルを手動で編集して、カーネルの更新をエミュレートして実行します:

make oldconfig

何が起こるかを見るために。いくつかの結論:

  1. タイプの行:

    # 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には、カウントされません。

  2. タイプの行:

    # 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を求めずに。

  3. 依存関係が満たされていない構成は、.configに表示されません。他のすべてが行います。

    たとえば、次を設定します。

    CONFIG_DEBUG_INFO=y
    

    make oldconfigを実行します。 DEBUG_INFO_REDUCEDDEBUG_INFO_SPLITなどの設定を求められます。

    これらのプロパティは、以前のdefconfigには表示されませんでした。

    定義されているlib/Kconfig.debugの下を見ると、DEBUG_INFOに依存していることがわかります。

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    したがって、DEBUG_INFOがオフの場合、それらはまったく表示されませんでした。

  4. オンになっている構成によって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

  5. 制約が満たされていない構成が求められます。

    たとえば、defconfigは以下を設定していました。

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    編集する場合:

    CONFIG_64BIT=n
    

    make oldconfigを実行すると、次のメッセージが表示されます。

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    これは、RCU_FANOUTinit/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 alldefconfigmake olddefconfigと似ていますが、マージする構成フラグメントも受け入れます。このターゲットは、merge_config.shスクリプトによって使用されます。 https://stackoverflow.com/a/39440863/895245

.configの変更を自動化する場合、それはそれほど単純ではありません。 Linuxカーネルの.configファイルの機能を非対話的にオンにするにはどうすればよいですか?

新しい/変更/削除されたオプションで古い構成を更新します。

5
Let_Me_Be

これから ページ

Oldconfigが.configを取得し、Kconfigファイルのルールに従って実行し、Kconfigルールに一致する.configを生成します。欠落しているCONFIG値がある場合、make oldconfigはそれらを要求します。

.configがすでにKconfigにあるルールと一致している場合、make oldconfigは基本的にノーオペレーションです。

Make oldconfigを実行してからmake oldconfigを2回実行した場合、2回目には追加の変更は行われません。

2
Nan Xiao

拷問です。汎用のconfファイルを含める代わりに、returnキーを9000回クリックして生成します。

0
Danial