GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was genau macht make oldconfig im Makefile des Linux-Kernels?

Es liest den vorhandenen .config Datei, die für einen alten Kernel verwendet wurde, und fordert den Benutzer zur Eingabe von Optionen in der aktuellen Kernelquelle auf, die in der Datei nicht gefunden werden. Dies ist nützlich, wenn Sie eine vorhandene Konfiguration auf einen neuen Kernel verschieben.


Bevor Sie make oldconfig ausführen , müssen Sie eine Kernel-Konfigurationsdatei von einem älteren Kernel in das Stammverzeichnis des neuen Kernels kopieren.

Sie finden eine Kopie der alten Kernel-Konfigurationsdatei auf einem laufenden System unter /boot/config-3.11.0 . Alternativ hat der Kernel-Quellcode Konfigurationen in linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

Wenn sich Ihre Kernelquelle unter /usr/src/linux befindet :

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig

Zusammenfassung

Wie von Ignacio erwähnt, aktualisiert es Ihren .config für Sie, nachdem Sie die Kernel-Quelle aktualisiert haben, z. mit git pull .

Es versucht, Ihre bestehenden Optionen beizubehalten.

Ein Skript dafür zu haben ist hilfreich, weil:

  • möglicherweise wurden neue Optionen hinzugefügt oder alte entfernt

  • Das Kconfig-Konfigurationsformat des Kernels hat folgende Optionen:

    • implizieren einander über select
    • abhängig von einem anderen über depends

    Diese Optionsbeziehungen machen die manuelle Konfigurationsauflösung noch schwieriger.

Lassen Sie uns .config manuell ändern, um zu verstehen, wie es Konfigurationen auflöst

Erzeugen Sie zunächst eine Standardkonfiguration mit:

make defconfig

Bearbeiten Sie nun die generierte .config Datei manuell, um ein Kernel-Update zu emulieren und auszuführen:

make oldconfig

um zu sehen was passiert. Einige Schlussfolgerungen:

  1. Zeilentyp:

    # CONFIG_XXX is not set
    

    sind keine bloßen Kommentare, sondern zeigen tatsächlich an, dass der Parameter nicht gesetzt ist.

    Wenn wir zum Beispiel die Zeile entfernen:

    # CONFIG_DEBUG_INFO is not set
    

    und führen Sie make oldconfig aus , wird es uns fragen:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    Wenn es vorbei ist, die .config Datei wird aktualisiert.

    Wenn Sie irgendein Zeichen der Zeile ändern, z. bis # CONFIG_DEBUG_INFO , es zählt nicht.

  2. Zeilentyp:

    # CONFIG_XXX is not set
    

    werden immer zur Negation einer Eigenschaft verwendet, obwohl:

    CONFIG_XXX=n
    

    wird auch als Negation verstanden.

    Zum Beispiel, wenn Sie # CONFIG_DEBUG_INFO is not set entfernen und antworten:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    mit N , dann enthält die Ausgabedatei:

    # CONFIG_DEBUG_INFO is not set
    

    und nicht:

    CONFIG_DEBUG_INFO=n
    

    Auch wenn wir die Zeile manuell ändern zu:

    CONFIG_DEBUG_INFO=n
    

    und führen Sie make oldconfig aus , dann wird die Zeile geändert zu:

    # CONFIG_DEBUG_INFO is not set
    

    ohne oldconfig Fragen Sie uns.

  3. Konfigurationen, deren Abhängigkeiten nicht erfüllt sind, erscheinen nicht auf .config . Alle anderen tun es.

    Legen Sie beispielsweise fest:

    CONFIG_DEBUG_INFO=y
    

    und führen Sie make oldconfig aus . Es fragt uns jetzt nach:DEBUG_INFO_REDUCED , DEBUG_INFO_SPLIT , etc. configs.

    Diese Eigenschaften wurden auf defconfig nicht angezeigt vorher.

    Schauen wir unter lib/Kconfig.debug wo sie definiert sind, sehen wir, dass sie von DEBUG_INFO abhängen :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Also wenn DEBUG_INFO ausgeschaltet war, sind sie überhaupt nicht aufgetaucht.

  4. Konfigurationen, die selected sind durch eingeschaltete Konfigurationen werden automatisch gesetzt, ohne den Benutzer zu fragen.

    Wenn beispielsweise CONFIG_X86=y und wir entfernen die Zeile:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    und führen Sie make oldconfig aus , wird die Zeile neu erstellt, ohne uns zu fragen, im Gegensatz zu DEBUG_INFO .

    Dies geschieht, weil arch/x86/Kconfig enthält:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    und wählen Sie, dass diese Option wahr ist. Siehe auch:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. Configs, deren Constraints nicht erfüllt sind, werden abgefragt.

    Beispiel:defconfig eingestellt hatte:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Wenn wir bearbeiten:

    CONFIG_64BIT=n
    

    und führen Sie make oldconfig aus , wird es uns fragen:

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

    Das liegt daran, dass RCU_FANOUT ist bei init/Kconfig definiert als:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    Daher ohne 64BIT , der maximale Wert ist 32 , aber wir hatten 64 auf .config eingestellt , was es inkonsistent machen würde.

Boni

make olddefconfig setzt jede Option auf ihren Standardwert, ohne interaktiv zu fragen. Es wird automatisch auf make ausgeführt um sicherzustellen, dass .config ist konsistent, falls Sie es wie wir manuell geändert haben. Siehe auch:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfig ist wie make olddefconfig , akzeptiert aber auch ein zusammenzuführendes Konfigurationsfragment. Dieses Ziel wird von merge_config.sh verwendet Skript:https://stackoverflow.com/a/39440863/895245

Und wenn Sie den .config automatisieren möchten Modifikation, das ist nicht zu einfach:Wie schalten Sie Funktionen in einer Linux-Kernel-.config-Datei nicht interaktiv ein?


Aktualisiert eine alte Konfiguration mit neuen/geänderten/entfernten Optionen.


Linux
  1. Was ist Linux-Kernel und sollten Sie auf den neuesten Kernel aktualisieren?

  2. Was bedeutet __init im Linux-Kernel-Code?

  3. Wie bestimmt der Linux-Kernel die Reihenfolge der __init-Aufrufe?

  4. Was bedeutet &am Ende eines Linux-Befehls?

  5. Was ist der Vorteil, wenn Sie Ihren eigenen Linux-Kernel kompilieren?

Erkundung des Linux-Kernels:Die Geheimnisse von Kconfig/kbuild

Was ist der Unterschied zwischen macOS- und Linux-Kernels

Was ist die Shell unter Linux?

Was ist die Linux-Prozesstabelle? Woraus besteht es?

Was bedeutet der Schnittstellenname eth0 unter Linux?

Wie lädt Linux das 'initrd'-Image?