Linux çekirdeği yapılandırma yapılandırmasını otomatikleştirmek için menuconfig nasıl yazılır?


10

Bir Linux yapı otomatikleştirmek ama sonunda ben çok manuel adım gibi görünüyor ne çalıştırmak için gereken bir noktaya gelmek istiyorum: make menuconfig. Bu, işletim sistemi ve çekirdek yapılandırmaları arasında yapılandırmaları eşitliyor gibi görünüyor?

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

Temel olarak, make menuconfigderleme komut dosyası çağrısını nasıl kaldırabilirim ?

Bir yana, bu yapmak hiç menuconfig çağırmadan çalıştırmak gibi görünen bir yapı hatası tepki:

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

Belki de bir makefile eksik bir kural var gibi görünüyor çünkü makefile kendisi mevcut DEĞİL veya makefile bu kuralı içerecek şekilde oluşturulmuş / morphed değil ama bu ayrı bir soru.

Buna tamamen yaklaşmanın daha akıllı bir yolu olabilir. İzlemediğim ancak yapmam gereken başka yapılandırmalar var mı (ör. Oldconfig)?


1
Test yaptın mı make olddefconfig?
jimmij

Hayır, şimdi bunun hakkında daha fazla okumak ... çok acı verici çünkü küçük deneyler çok uzun sürüyor.
tarabyte

Yanıtlar:


8

Linux çekirdek inşa sistemi birçok inşa hedefi sağlar, bunu bilmenin en iyi yolu muhtemelen aşağıdakileri yapmaktır 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

Jimmij'in yorumlarda belirttiği gibi, ilginç kısımlar oldconfigilgili hedeflerde.

Şahsen, gitmenizi tavsiye ederim silentoldconfig( .configdosyada hiçbir şey değişmediyse veya dosyanızı yeni bir çekirdekle olddefconfiggüncellediyseniz .config.


1
randconfigbeni şaşırttı. Muhtemelen olası kombinasyonlar oluşturarak yapıları test etmek için mi kullanılıyor?
conorsch

2
Evet, bu tam olarak yapılandırma dosyası için bir fuzzer olarak kullanılır. Şu soruya bakın: Linux Çekirdeğini derlerken, amacı make randconfignedir? ('Ubuntu'ya Sor' web sitesinde).
Per15

2

merge_config.sh fragmanları yapılandır

$ 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

Süreç ikamesi yok değil maalesef çalışır:

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

çünkü: https://unix.stackexchange.com/a/164109/32558

merge_config.shmake alldefconfighedef için basit bir kullanıcı arabirimidir.

Çapraz derleme ARCHyaparken merge_config.sh, çalıştırdığınızda dışa aktarılmalıdır , örneğin:

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

Birleştirilen çıktı dosyası, KCONFIG_CONFIGortam değişkeni ile açıkça belirtilebilir ; aksi takdirde sadece üzerine yazar .config:

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

Buildroot bunu ile otomatik hale getirir BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

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


0

CentOS çekirdeğimi yükseltmek istediğimden ve birkaç makinede yapmam gerektiğinden de aynı sorunu yaşadım. Yeni CentOS çekirdek ağacımın /linux-5.1'de olduğunu varsayın (root hesabına giriş yaptım)

  1. cd /linux-5.1
  2. çalıştırın make menuconfigve değişikliklerinizi yapın ve kaydedin.config
  3. /linux-5.1/.configdosyayı geliştirme sunucunuza kopyalayın
  4. Şimdi bir sonraki makinenizin yükseltilmesi için .configdosyayı geliştirme sunucunuzdan /linux-5.1/.configyeni makineye kopyalayacaksınız .

Umarım bu da aynı durumdaki birine yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.