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 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.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.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 deDEBUG_INFO
:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFO
Entonces, cuando
DEBUG_INFO
estaba apagado, no aparecían en absoluto.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 deDEBUG_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
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 eninit/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 es32
, pero teníamos64
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?