GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa fa esattamente oldconfig nel makefile del kernel di Linux?

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.

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:

  1. 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.

  2. 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.

  3. 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 da DEBUG_INFO :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Quindi, quando DEBUG_INFO era spento, non si sono presentati affatto.

  4. 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 di DEBUG_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

  5. 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 in init/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 avevamo 64 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.


Linux
  1. Che cos'è il kernel Linux e dovresti aggiornare al kernel più recente?

  2. Cosa significa dire che il kernel Linux è preventivo?

  3. In che modo il kernel Linux determina l'ordine delle chiamate __init?

  4. Qual è l'attuale sorgente del kernel Linux?

  5. Cosa significa il simbolo della pipe Linux | fare?

Esplorazione del kernel Linux:i segreti di Kconfig/kbuild

Qual ​​è la differenza tra i kernel macOS e Linux

Che cos'è la shell in Linux?

Qual è la tabella dei processi Linux? In cosa consiste?

In che modo Linux carica l'immagine "initrd"?

Cosa significa il suffisso .d in Linux?