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.
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.
Antworten:
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.
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
Zusammenfassung
Wie von Ignacio erwähnt , aktualisiert es Ihre .config
fü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:
select
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 auszuführen:
make oldconfig
um zu sehen, was passiert. Einige Schlussfolgerungen:
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 .config
Datei aktualisiert.
Wenn Sie ein Zeichen der Zeile ändern, z. B. in # CONFIG_DEBUG_INFO
, zählt es nicht.
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 set
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
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 oldconfig
uns zu fragen.
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_SPLIT
usw. configs.
Diese Eigenschaften wurden zuvor nicht angezeigt defconfig
.
Wenn wir uns ansehen, lib/Kconfig.debug
wo 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_INFO
abwesend waren, tauchten sie überhaupt nicht auf.
Konfigurationen, die selected
aktiviert sind, werden automatisch festgelegt, ohne den Benutzer zu fragen.
Zum Beispiel, wenn CONFIG_X86=y
und 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
Es werden Konfigurationen angefordert, deren Einschränkungen nicht erfüllt sind.
Zum Beispiel defconfig
hatte 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_FANOUT
definiert ist init/Kconfig
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 Maximalwert 32
, aber wir hatten auf 64
gesetzt .config
, was es inkonsistent machen würde.
Boni
make olddefconfig
Setzt jede Option auf ihren Standardwert, ohne interaktiv zu fragen. Es wird automatisch ausgeführt, make
um sicherzustellen, dass das .config
konsistent 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 alldefconfig
ist wie make olddefconfig
, akzeptiert aber 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
Änderung automatisieren möchten , ist das nicht allzu einfach: Wie können Sie Funktionen in einer .config-Datei des Linux-Kernels nicht interaktiv aktivieren?
Aktualisiert eine alte Konfiguration mit neuen / geänderten / entfernten Optionen.
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.
Es ist Folter. Anstatt eine generische conf-Datei einzuschließen, drücken Sie 9000 Mal die Eingabetaste, um eine zu generieren.
yes "" | make oldconfig