wandres.dev
CONFIGURAR (KCONFIG) · menuconfig, y/m/n

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.

⏱ 12 min

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.

🎯 Al terminar esta lección sabrás
  • 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.

'm' es la genialidad del kernel modular

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 .config es tu receta, versiónalo

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.

⚔️ Configura tu kernel
  1. En un árbol del kernel, ejecuta make defconfig y luego make menuconfig; navega los menús y lee la ayuda (?) de alguna opción.
  2. Busca un driver o feature y cámbialo entre [*], [M] y [ ].
  3. Prueba make localmodconfig para generar un kernel mínimo basado en tu máquina.
  4. Mira el .config de tu sistema actual en /boot/config-$(uname -r).