it-swarm.com.de

Was macht "make oldconfig" genau im Linux-Kernel-Makefile?

Kann jemand erklären, was das Ziel "oldconfig" im Linux-Kernel-Makefile genau macht? In einigen Build-Dokumentationen wird darauf verwiesen, aber es wurde nie erklärt, was genau es tut.

64
fred basset

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

107

Bevor Sie 'make oldconfig' ausführen, müssen Sie eine Kernelkonfigurationsdatei aus einem älteren Kernel in das Stammverzeichnis des neuen Kernels kopieren.

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

Wenn sich Ihre Kernel-Quelle unter/usr/src/linux befindet

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

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 Optionen entfernt

  • das Kconfig-Konfigurationsformat des Kernels bietet folgende Optionen:

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

    Diese Optionsbeziehungen machen die manuelle Konfigurationsauflösung noch schwieriger. 

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

Generieren Sie zunächst eine Standardkonfiguration mit:

make defconfig

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

make oldconfig

um zu sehen was passiert. Einige Schlussfolgerungen:

  1. Zeilen des Typs:

    # CONFIG_XXX is not set
    

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

    Wenn wir zum Beispiel die Zeile entfernen:

    # CONFIG_DEBUG_INFO is not set
    

    und make oldconfig ausführen, werden wir gefragt:

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

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

    Wenn Sie ein Zeichen der Zeile ändern, z. zu # CONFIG_DEBUG_INFO zählt es nicht.

  2. Zeilen des Typs:

    # CONFIG_XXX is not set
    

    werden immer für die Negation einer Eigenschaft verwendet, obwohl:

    CONFIG_XXX=n
    

    wird auch als negation verstanden.

    Wenn Sie beispielsweise # CONFIG_DEBUG_INFO is not set entfernen und antworten:

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

    mit N enthält die Ausgabedatei:

    # CONFIG_DEBUG_INFO is not set
    

    und nicht:

    CONFIG_DEBUG_INFO=n
    

    Auch wenn wir die Zeile manuell ändern:

    CONFIG_DEBUG_INFO=n
    

    und make oldconfig ausführen, dann wird die Zeile folgendermaßen geändert:

    # CONFIG_DEBUG_INFO is not set
    

    ohne oldconfig uns zu fragen.

  3. Konfigurationen, deren Abhängigkeiten nicht erfüllt sind, werden nicht im .config angezeigt. Alle anderen tun es.

    Zum Beispiel:

    CONFIG_DEBUG_INFO=y
    

    und make oldconfig ausführen. Es fordert uns nun auf: DEBUG_INFO_REDUCED, DEBUG_INFO_SPLIT, usw. configs.

    Diese Eigenschaften wurden zuvor nicht in der Variablen defconfig angezeigt.

    Wenn wir unter lib/Kconfig.debug suchen, 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
    

    Wenn DEBUG_INFO ausgeschaltet war, wurden sie überhaupt nicht angezeigt.

  4. Konfigurationen, bei denen es sich um selected bei eingeschalteten Konfigurationen handelt, werden automatisch festgelegt, ohne dass der Benutzer dazu aufgefordert wird.

    Wenn zum Beispiel CONFIG_X86=y und wir entfernen die Zeile:

    CONFIG_Arch_MIGHT_HAVE_PC_PARPORT=y
    

    und make oldconfig ausführen, wird die Zeile im Gegensatz zu DEBUG_INFO ohne Rückfrage neu erstellt.

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

    config X86
        def_bool y
        [...]
        select Arch_MIGHT_HAVE_PC_PARPORT
    

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

  5. Konfigs, deren Einschränkungen nicht erfüllt sind, werden gefragt.

    Zum Beispiel hatte defconfig Folgendes festgelegt:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Wenn wir bearbeiten:

    CONFIG_64BIT=n
    

    und make oldconfig ausführen, werden wir gefragt:

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

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

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

    Daher ist ohne 64BIT der Höchstwert 32, aber wir hatten 64 für .config festgelegt, was dazu führen würde, dass er inkonsistent ist.

Boni

make olddefconfig setzt jede Option auf ihren Standardwert, ohne interaktiv zu fragen. Es wird automatisch auf make ausgeführt, um sicherzustellen, dass der .config konsistent ist, falls Sie ihn wie von uns 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 jedoch auch ein Konfigurationsfragment zum Zusammenführen. Dieses Ziel wird vom merge_config.sh-Skript verwendet: https://stackoverflow.com/a/39440863/895245

Und wenn Sie die .config-Modifikation automatisieren möchten, ist das nicht zu einfach: Wie können Sie Funktionen in einer Linux-Kernel-.config-Datei nicht interaktiv aktivieren?

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

5
Let_Me_Be

Von dieser Seite

Make oldconfig nimmt die .config und führt sie durch die Regeln von Kconfig Dateien und erzeugt eine .config, die mit der .__ übereinstimmt. Kconfig-Regeln Wenn CONFIG-Werte fehlen, wird der make oldconfig fragt danach. 

Wenn die .config bereits mit den in Kconfig gefundenen Regeln übereinstimmt, dann ist oldconfig im Grunde ein No-Op.

Wenn Sie make oldconfig ausführen möchten, führen Sie dann oldconfig a .__ aus. Beim zweiten Mal bewirkt das zweite Mal keine weiteren Änderungen gemacht.

2
Nan Xiao

Es ist Folter. Anstatt eine generische conf-Datei einzuschließen, drücken Sie 9000-mal, um eine zu generieren.

0
Danial