Il lit le .config existant fichier qui a été utilisé pour un ancien noyau et invite l'utilisateur à entrer des options dans la source actuelle du noyau qui ne se trouvent pas dans le fichier. Ceci est utile lorsque vous prenez une configuration existante et que vous la déplacez 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 à /boot/config-3.11.0 . Alternativement, le code source du noyau a des configurations dans linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}
Si votre source de noyau est située à /usr/src/linux :
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
Résumé
Comme mentionné par Ignacio, il met à jour votre .config pour vous après avoir mis à jour la source du noyau, par ex. avec git pull .
Il essaie de conserver vos options existantes.
Avoir un script pour cela est utile car :
-
de nouvelles options peuvent avoir été ajoutées ou d'anciennes supprimées
-
le format de configuration Kconfig du noyau a des options qui :
- s'impliquer via
select - dépendre d'un autre via
depends
Ces relations d'options rendent la résolution de configuration manuelle encore plus difficile.
- s'impliquer via
Modifions .config manuellement pour comprendre comment il résout les configurations
Générez d'abord une configuration par défaut avec :
make defconfig
Modifiez maintenant le .config généré fichier manuellement pour émuler une mise à jour du noyau et exécuter :
make oldconfig
pour voir ce qui se passe. Quelques conclusions :
-
Lignes de type :
# CONFIG_XXX is not setne 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 setet exécutez
make oldconfig, il nous demandera :Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)Quand c'est fini, le
.configle fichier sera mis à jour.Si vous modifiez un caractère de la ligne, par ex. à
# CONFIG_DEBUG_INFO, ça ne compte pas. -
Lignes de type :
# CONFIG_XXX is not setsont toujours utilisés pour la négation d'une propriété, bien que :
CONFIG_XXX=nest aussi compris comme la négation.
Par exemple, si vous supprimez
# CONFIG_DEBUG_INFO is not setet répondez :Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)avec
N, alors le fichier de sortie contient :# CONFIG_DEBUG_INFO is not setet non :
CONFIG_DEBUG_INFO=nAussi, si nous modifions manuellement la ligne en :
CONFIG_DEBUG_INFO=net exécutez
make oldconfig, alors la ligne est modifiée en :# CONFIG_DEBUG_INFO is not setsans
oldconfignous demander. -
Les configurations dont les dépendances ne sont pas respectées n'apparaissent pas sur le
.config. Tous les autres le font.Par exemple, définissez :
CONFIG_DEBUG_INFO=yet exécutez
make oldconfig. Il va maintenant nous demander :DEBUG_INFO_REDUCED,DEBUG_INFO_SPLIT, etc. configs.Ces propriétés n'apparaissaient pas sur le
defconfigavant.Si nous regardons sous
lib/Kconfig.debugoù ils sont définis, on voit qu'ils dépendent deDEBUG_INFO:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFOAlors quand
DEBUG_INFOétait éteint, ils ne sont pas apparus du tout. -
Les configurations qui sont
selectedpar activé, les configurations sont automatiquement définies sans demander à l'utilisateur.Par exemple, si
CONFIG_X86=yet on supprime la ligne :CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=yet exécutez
make oldconfig, la ligne est recréée sans nous demander, contrairement àDEBUG_INFO.Cela se produit parce que
arch/x86/Kconfigcontient :config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORTet sélectionnez force cette option à ê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,
defconfigavait défini :CONFIG_64BIT=y CONFIG_RCU_FANOUT=64Si nous modifions :
CONFIG_64BIT=net exécutez
make oldconfig, il nous demandera :Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)C'est parce que
RCU_FANOUTest défini àinit/Kconfigcomme :config RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BITDonc, sans
64BIT, la valeur maximale est32, mais nous avions64réglé sur le.config, ce qui le rendrait incohérent.
Bonus
make olddefconfig définit chaque option à leur 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 au cas où vous l'auriez 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 configuration à fusionner. Cette cible est utilisée par le merge_config.sh script :https://stackoverflow.com/a/39440863/895245
Et si vous souhaitez automatiser le .config modification, ce n'est pas trop simple :comment activer de manière non interactive des fonctionnalités dans un fichier .config du noyau Linux ?
Met à jour une ancienne configuration avec des options nouvelles/modifiées/supprimées.