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.
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.
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
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:
select
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:
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.
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.
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.
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
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.
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é.
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.