linux kernel - ¿Qué hace exactamente el `make defconfig` del kernel de Linux?
linux-kernel kbuild (2)
Motivación
El archivo .config
no se copia simplemente de su archivo defconfig
. La motivación para almacenar defconfig
en dicho formato es la siguiente: en defconfig
solo podemos especificar opciones con valores no predeterminados (es decir, opciones que cambiamos para nuestro tablero). De esta manera podemos mantenerlo pequeño y claro. Cada nueva versión del kernel trae un montón de nuevas opciones, y de esta manera no necesitamos actualizar nuestro archivo defconfig
cada vez que se lanza el kernel. Además, debe mencionarse que el sistema de compilación del kernel mantiene un orden de opciones muy específico en el archivo defconfig
, por lo que es mejor evitar modificarlo manualmente. En su lugar, debe utilizar la regla make savedefconfig
.
Explicación simplificada
Cuando se .config
archivo .config
, el sistema de compilación del kernel recorre todos los archivos Kconfig
(de todos los subdirectorios), verificando todas las opciones en esos archivos Kconfig
:
- Si la opción se menciona en
defconfig
, el sistema de compilación pone esa opción en.config
con el valor elegido endefconfig
- Si la opción no se menciona en
defconfig
, el sistema de compilación pone esa opción en.config
usando su valor predeterminado, especificado enKconfig
correspondiente
Compruebe los scripts/kconfig/Makefile y scripts/kconfig/conf.c para ver cómo se hace realmente.
Explicación más precisa y detallada.
De "Kbuild: el sistema de construcción del kernel de Linux" por Javier Martínez :
Definición de símbolos de configuración:
Kconfig
FilesLos símbolos de configuración se definen en archivos conocidos como archivos
Kconfig
. Cada archivoKconfig
puede describir un número arbitrario de símbolos y también puede incluir (fuente) otros archivosKconfig
. Los objetivos de compilación que construyen los menús de configuración de las opciones de compilación del kernel, comomake menuconfig
, leen estos archivos para construir la estructura en forma de árbol. Cada directorio en el kernel tiene unKconfig
que incluye los archivosKconfig
de sus subdirectorios. En la parte superior del directorio de código fuente del kernel, hay un archivoKconfig
que es la raíz del árbol de opciones.menuconfig
(scripts/kconfig/mconf
),gconfig
(scripts/kconfig/gconf
) y otros objetivos de compilación invocan programas que comienzan en esteKconfig
raíz y leen recursivamente los archivosKconfig
ubicados en cada subdirectorio para construir sus menús. El subdirectorio a visitar también se define en cada archivoKconfig
y también depende de los valores de los símbolos de configuración elegidos por el usuario.Almacenamiento de valores de símbolo: archivo
.config
Todos los valores de los símbolos de configuración se guardan en un archivo especial llamado
.config
. Cada vez que desea cambiar una configuración de compilación del kernel, ejecuta un objetivo make, comomenuconfig
oxconfig
. Estos leen los archivosKconfig
para crear los menús y actualizar los valores de los símbolos de configuración utilizando los valores definidos en el archivo.config
. Además, estas herramientas actualizan el archivo.config
con las nuevas opciones que eligió y también pueden generar una si no existía antes.Debido a que el archivo
.config
es texto sin formato, también puede cambiarlo sin necesidad de herramientas especializadas. Es muy conveniente para guardar y restaurar configuraciones de compilación del kernel también.
Comandos útiles
Puedes usar una sintaxis más simple para make defconfig
, como:
$ make ARCH=arm your_board_defconfig
Vea la lista completa de archivos de configuración disponibles con:
$ make ARCH=arm help | grep defconfig
Si necesita realizar una acción inversa (es decir, crear una defconfig
de defconfig
pequeña y defconfig
partir de un extenso .config
), puede usar la regla savedefconfig
:
$ make ARCH=arm savedefconfig
Además, como mencionó 0andriy , puede usar el script diffconfig
para ver los cambios de un .config
a otro:
$ scripts/diffconfig .config_old .config_new
Puedo usar el siguiente comando para crear un archivo .config
kernel de Linux basado en una arquitectura predeterminada predeterminada para una placa personalizada basada en ARM:
ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig
Pensé que este comando copia más o menos ./arch/arm/configs/var_som_mx6_android_defconfig
a ./.config
. Sin embargo, el archivo .config
resultante no es exactamente una copia:
$ diff --unified arch/arm/configs/var_som_mx6_android_defconfig .config
--- arch/arm/configs/var_som_mx6_android_defconfig 2017-01-20 12:10:51.891515984 -0800
+++ .config 2017-01-26 15:31:29.000000000 -0800
@@ -407,6 +407,7 @@
CONFIG_ARM_ERRATA_751472=y
CONFIG_ARM_ERRATA_794072=y
CONFIG_ARM_ERRATA_761320=y
+CONFIG_ARM_ERRATA_845369=y
# CONFIG_ARM_ERRATA_753970 is not set
CONFIG_ARM_ERRATA_754322=y
# CONFIG_ARM_ERRATA_754327 is not set
@@ -2683,7 +2684,6 @@
CONFIG_AUTOFS4_FS=y
CONFIG_FUSE_FS=y
# CONFIG_CUSE is not set
-CONFIG_AUFS_FS=y
#
# Caches
@@ -2759,6 +2759,21 @@
# CONFIG_PSTORE is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
+CONFIG_AUFS_FS=y
+CONFIG_AUFS_BRANCH_MAX_127=y
+# CONFIG_AUFS_BRANCH_MAX_511 is not set
+# CONFIG_AUFS_BRANCH_MAX_1023 is not set
+# CONFIG_AUFS_BRANCH_MAX_32767 is not set
+CONFIG_AUFS_SBILIST=y
+# CONFIG_AUFS_HNOTIFY is not set
+# CONFIG_AUFS_RDU is not set
+# CONFIG_AUFS_PROC_MAP is not set
+# CONFIG_AUFS_SP_IATTR is not set
+# CONFIG_AUFS_SHWH is not set
+# CONFIG_AUFS_BR_RAMFS is not set
+# CONFIG_AUFS_BR_FUSE is not set
+CONFIG_AUFS_BDEV_LOOP=y
+# CONFIG_AUFS_DEBUG is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
No entiendo de dónde vienen las líneas adicionales, y siempre he encontrado que el funcionamiento interno de la configuración del kernel, los archivos make y los scripts de compilación son difíciles de entender. ¿Alguien puede explicar de dónde .config
esas líneas en el .config
?
También genera include/generated/autoconf.h
.
Este archivo de encabezado está incluido en C archivo de origen. Por otro lado, .config
es para el sistema Makefile.
El sistema de compilación genera dos archivos, y los mantiene consistentes.