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 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. -
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. -
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 vonDEBUG_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. -
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 zuDEBUG_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
-
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 beiinit/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 ist32
, aber wir hatten64
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.