Kconfig: configurar el kernel
Antes de compilar, se decide qué se incluye. El sistema Kconfig, make menuconfig, el archivo .config y las tres opciones de cada feature: dentro, módulo o fuera.
El kernel es infinitamente configurable: puedes construir uno mínimo para un router o uno enorme con soporte para todo. Esa flexibilidad la gestiona Kconfig, el sistema que decide, feature por feature, qué entra en tu kernel. Entenderlo es el primer paso para compilarlo.
- Qué es Kconfig y el archivo
.config. - Configurar con
make menuconfig. - Las tres opciones: y / m / n.
- Puntos de partida: defconfig.
El sistema Kconfig
Cada feature del kernel (un driver, un sistema de archivos, una opción de depuración) tiene una entrada Kconfig que define si puede activarse y de qué depende. El resultado de tus elecciones es un archivo .config en la raíz del árbol, que gobierna qué se compila.
make menuconfig # interfaz de texto para configurar (necesita ncurses)
make nconfig # variante alternativa
make xconfig # interfaz gráfica (Qt)
make menuconfig abre un menú navegable con miles de opciones organizadas por subsistema. Cada una tiene ayuda (pulsa ?) que explica qué hace y sus dependencias.
Las tres opciones: y, m, n
La decisión clave sobre cada feature tiene tres respuestas:
[*] — y (yes)
Incluida dentro de la imagen del kernel. Siempre presente, cargada al arrancar. Compilada estáticamente.
[M] — m (module)
Compilada como módulo (.ko) cargable a demanda con insmod/modprobe. Flexibilidad sin engordar el kernel base.
[ ] — n (no)
Fuera. No se compila. Ni ocupa espacio ni existe.
La opción módulo es lo que da a Linux —siendo monolítico— la flexibilidad de un microkernel sin su coste. Un driver compilado como módulo (m) no está en el kernel al arrancar: se carga a demanda cuando conectas el dispositivo, y se puede descargar cuando no lo necesitas. Así una sola imagen de kernel soporta millones de hardware distintos sin cargarlo todo siempre: el kernel base es pequeño, y los módulos entran y salen según hagan falta. Para ti, como desarrollador, m es aún más valioso: puedes compilar tu driver como módulo, cargarlo con insmod, probarlo, descargarlo con rmmod y recompilar — todo sin reiniciar la máquina. Es el ciclo de desarrollo que hace tolerable programar el kernel. Por eso tus módulos (nivel 7) serán casi siempre m.
Empezar desde un defconfig
Configurar miles de opciones a mano es inviable. Siempre partes de una configuración por defecto sensata y la ajustas:
make defconfig # config por defecto para tu arquitectura
make x86_64_defconfig # una específica
make localmodconfig # config basada en los módulos que TU máquina usa ahora
# (genera un kernel mínimo y rápido de compilar)
make localmodconfig es un truco de oro para aprender: mira qué módulos tienes cargados y genera una config que solo incluye eso, produciendo un kernel mucho más pequeño y mucho más rápido de compilar — clave cuando vas a recompilar una y otra vez.
El archivo .config es la receta exacta de tu kernel. Guárdalo (los kernels instalados dejan el suyo en /boot/config-$(uname -r)). Puedes copiar el de tu distribución como punto de partida, o versionar el tuyo para reproducir builds. Y make oldconfig actualiza un .config viejo cuando cambias de versión de kernel, preguntándote solo por las opciones nuevas.
- En un árbol del kernel, ejecuta
make defconfigy luegomake menuconfig; navega los menús y lee la ayuda (?) de alguna opción. - Busca un driver o feature y cámbialo entre
[*],[M]y[ ]. - Prueba
make localmodconfigpara generar un kernel mínimo basado en tu máquina. - Mira el
.configde tu sistema actual en/boot/config-$(uname -r).