GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué hace exactamente make oldconfig en el archivo MAKE del kernel de Linux?

Lee el .config existente que se usó para un kernel antiguo y solicita al usuario opciones en el código fuente del kernel actual que no se encuentran en el archivo. Esto es útil cuando se toma una configuración existente y se mueve a un nuevo kernel.


Antes de ejecutar make oldconfig , debe copiar un archivo de configuración del kernel de un kernel antiguo en el directorio raíz del nuevo kernel.

Puede encontrar una copia del archivo de configuración del núcleo anterior en un sistema en ejecución 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

Resumen

Como menciona Ignacio, actualiza tu .config para usted después de actualizar la fuente del kernel, p. con git pull .

Intenta mantener sus opciones existentes.

Tener un guión para eso es útil porque:

  • Es posible que se hayan agregado nuevas opciones o que se hayan eliminado las antiguas

  • el formato de configuración Kconfig del kernel tiene opciones que:

    • implican unos a otros a través de select
    • depender de otro vía depends

    Esas relaciones de opciones hacen que la resolución de configuración manual sea aún más difícil.

Vamos a modificar .config manualmente para comprender cómo resuelve las configuraciones

Primero genere una configuración predeterminada con:

make defconfig

Ahora edite el .config generado archivo manualmente para emular una actualización del kernel 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á configurado.

    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 .config el archivo se actualizará.

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

  2. Líneas de tipo:

    # CONFIG_XXX is not set
    

    siempre se utilizan 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 el .config . Todos los demás lo hacen.

    Por ejemplo, establezca:

    CONFIG_DEBUG_INFO=y
    

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

    Esas propiedades no aparecían en el defconfig antes.

    Si miramos debajo de lib/Kconfig.debug donde se definen, vemos que dependen de DEBUG_INFO :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Así que cuando DEBUG_INFO estaba apagado, no aparecieron en absoluto.

  4. Configuraciones que son selected al activarse, las configuraciones se establecen automáticamente sin preguntarle 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 seleccionar fuerza que la opción sea verdadera. Consulte también:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. Se solicitan 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 establecido en el .config , lo que lo haría inconsistente.

Bonos

make olddefconfig establece cada opción a su valor predeterminado sin preguntar de forma interactiva. Se ejecuta automáticamente en make para asegurarse de que el .config es consistente en caso de que lo haya modificado manualmente como lo hicimos nosotros. Ver 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 merge_config.sh guión:https://stackoverflow.com/a/39440863/895245

Y si quieres automatizar el .config modificación, eso no es demasiado simple:¿Cómo se activan las funciones de forma no interactiva en un archivo .config del kernel de Linux?


Actualiza una configuración antigua con opciones nuevas/modificadas/eliminadas.


Linux
  1. Linux – ¿Qué hace 'hacer Localmodconfig'?

  2. Linux:¿qué implica el diseño de la memoria del kernel virtual en Dmesg?

  3. Linux:¿qué fuentes de entropía utiliza el kernel de Linux?

  4. ¿Qué significa decir que el kernel de Linux es preventivo?

  5. ¿Qué significa el sufijo .d en Linux?

Explorando el kernel de Linux:Los secretos de Kconfig/kbuild

¿Cuál es la diferencia entre los núcleos de macOS y Linux?

¿Qué es el Shell en Linux?

¿Qué es la tabla de procesos de Linux? ¿En qué consiste?

¿Cuál es el beneficio de compilar su propio kernel de Linux?

¿Cómo carga Linux la imagen 'initrd'?