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.
- implizieren einander über
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:
-
Zeilentyp:
# CONFIG_XXX is not setsind 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 setund führen Sie
make oldconfigaus , wird es uns fragen:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)Wenn es vorbei ist, die
.configDatei wird aktualisiert.Wenn Sie irgendein Zeichen der Zeile ändern, z. bis
# CONFIG_DEBUG_INFO, es zählt nicht. -
Zeilentyp:
# CONFIG_XXX is not setwerden immer zur Negation einer Eigenschaft verwendet, obwohl:
CONFIG_XXX=nwird auch als Negation verstanden.
Zum Beispiel, wenn Sie
# CONFIG_DEBUG_INFO is not setentfernen 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 setund nicht:
CONFIG_DEBUG_INFO=nAuch wenn wir die Zeile manuell ändern zu:
CONFIG_DEBUG_INFO=nund führen Sie
make oldconfigaus , dann wird die Zeile geändert zu:# CONFIG_DEBUG_INFO is not setohne
oldconfigFragen Sie uns. -
Konfigurationen, deren Abhängigkeiten nicht erfüllt sind, erscheinen nicht auf
.config. Alle anderen tun es.Legen Sie beispielsweise fest:
CONFIG_DEBUG_INFO=yund führen Sie
make oldconfigaus . Es fragt uns jetzt nach:DEBUG_INFO_REDUCED,DEBUG_INFO_SPLIT, etc. configs.Diese Eigenschaften wurden auf
defconfignicht angezeigt vorher.Schauen wir unter
lib/Kconfig.debugwo sie definiert sind, sehen wir, dass sie vonDEBUG_INFOabhängen :config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFOAlso wenn
DEBUG_INFOausgeschaltet war, sind sie überhaupt nicht aufgetaucht. -
Konfigurationen, die
selectedsind durch eingeschaltete Konfigurationen werden automatisch gesetzt, ohne den Benutzer zu fragen.Wenn beispielsweise
CONFIG_X86=yund wir entfernen die Zeile:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=yund führen Sie
make oldconfigaus , wird die Zeile neu erstellt, ohne uns zu fragen, im Gegensatz zuDEBUG_INFO.Dies geschieht, weil
arch/x86/Kconfigenthält:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORTund wählen Sie, dass diese Option wahr ist. Siehe auch:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
-
Configs, deren Constraints nicht erfüllt sind, werden abgefragt.
Beispiel:
defconfigeingestellt hatte:CONFIG_64BIT=y CONFIG_RCU_FANOUT=64Wenn wir bearbeiten:
CONFIG_64BIT=nund führen Sie
make oldconfigaus , wird es uns fragen:Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)Das liegt daran, dass
RCU_FANOUTist beiinit/Kconfigdefiniert als:config RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BITDaher ohne
64BIT, der maximale Wert ist32, aber wir hatten64auf.configeingestellt , 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.