Que fait "make oldconfig" exactement dans le makefile du noyau Linux?

est-ce que quelqu'un peut expliquer ce que la cible" oldconfig " fait exactement dans le makefile du noyau Linux? Je le vois référencé dans certains documents de construction, mais je n'ai jamais expliqué ce qu'il fait exactement.

60

6 réponses

il lit le fichier existant .config et invite l'utilisateur à rechercher des options dans la source actuelle du noyau qui ne se trouvent pas dans le fichier. Ceci est utile pour prendre une configuration existante et la déplacer vers un nouveau noyau.

101
répondu Ignacio Vazquez-Abrams 2010-11-14 17:02:04

avant d'exécuter 'make oldconfig', vous devez copier un fichier de configuration du noyau à partir d'un noyau ancien dans le répertoire racine du nouveau noyau.

, Vous pouvez trouver une copie de l'ancien fichier de configuration du noyau sur un système en cours d'exécution à /boot/config-3.11.0 . Alternativement, le code source du noyau a configs dans linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

si la source de votre noyau est située à /usr / src / linux

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
18
répondu Angelo Babudro 2014-06-05 19:27:41

résumé

comme mentionné par Ignacio , il met à jour votre .config pour vous après que vous ayez mis à jour la source du noyau, par exemple avec git pull .

Il essaie de garder vos options existantes.

avoir un script pour cela est utile parce que:

  • de nouvelles options peuvent avoir été ajoutées, ou les anciennes supprimées

  • le format de configuration Kconfig du noyau a des options qui:

    • impliquent l'un l'autre via select
    • dépendent d'un autre via depends

    ces relations d'options rendent la résolution de configuration manuelle encore plus difficile.

modifions .config manuellement pour comprendre comment résout les configurations

génère D'abord une configuration par défaut avec:

make defconfig

édite maintenant le fichier .config généré manuellement pour émuler une mise à jour du noyau et exécuter:

make oldconfig

pour voir ce qui se passe. Quelques conclusions:

  1. lignes de type:

    # CONFIG_XXX is not set
    

    ne sont pas de simples commentaires, mais indiquent en fait que le paramètre n'est pas défini.

    par exemple, si nous supprimons la ligne:

    # CONFIG_DEBUG_INFO is not set
    

    et courir make oldconfig , il nous demandera:

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

    quand il est terminé, le fichier .config sera mis à jour.

    si vous changez un caractère de la ligne, par exemple en # CONFIG_DEBUG_INFO , il ne compte pas.

  2. lignes de type:

    # CONFIG_XXX is not set
    

    sont toujours utilisés pour la négation d'une propriété, bien que:

    CONFIG_XXX=n
    

    s'entend également de la négation.

    par exemple, si vous supprimez # CONFIG_DEBUG_INFO is not set et répondez:

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

    avec N , puis le fichier de sortie contient:

    # CONFIG_DEBUG_INFO is not set
    

    et non:

    CONFIG_DEBUG_INFO=n
    

    aussi, si nous modifions manuellement la ligne à:

    CONFIG_DEBUG_INFO=n
    

    et lancez make oldconfig , puis la ligne est modifiée en:

    # CONFIG_DEBUG_INFO is not set
    

    sans oldconfig .

  3. Configs dont les dépendances ne sont pas satisfaites, n'apparaissent pas sur le .config . Tous les autres le faire.

    par exemple, ensemble:

    CONFIG_DEBUG_INFO=y
    

    et make oldconfig . Il va maintenant nous demander: DEBUG_INFO_REDUCED , DEBUG_INFO_SPLIT , etc. les configs.

    ces propriétés n'apparaissaient pas sur le defconfig avant.

    si nous regardons sous lib/Kconfig.debug où ils sont définis, nous voyons qu'ils dépendent de DEBUG_INFO :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    donc quand DEBUG_INFO était éteint, ils ne sont pas venus du tout.

  4. Configs qui sont selected en tournée sur les configs sont réglés automatiquement sans demander à l'utilisateur.

    pour exemple, si CONFIG_X86=y et nous supprimons la ligne:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    et exécuter make oldconfig , la ligne est recréée sans nous demander, contrairement à DEBUG_INFO .

    cela se produit parce que arch/x86/Kconfig contient:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    et sélectionnez les forces de l'option pour être vrai. Voir aussi: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. les configurations dont les contraintes ne sont pas satisfaites sont demandées.

    par exemple, defconfig avait placé:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    si nous éditons:

    CONFIG_64BIT=n
    

    et courir make oldconfig , il nous demandera:

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

    c'est parce que RCU_FANOUT est défini à init/Kconfig comme:

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

    Donc, sans 64BIT , la valeur maximale est 32 , mais nous avions 64 sur le .config , ce qui le rendrait incohérent.

Bonus

make olddefconfig définit chaque option à sa valeur par défaut sans demander interactivement. Il s'exécute automatiquement sur make pour s'assurer que le .config est cohérent dans le cas où vous l'avez modifié manuellement comme nous l'avons fait. Voir aussi: https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfig est comme make olddefconfig , mais il accepte aussi un fragment de configuration à fusionner. Cette cible est utilisée par le script merge_config.sh : https://stackoverflow.com/a/39440863/895245

et si vous voulez automatiser la modification .config , ce n'est pas trop simple: Comment activer de façon non interactive les fonctionnalités D'un noyau Linux .fichier de config?

14

met à jour une ancienne configuration avec des options nouvelles/modifiées/supprimées.

5
répondu Let_Me_Be 2010-11-14 17:01:53

de ce page :

Make oldconfig prend le .config et l'exécute dans les règles de la Kconfig file et produit un .config qui est compatible avec le Règles Kconfig. S'il manque des valeurs de configuration, la marque oldconfig les demandera.

si le .config est déjà compatible avec les règles de Kconfig, alors make oldconfig est essentiellement un no-op.

Si vous deviez exécuter make oldconfig, puis exécutez make oldconfig un deuxième fois, la deuxième fois ne causera pas de changements supplémentaires à être faire.

2
répondu Nan Xiao 2015-07-28 05:47:10

c'est de la torture. Au lieu d'inclure un fichier de conf Générique, ils vous font appuyer 9000 fois sur return pour en générer un.

0
répondu Danial 2016-12-27 20:52:52