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

81

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

Fred Basset
quelle

Antworten:

125

Es liest die vorhandene .configDatei 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.

Ignacio Vazquez-Abrams
quelle
Vielen Dank, sehr hilfreich.
Fred Basset
Hallo, ich habe mit U-Boot-Code getestet (es verwendet auch Kconfig). Ich habe 'make menuconfig' verwendet und auf Arm Architecture gesetzt (und eine neue .config-Datei wurde generiert. Die Standardarchitektur ist Sandbox.). dann habe ich 'menuconfig gemacht' und festgestellt, dass die Armarchitektur immer noch ausgewählt war. Wenn es also .config gibt, beginnt 'make menuconfig' mit dieser .config-Datei. Sind die Ziele 'menuconfig' und 'oldconfig' also gleich?
Chan Kim vor
25

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

Eine Kopie der alten Kernel-Konfigurationsdatei auf einem laufenden System finden Sie unter /boot/config-3.11.0. Alternativ enthält der Kernel-Quellcode Konfigurationenlinux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

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

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
Angelo Babudro
quelle
3
Bauen Sie den Kernel nicht als Root! siehe youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
am
24

Zusammenfassung

Wie von Ignacio erwähnt , aktualisiert es Ihre .configfür Sie, nachdem Sie die Kernelquelle aktualisiert haben, z git pull. B. mit .

Es wird versucht, Ihre vorhandenen 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 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 .configDatei manuell, um ein Kernel-Update zu emulieren und auszuführen:

make oldconfig

um zu sehen, was passiert. Einige Schlussfolgerungen:

  1. Zeilen vom Typ:

    # CONFIG_XXX is not set
    

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

    Zum Beispiel, wenn wir die Zeile entfernen:

    # CONFIG_DEBUG_INFO is not set
    

    und renn make oldconfig, es wird uns fragen:

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

    Wenn es vorbei ist, wird die .configDatei aktualisiert.

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

  2. Zeilen vom Typ:

    # 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 entfernen # CONFIG_DEBUG_INFO is not setund 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
    

    Wenn wir die Zeile manuell ändern in:

    CONFIG_DEBUG_INFO=n
    

    und laufen make oldconfig, dann wird die Zeile geändert zu:

    # CONFIG_DEBUG_INFO is not set
    

    ohne oldconfiguns zu fragen.

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

    Zum Beispiel setzen Sie:

    CONFIG_DEBUG_INFO=y
    

    und rennen make oldconfig. Es wird nun fragen Sie uns: DEBUG_INFO_REDUCED, DEBUG_INFO_SPLITusw. configs.

    Diese Eigenschaften wurden zuvor nicht angezeigt defconfig.

    Wenn wir uns ansehen, lib/Kconfig.debugwo sie definiert sind, sehen wir, dass sie abhängen von DEBUG_INFO:

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Als sie DEBUG_INFOabwesend waren, tauchten sie überhaupt nicht auf.

  4. Konfigurationen, die selectedaktiviert sind, werden automatisch festgelegt, ohne den Benutzer zu fragen.

    Zum Beispiel, wenn CONFIG_X86=yund wir die Zeile entfernen:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    und laufen make oldconfig, wird die Linie 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 Auswahl erzwingt, dass diese Option wahr ist. Siehe auch: /unix/117521/select-vs-depends-in-kernel-kconfig

  5. Es werden Konfigurationen angefordert, deren Einschränkungen nicht erfüllt sind.

    Zum Beispiel defconfighatte gesetzt:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Wenn wir bearbeiten:

    CONFIG_64BIT=n
    

    und renn make oldconfig, es wird uns fragen:

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

    Dies liegt daran, dass RCU_FANOUTdefiniert ist init/Kconfigals:

    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 Maximalwert 32, aber wir hatten auf 64gesetzt .config, was es inkonsistent machen würde.

Boni

make olddefconfigSetzt jede Option auf ihren Standardwert, ohne interaktiv zu fragen. Es wird automatisch ausgeführt, makeum sicherzustellen, dass das .configkonsistent ist, falls Sie es manuell wie wir geändert haben. Siehe auch: /server/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfigist wie make olddefconfig, akzeptiert aber auch ein Konfigurationsfragment zum Zusammenführen. Dieses Ziel wird vom merge_config.shSkript verwendet: https://stackoverflow.com/a/39440863/895245

Und wenn Sie die .configÄnderung automatisieren möchten , ist das nicht allzu einfach: Wie können Sie Funktionen in einer .config-Datei des Linux-Kernels nicht interaktiv aktivieren?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
5

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

Šimon Tóth
quelle
2

Von dieser Seite :

Make oldconfig nimmt die .config und führt sie durch die Regeln der Kconfig-Dateien und erzeugt eine .config, die mit den Kconfig-Regeln übereinstimmt. Wenn CONFIG-Werte fehlen, werden Sie von make oldconfig gefragt.

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

Wenn Sie make oldconfig ausführen und dann make oldconfig ein zweites Mal ausführen, werden beim zweiten Mal keine zusätzlichen Änderungen vorgenommen.

Nan Xiao
quelle
1

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

Danial
quelle
6
Versuchen Sie:yes "" | make oldconfig
Ray Donnelly