web-dev-qa-db-fra.com

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

Quelqu'un peut-il expliquer ce que la cible "oldconfig" fait exactement dans le fichier makefile du noyau Linux? Je le vois référencé dans certaines documentations de construction mais je n’ai jamais expliqué ce qu’il fait exactement.

64
fred basset

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

107

Avant d'exécuter 'make oldconfig' Vous devez copier un fichier de configuration du noyau d'un noyau plus 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 à l'adresse /boot/config-3.11.0. Sinon, le code source du noyau a des configs dans linux-3.11.0/Arch/x86/configs/{i386_defconfig / x86_64_defconfig}

Si votre source de noyau est située dans/usr/src/linux

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

Résumé

Comme mentionné par par Ignacio , il met à jour votre .config après la mise à jour de 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 des anciennes supprimées

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

    • impliquer les uns les autres via select
    • dépendre d'un autre via depends

    Ces relations d’options rendent la résolution manuelle de la configuration encore plus difficile. 

Modifions manuellement .config pour comprendre comment il résout les configurations

Commencez par générer une configuration par défaut avec:

make defconfig

Maintenant, éditez manuellement le fichier .config pour émuler une mise à jour du noyau et exécutez:

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 réalité que le paramètre n'est pas défini.

    Par exemple, si on enlève la ligne:

    # CONFIG_DEBUG_INFO is not set
    

    et lancez make oldconfig, il nous demandera:

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

    Une fois terminé, le fichier .config sera mis à jour.

    Si vous modifiez un caractère de la ligne, par exemple à # CONFIG_DEBUG_INFO, cela 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
    

    est également compris comme 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, le fichier de sortie contient:

    # CONFIG_DEBUG_INFO is not set
    

    et pas:

    CONFIG_DEBUG_INFO=n
    

    Aussi, si nous modifions manuellement la ligne pour:

    CONFIG_DEBUG_INFO=n
    

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

    # CONFIG_DEBUG_INFO is not set
    

    sans oldconfig nous demander.

  3. Les configurations dont les dépendances ne sont pas respectées n'apparaissent pas sur le .config. Tous les autres font.

    Par exemple, définissez:

    CONFIG_DEBUG_INFO=y
    

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

    Ces propriétés n'apparaissaient pas sur la defconfig auparavant.

    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 se sont pas montrés du tout.

  4. Les configurations qui sont selected par les configurations activées sont automatiquement définies sans demander à l'utilisateur.

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

    CONFIG_Arch_MIGHT_HAVE_PC_PARPORT=y
    

    et exécutez 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 force cette option pour être vraie. Voir aussi: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

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

    Par exemple, defconfig avait défini:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Si on édite:

    CONFIG_64BIT=n
    

    et lancez make oldconfig, il nous demandera:

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

    En effet, RCU_FANOUT est défini à init/Kconfig comme suit:

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

    Par conséquent, sans 64BIT, la valeur maximale est 32, mais 64 a été défini sur le .config, ce qui le rendrait incohérent.

Bonus

make olddefconfig définit chaque option sur sa valeur par défaut sans demander de manière interactive. Il s'exécute automatiquement sur make pour s'assurer que le .config est cohérent si 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 également un fragment de config à fusionner. Cette cible est utilisée par le script merge_config.sh: https://stackoverflow.com/a/39440863/895245

Et si vous souhaitez automatiser la modification .config, ce n’est pas très simple: Comment activer de manière non interactive les fonctionnalités d’un fichier .config du noyau Linux?

Met à jour une ancienne configuration avec de nouvelles options/modifiées/supprimées.

5
Let_Me_Be

De cette page

Make oldconfig prend le fichier .config et l’exécute selon les règles du fichier Kconfig crée un fichier .config compatible avec le fichier Règles Kconfig. Si des valeurs de configuration sont manquantes, make oldconfig les demandera. 

Si .config est déjà compatible avec les règles trouvées dans Kconfig, alors make oldconfig est essentiellement un no-op.

Si vous exécutiez make oldconfig, puis exécutez make oldconfig en tant que deuxième fois, la deuxième fois ne provoquera aucun changement supplémentaire fabriqué.

2
Nan Xiao

C'est de la torture. Au lieu d'inclure un fichier de configuration générique, ils vous obligent à retourner 9000 fois pour en générer un.

0
Danial