¿Cómo hacer un script para que menuconfig automatice la configuración de compilación del kernel de Linux?


10

Quiero automatizar una acumulación de Linux pero con el tiempo llegar a un punto en el que se necesita para ejecutar lo que parece ser un paso muy Manual: make menuconfig. ¿Esto parece sincronizar las configuraciones entre el SO y las configuraciones del núcleo?

cp git-tracked-config .config
make defconfig 
make menuconfig # <- how to automate/script this?
make V=s

Básicamente, ¿cómo puedo eliminar la llamada a make menuconfigun script de compilación?

Por otro lado, esto es en reacción a un error de compilación que parece suceder cuando ejecuto sin siquiera llamar a make menuconfig:

make[1]: *** No rule to make target `include/config/auto.conf', needed by `include/config/kernel.release'.  Stop.

Lo que parece ser que falta una regla en un archivo MAKE quizás porque el archivo MAKE NO existe o el archivo MAKE no se ha generado / transformado para contener esa regla, pero esa es una pregunta separada.

Podría haber una forma más inteligente de abordar esto en conjunto. ¿Hay otras configuraciones que no estoy rastreando pero que debería (por ejemplo, oldconfig)?


1
¿Has probado make olddefconfig?
jimmij

no, leer más sobre eso ahora ... es muy doloroso porque cualquier pequeño experimento lleva mucho tiempo.
tarabyte

Respuestas:


8

El sistema de compilación del kernel de Linux proporciona muchos objetivos de compilación, la mejor manera de conocerlo es probablemente hacer lo siguiente make help:

Configuration targets:
  config      - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig      - Update current config utilising a menu based program
  xconfig     - Update current config utilising a QT based front-end
  gconfig     - Update current config utilising a GTK based front-end
  oldconfig   - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  defconfig   - New config with default from ARCH supplied defconfig
  savedefconfig   - Save current config as ./defconfig (minimal config)
  allnoconfig     - New config where all options are answered with no
  allyesconfig    - New config where all options are accepted with yes
  allmodconfig    - New config selecting modules when possible
  alldefconfig    - New config with all symbols set to default
  randconfig      - New config with random answer to all options
  listnewconfig   - List new options
  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value
  kvmconfig   - Enable additional options for guest kernel support
  tinyconfig      - Configure the tiniest possible kernel

Como dice jimmij en los comentarios, las partes interesantes están en los oldconfigobjetivos relacionados.

Personalmente, le recomendaría que lo haga silentoldconfig(si nada cambió en el .configarchivo o olddefconfigsi actualizó su .configarchivo con un nuevo núcleo.


1
randconfigMe sorprendió. ¿Presumiblemente usado para probar construcciones generando combinaciones poco probables?
conorsch

2
Sí, esto se usa precisamente como un difusor para el archivo de configuración. Vea esta pregunta: Al compilar el kernel de Linux, ¿para qué sirve make randconfig? (en el sitio web 'Ask Ubuntu').
Perror

2

merge_config.sh fragmentos de configuración

$ cd linux
$ git checkout v4.9
$ make x86_64_defconfig
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
# CONFIG_DEBUG_INFO is not set
$ # GDB_SCRIPTS depends on CONFIG_DEBUG_INFO in lib/Kconfig.debug.
$ cat <<EOF >.config-fragment
> CONFIG_DEBUG_INFO=y
> CONFIG_GDB_SCRIPTS=y
> EOF
$ # Order is important here. Must be first base config, then fragment.
$ ./scripts/kconfig/merge_config.sh .config .config-fragment
$ grep -E 'CONFIG_(DEBUG_INFO|GDB_SCRIPTS)[= ]' .config
CONFIG_DEBUG_INFO=y
CONFIG_GDB_SCRIPTS=y

La sustitución de procesos no funciona desafortunadamente:

./scripts/kconfig/merge_config.sh arch/x86/configs/x86_64_defconfig \
    <( printf 'CONFIG_DEBUG_INFO=y\nCONFIG_GDB_SCRIPTS=y\n' ) 

por: https://unix.stackexchange.com/a/164109/32558

merge_config.shes un front-end simple para el make alldefconfigobjetivo.

Cuando se realiza una compilación cruzada, se ARCHdebe exportar cuando se ejecuta merge_config.sh, por ejemplo:

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
./scripts/kconfig/merge_config.sh .config .config-fragment

El archivo de salida combinado se puede especificar explícitamente con la KCONFIG_CONFIGvariable de entorno; de lo contrario, solo sobrescribe .config:

KCONFIG_CONFIG=some/path/.config ./scripts/kconfig/merge_config.sh .config .config-fragment

Buildroot lo automatiza con BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Relacionado: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file


0

Tuve este mismo problema ya que quería actualizar mi núcleo CentOS y necesitaba hacerlo en varias máquinas. Supongamos aquí que mi nuevo árbol de kernel CentOS está en /linux-5.1 (estoy conectado a la cuenta raíz)

  1. cd /linux-5.1
  2. ejecutar make menuconfigy realizar sus cambios y guardarlos en.config
  3. copia el /linux-5.1/.configarchivo a tu servidor de desarrollo
  4. Ahora para su próxima máquina para actualizar deberá copiar .configel archivo desde el servidor de desarrollo de /linux-5.1/.configla nueva máquina.

Espero que esto ayude a alguien en la misma situación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.