GNU/Linux >> Linux の 問題 >  >> Linux

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

既存の .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

まとめ

イグナシオが述べたように、それはあなたの .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 ファイル内の機能を非対話的に有効にするにはどうすればよいですか?


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


    Linux
    1. Linuxカーネルとは何ですか?最新のカーネルにアップグレードする必要がありますか?

    2. Linux – Dmesgの仮想カーネルメモリレイアウトは何を意味しますか?

    3. Linux – Linuxカーネルで使用されているエントロピーソースは何ですか?

    1. Linux カーネルは __init 呼び出しの順序をどのように決定しますか?

    2. 現在の Linux カーネル ソースは何ですか?

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

    1. Linux –「makeLocalmodconfig」は何をしますか?

    2. Linuxカーネルヘッダーとは正確には何ですか?

    3. Linux で eth0 インターフェース名は何を意味しますか?