Legge il .config
esistente file che è stato utilizzato per un vecchio kernel e richiede all'utente le opzioni nell'attuale sorgente del kernel che non si trovano nel file. Questo è utile quando si prende una configurazione esistente e la si sposta in un nuovo kernel.
Prima di eseguire make oldconfig
, devi copiare un file di configurazione del kernel da un kernel precedente nella directory root del nuovo kernel.
Puoi trovare una copia del vecchio file di configurazione del kernel su un sistema in esecuzione in /boot/config-3.11.0
. In alternativa, il codice sorgente del kernel ha le configurazioni in linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}
Se il sorgente del tuo kernel si trova in /usr/src/linux
:
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
Riepilogo
Come menzionato da Ignacio, aggiorna il tuo .config
per te dopo aver aggiornato il sorgente del kernel, ad es. con git pull
.
Cerca di mantenere le tue opzioni esistenti.
Avere uno script per questo è utile perché:
-
potrebbero essere state aggiunte nuove opzioni o rimosse quelle vecchie
-
il formato di configurazione di Kconfig del kernel ha opzioni che:
- implicano l'un l'altro tramite
select
- dipende da un altro tramite
depends
Queste relazioni tra opzioni rendono la risoluzione della configurazione manuale ancora più difficile.
- implicano l'un l'altro tramite
Modifichiamo .config manualmente per capire come risolve le configurazioni
Prima genera una configurazione predefinita con:
make defconfig
Ora modifica il .config
generato file manualmente per emulare un aggiornamento del kernel ed eseguire:
make oldconfig
per vedere cosa succede. Alcune conclusioni:
-
Righe di tipo:
# CONFIG_XXX is not set
non sono semplici commenti, ma in realtà indicano che il parametro non è impostato.
Ad esempio, se rimuoviamo la riga:
# CONFIG_DEBUG_INFO is not set
ed esegui
make oldconfig
, ci chiederà:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
Al termine, il
.config
il file verrà aggiornato.Se modifichi qualsiasi carattere della riga, ad es. a
# CONFIG_DEBUG_INFO
, non conta. -
Righe di tipo:
# CONFIG_XXX is not set
sono sempre usati per la negazione di una proprietà, sebbene:
CONFIG_XXX=n
è anche inteso come la negazione.
Ad esempio, se rimuovi
# CONFIG_DEBUG_INFO is not set
e rispondi:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
con
N
, il file di output contiene:# CONFIG_DEBUG_INFO is not set
e non:
CONFIG_DEBUG_INFO=n
Inoltre, se modifichiamo manualmente la riga in:
CONFIG_DEBUG_INFO=n
ed esegui
make oldconfig
, quindi la riga viene modificata in:# CONFIG_DEBUG_INFO is not set
senza
oldconfig
chiedendoci. -
Le configurazioni le cui dipendenze non sono soddisfatte, non appaiono in
.config
. Tutti gli altri lo fanno.Ad esempio, imposta:
CONFIG_DEBUG_INFO=y
ed esegui
make oldconfig
. Ora ci chiederà:DEBUG_INFO_REDUCED
,DEBUG_INFO_SPLIT
, ecc. config.Queste proprietà non apparivano nel
defconfig
prima.Se guardiamo sotto
lib/Kconfig.debug
dove sono definiti, vediamo che dipendono daDEBUG_INFO
:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFO
Quindi, quando
DEBUG_INFO
era spento, non si sono presentati affatto. -
Configurazioni che sono
selected
attivando le configurazioni vengono impostate automaticamente senza chiedere all'utente.Ad esempio, se
CONFIG_X86=y
e rimuoviamo la riga:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
ed esegui
make oldconfig
, la linea viene ricreata senza chiedere a noi, a differenza diDEBUG_INFO
.Questo accade perché
arch/x86/Kconfig
contiene:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORT
e select forza tale opzione a essere vera. Vedi anche:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
-
Vengono richieste le configurazioni i cui vincoli non sono soddisfatti.
Ad esempio,
defconfig
aveva impostato:CONFIG_64BIT=y CONFIG_RCU_FANOUT=64
Se modifichiamo:
CONFIG_64BIT=n
ed esegui
make oldconfig
, ci chiederà:Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
Questo perché
RCU_FANOUT
è definito ininit/Kconfig
come:config RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BIT
Pertanto, senza
64BIT
, il valore massimo è32
, ma avevamo64
impostato sul.config
, che lo renderebbe incoerente.
Bonus
make olddefconfig
imposta ogni opzione sul valore predefinito senza chiedere in modo interattivo. Viene eseguito automaticamente su make
per garantire che il .config
è coerente nel caso in cui tu l'abbia modificato manualmente come abbiamo fatto noi. Vedi anche:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
è come make olddefconfig
, ma accetta anche un frammento di configurazione da unire. Questo obiettivo è utilizzato dal merge_config.sh
script:https://stackoverflow.com/a/39440863/895245
E se vuoi automatizzare il .config
modifica, che non è troppo semplice:come si attivano in modo non interattivo le funzionalità in un file .config del kernel Linux?
Aggiorna una vecchia configurazione con opzioni nuove/modificate/rimosse.