code linux makefile linux-kernel

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.

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:

  1. Líneas de tipo:

    # CONFIG_XXX is not set

    no 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 set

    y ejecuta make oldconfig , nos preguntará:

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

    Cuando termina, el archivo .config se actualizará.

    Si cambia cualquier carácter de la línea, por ejemplo, a # CONFIG_DEBUG_INFO , no cuenta.

  2. Líneas de tipo:

    # CONFIG_XXX is not set

    siempre se usan para la negación de una propiedad, aunque:

    CONFIG_XXX=n

    también se entiende como la negación.

    Por ejemplo, si elimina # CONFIG_DEBUG_INFO is not set y 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 set

    y no:

    CONFIG_DEBUG_INFO=n

    Además, si modificamos manualmente la línea a:

    CONFIG_DEBUG_INFO=n

    y ejecuta make oldconfig , luego la línea se modifica a:

    # CONFIG_DEBUG_INFO is not set

    sin oldconfig preguntándonos.

  3. Las configuraciones cuyas dependencias no se cumplen, no aparecen en .config . Todos los demás lo hacen.

    Por ejemplo, establecer:

    CONFIG_DEBUG_INFO=y

    y ejecuta make oldconfig . Ahora nos pedirá: DEBUG_INFO_REDUCED , DEBUG_INFO_SPLIT , etc. configs.

    Esas propiedades no aparecieron en la defconfig antes.

    Si buscamos en lib/Kconfig.debug donde están definidos, vemos que dependen de DEBUG_INFO :

    config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFO

    Entonces, cuando DEBUG_INFO estaba apagado, no aparecían en absoluto.

  4. Las configuraciones que son selected por las configuraciones activadas se configuran automáticamente sin preguntar al usuario.

    Por ejemplo, si CONFIG_X86=y y eliminamos la línea:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y

    y ejecuta make oldconfig , la línea se vuelve a crear sin preguntarnos, a diferencia de DEBUG_INFO .

    Esto sucede porque arch/x86/Kconfig contiene:

    config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORT

    y seleccione fuerza esa opción para ser verdadera. Ver también: https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. Se solicitan las configuraciones cuyas restricciones no se cumplen.

    Por ejemplo, defconfig había establecido:

    CONFIG_64BIT=y CONFIG_RCU_FANOUT=64

    Si editamos:

    CONFIG_64BIT=n

    y ejecuta make oldconfig , nos preguntará:

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

    Esto se debe a que RCU_FANOUT se define en init/Kconfig como:

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

    Por lo tanto, sin 64BIT , el valor máximo es 32 , pero teníamos 64 establecidos 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?