code - linux github kernel
¿Qué hace "make oldconfig" exactamente en el makefile del kernel de Linux? (6)
¿Alguien puede explicar qué hace exactamente el objetivo "oldconfig" en el archivo makefile del kernel de Linux? Veo que se hace referencia en alguna documentación de compilación, pero nunca explicó exactamente lo que hace.
Actualiza una configuración anterior con opciones nuevas / modificadas / eliminadas.
Lee el archivo .config existente y solicita al usuario las opciones en el origen del kernel actual que no se encuentran en el archivo. Esto es útil al tomar una configuración existente y moverla a un kernel nuevo.
Antes de ejecutar ''make oldconfig'', debe copiar un archivo de configuración del núcleo de un núcleo anterior en el directorio raíz del nuevo kernel.
Puede encontrar una copia del archivo de configuración del kernel anterior en un sistema en /boot/config-3.11.0 en /boot/config-3.11.0 . Alternativamente, el código fuente del kernel tiene configuraciones en linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}
Si la fuente de su kernel se encuentra en / usr / src / linux
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
De esta página :
Make oldconfig toma .config y lo ejecuta a través de las reglas de los archivos de Kconfig y produce un .config que es consistente con las reglas de Kconfig. Si hay valores CONFIG que faltan, el make oldconfig los solicitará.
Si el .config ya es consistente con las reglas encontradas en Kconfig, entonces hacer que oldconfig sea esencialmente no-operativo.
Si tuviera que ejecutar make oldconfig, y luego ejecutar make oldconfig por segunda vez, la segunda vez no provocará ningún cambio adicional.
Es una tortura En lugar de incluir un archivo conf genérico, hacen que vuelvas 9000 veces para generar uno.
Resumen
Como lo mencionó Ignacio , actualiza tu .config después de actualizar la fuente del kernel, por ejemplo, con git pull .
Intenta mantener sus opciones existentes.
Tener un script para eso es útil porque:
Es posible que se hayan agregado nuevas opciones o se hayan eliminado las antiguas.
el formato de configuración Kconfig del kernel tiene opciones que:
- implicarse unos a otros a través de
select - depender de otra via
depends
Esas relaciones de opción hacen que la resolución de configuración manual sea aún más difícil.
- implicarse unos a otros a través de
Modifiquemos .config manualmente para comprender cómo resuelve las configuraciones
Primero genere una configuración predeterminada con:
make defconfig
Ahora edite el archivo .config generado manualmente para emular una actualización del núcleo y ejecutar:
make oldconfig
para ver que pasa Algunas conclusiones:
Líneas de tipo:
# CONFIG_XXX is not setno son meros comentarios, sino que indican que el parámetro no está establecido.
Por ejemplo, si eliminamos la línea:
# CONFIG_DEBUG_INFO is not sety ejecuta
make oldconfig, nos preguntará:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)Cuando termina, el archivo
.configse actualizará.Si cambia cualquier carácter de la línea, por ejemplo, a
# CONFIG_DEBUG_INFO, no cuenta.Líneas de tipo:
# CONFIG_XXX is not setsiempre se usan para la negación de una propiedad, aunque:
CONFIG_XXX=ntambién se entiende como la negación.
Por ejemplo, si elimina
# CONFIG_DEBUG_INFO is not sety responde:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)con
N, entonces el archivo de salida contiene:# CONFIG_DEBUG_INFO is not sety no:
CONFIG_DEBUG_INFO=nAdemás, si modificamos manualmente la línea a:
CONFIG_DEBUG_INFO=ny ejecuta
make oldconfig, luego la línea se modifica a:# CONFIG_DEBUG_INFO is not setsin
oldconfigpreguntándonos.Las configuraciones cuyas dependencias no se cumplen, no aparecen en
.config. Todos los demás lo hacen.Por ejemplo, establecer:
CONFIG_DEBUG_INFO=yy ejecuta
make oldconfig. Ahora nos pedirá:DEBUG_INFO_REDUCED,DEBUG_INFO_SPLIT, etc. configs.Esas propiedades no aparecieron en la
defconfigantes.Si buscamos en
lib/Kconfig.debugdonde están definidos, vemos que dependen deDEBUG_INFO:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFOEntonces, cuando
DEBUG_INFOestaba apagado, no aparecían en absoluto.Las configuraciones que son
selectedpor las configuraciones activadas se configuran automáticamente sin preguntar al usuario.Por ejemplo, si
CONFIG_X86=yy eliminamos la línea:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=yy ejecuta
make oldconfig, la línea se vuelve a crear sin preguntarnos, a diferencia deDEBUG_INFO.Esto sucede porque
arch/x86/Kconfigcontiene:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORTy seleccione fuerza esa opción para ser verdadera. Ver también: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
Se solicitan las configuraciones cuyas restricciones no se cumplen.
Por ejemplo,
defconfighabía establecido:CONFIG_64BIT=y CONFIG_RCU_FANOUT=64Si editamos:
CONFIG_64BIT=ny ejecuta
make oldconfig, nos preguntará:Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)Esto se debe a que
RCU_FANOUTse define eninit/Kconfigcomo:config RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BITPor lo tanto, sin
64BIT, el valor máximo es32, pero teníamos64establecidos en.config, lo que lo haría inconsistente.
Bonos
make olddefconfig establece cada opción en su valor predeterminado sin preguntar de forma interactiva. Se ejecuta automáticamente en make para garantizar que .config sea coherente en caso de que lo haya modificado manualmente como lo hicimos nosotros. Vea también: https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig es como make olddefconfig , pero también acepta un fragmento de configuración para fusionar. Este objetivo es utilizado por el script merge_config.sh : https://.com/a/39440863/895245
Y si desea automatizar la modificación de .config , no es demasiado simple: ¿cómo .config forma no interactiva las características en un archivo .config del kernel de Linux?