GNU/Linux >> Znalost Linux >  >> Linux

Co dělá oldconfig přesně v makefile linuxového jádra?

Přečte existující .config soubor, který byl použit pro staré jádro a vyzve uživatele k zadání voleb v aktuálním zdroji jádra, které v souboru nejsou nalezeny. To je užitečné, když vezmete existující konfiguraci a přesunete ji do nového jádra.


Než spustíte make oldconfig , musíte zkopírovat konfigurační soubor jádra ze staršího jádra do kořenového adresáře nového jádra.

Kopii starého konfiguračního souboru jádra na běžícím systému najdete na /boot/config-3.11.0 . Alternativně má zdrojový kód jádra konfigurace v linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

Pokud je zdroj vašeho jádra umístěn na /usr/src/linux :

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig

Shrnutí

Jak zmínil Ignacio, aktualizuje váš .config pro vás po aktualizaci zdrojového kódu jádra, např. s git pull .

Snaží se zachovat vaše stávající možnosti.

Mít k tomu skript je užitečné, protože:

  • mohly být přidány nové možnosti nebo odstraněny staré

  • konfigurační formát Kconfig jádra má tyto možnosti:

    • vzájemně naznačovat pomocí select
    • závisí na jiném přes depends

    Tyto vztahy možností ještě více ztěžují ruční řešení konfigurace.

Pojďme upravit soubor .config ručně, abychom pochopili, jak řeší konfigurace

Nejprve vygenerujte výchozí konfiguraci pomocí:

make defconfig

Nyní upravte vygenerovaný .config soubor ručně emulovat aktualizaci jádra a spustit:

make oldconfig

vidět, co se stane. Některé závěry:

  1. Řádky typu:

    # CONFIG_XXX is not set
    

    nejsou pouhé komentáře, ale ve skutečnosti indikují, že parametr není nastaven.

    Pokud například odstraníme řádek:

    # CONFIG_DEBUG_INFO is not set
    

    a spusťte make oldconfig , zeptá se nás:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    Když to skončí, .config soubor bude aktualizován.

    Pokud změníte jakýkoli znak řádku, např. na # CONFIG_DEBUG_INFO , to se nepočítá.

  2. Řádky typu:

    # CONFIG_XXX is not set
    

    se vždy používají pro negaci vlastnosti, ačkoli:

    CONFIG_XXX=n
    

    je také chápán jako negace.

    Pokud například odstraníte # CONFIG_DEBUG_INFO is not set a odpovězte:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    s N , pak výstupní soubor obsahuje:

    # CONFIG_DEBUG_INFO is not set
    

    a ne:

    CONFIG_DEBUG_INFO=n
    

    Také, pokud ručně upravíme řádek na:

    CONFIG_DEBUG_INFO=n
    

    a spusťte make oldconfig , pak se řádek upraví na:

    # CONFIG_DEBUG_INFO is not set
    

    bez oldconfig ptáte se nás.

  3. Konfigurace, jejichž závislosti nejsou splněny, se na .config nezobrazují . Všichni ostatní ano.

    Například nastavte:

    CONFIG_DEBUG_INFO=y
    

    a spusťte make oldconfig . Nyní se nás zeptá na:DEBUG_INFO_REDUCED , DEBUG_INFO_SPLIT , atd.

    Tyto vlastnosti se na defconfig neobjevily dříve.

    Pokud se podíváme pod lib/Kconfig.debug kde jsou definovány, vidíme, že závisí na DEBUG_INFO :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Takže když DEBUG_INFO byl vypnutý, vůbec se neobjevili.

  4. Konfigurace, které jsou selected po zapnutí se konfigurace automaticky nastaví bez dotazu uživatele.

    Pokud například CONFIG_X86=y a odstraníme řádek:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    a spusťte make oldconfig , linka se na rozdíl od DEBUG_INFO znovu vytvoří bez dotazu .

    To se děje, protože arch/x86/Kconfig obsahuje:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    a vyberte, aby tato možnost byla pravdivá. Viz také:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. Jsou požadovány konfigurace, jejichž omezení nejsou splněna.

    Například defconfig měl nastaveno:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Pokud upravíme:

    CONFIG_64BIT=n
    

    a spusťte make oldconfig , zeptá se nás:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    Důvodem je RCU_FANOUT je definován na init/Kconfig jako:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    Tedy bez 64BIT , maximální hodnota je 32 , ale měli jsme 64 nastavte na .config , což by jej činilo nekonzistentním.

Bonusy

make olddefconfig nastaví každou možnost na výchozí hodnotu bez interaktivního dotazování. Spustí se automaticky na make abyste zajistili, že .config je konzistentní v případě, že jste jej upravili ručně jako my. Viz také:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfig je jako make olddefconfig , ale také přijímá konfigurační fragment ke sloučení. Tento cíl používá merge_config.sh skript:https://stackoverflow.com/a/39440863/895245

A pokud chcete automatizovat .config modifikace, která není příliš jednoduchá:Jak neinteraktivně zapínáte funkce v souboru .config jádra Linuxu?


Aktualizuje starou konfiguraci s novými/změněnými/odebranými možnostmi.


Linux
  1. Co znamená __init v kódu jádra Linuxu?

  2. Jak linuxové jádro určuje pořadí volání __init?

  3. Co znamená &na konci linuxového příkazu?

  1. Jaká je výhoda kompilace vlastního linuxového jádra?

  2. Co přesně jsou hlavičky linuxového jádra?

  3. Co znamená název rozhraní eth0 v Linuxu?

  1. Linux – Co dělá „Make Localmodconfig“?

  2. Co to znamená, když se řekne linuxové jádro je preemptivní?

  3. Jaký je aktuální zdrojový kód jádra Linuxu?