Jak wykonać skrypt, aby menuconfig zautomatyzował konfigurację kompilacji jądra systemu Linux?


10

Chcę zautomatyzować kompilacji Linuksa, ale w końcu dostać się do punktu, w którym trzeba uruchomić, co wydaje się być bardzo instrukcja krok: make menuconfig. To wydaje się synchronizować konfiguracje między systemem operacyjnym a konfiguracjami jądra?

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

Zasadniczo, jak mogę usunąć wezwanie do make menuconfigskryptu kompilacji?

Nawiasem mówiąc, jest to reakcja na błąd kompilacji, który wydaje się występować, gdy uruchamiam się bez wywoływania make menuconfig:

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

Wydaje się, że brakuje w pliku makefile pewnej reguły, być może dlatego, że sam plik makefile NIE istnieje lub plik makefile nie został wygenerowany / przekształcony, aby zawierał tę regułę, ale jest to osobne pytanie.

Może istnieć mądrzejszy sposób na zbliżenie się do tego wszystkiego. Czy są inne konfiguracje, których nie śledzę, ale powinienem (np. Oldconfig)?


1
Testowałeś make olddefconfig?
jimmij

nie, czytając więcej o tym teraz ... to jest tak bolesne, ponieważ każdy mały eksperyment trwa tak długo.
tarabyte

Odpowiedzi:


8

System kompilacji jądra Linux zapewnia wiele celów kompilacji, najlepszym sposobem, aby się o tym dowiedzieć, jest prawdopodobnie 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

Jak mówi jimmij w komentarzach, interesujące części znajdują się w oldconfigpowiązanych celach.

Osobiście polecam Ci przejść silentoldconfig(jeśli nic nie zmieniło się w .configpliku lub olddefconfigjeśli zaktualizowałeś .configplik za pomocą nowego jądra).


1
randconfigzaskoczyło mnie. Prawdopodobnie używany do testowania kompilacji przez generowanie nieprawdopodobnych kombinacji?
conorsch,

2
Tak, jest to dokładnie używane jako fuzzer dla pliku konfiguracyjnego. Zobacz to pytanie: Jaki jest cel kompilacji jądra Linux make randconfig? (na stronie internetowej „Zapytaj Ubuntu”).
perror

2

merge_config.sh fragmenty konfiguracji

$ 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

Proces zastępowania nie działa niestety:

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

z powodu: https://unix.stackexchange.com/a/164109/32558

merge_config.shto prosty interfejs dla make alldefconfigcelu.

Podczas kompilacji krzyżowej ARCHnależy go wyeksportować po uruchomieniu merge_config.sh, np .:

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

Scalony plik wyjściowy można jawnie określić za pomocą KCONFIG_CONFIGzmiennej środowiskowej; w przeciwnym razie po prostu nadpisze .config:

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

Buildroot automatyzuje to za pomocą BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

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


0

Miałem ten sam problem, ponieważ chciałem zaktualizować jądro CentOS i musiałem to zrobić na kilku komputerach. Załóżmy, że moje nowe drzewo jądra CentOS znajduje się w /linux-5.1 (jestem zalogowany do konta root)

  1. cd /linux-5.1
  2. uruchom make menuconfigi wprowadź zmiany i zapisz je w.config
  3. skopiuj /linux-5.1/.configplik na serwer programistyczny
  4. Teraz do aktualizacji na następnej maszynie skopiujesz .configplik z serwera /linux-5.1/.configprogramistycznego na nowy komputer.

Mam nadzieję, że to pomoże komuś w takiej samej sytuacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.