Linux 커널 빌드 구성을 자동화하기 위해 make menuconfig 스크립트를 작성하는 방법은 무엇입니까?

Linux 커널 빌드 구성을 자동화하기 위해 make menuconfig 스크립트를 작성하는 방법은 무엇입니까?

Linux 빌드를 자동화하고 싶지만 궁극적으로는 매우 수동적인 단계인 것처럼 보이는 단계를 실행해야 합니다 make menuconfig. 이것은 OS와 커널 구성 간의 구성을 동기화하는 것 같습니다.

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

make menuconfig기본적으로 빌드 스크립트 호출을 어떻게 제거합니까?

그런데 이것은 make menuconfig를 호출하지 않고 실행할 때 발생하는 것으로 보이는 빌드 오류에 대한 응답입니다.

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

메이크파일 자체가 존재하지 않거나 메이크파일이 규칙을 포함하도록 생성/변형되지 않았기 때문에 메이크파일에 규칙이 누락된 것 같습니다. 그러나 이는 별도의 문제입니다.

이 문제를 함께 해결하는 더 현명한 방법이 있을 수 있습니다. 추적하고 있지 않지만 추적해야 하는 다른 구성이 있습니까(예: oldconfig)?

답변1

Linux 커널 빌드 시스템은 다양한 빌드 대상을 제공하며 이에 대해 배우는 가장 좋은 방법은 다음을 수행하는 것입니다 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가 댓글에서 말했듯이 흥미로운 부분은 oldconfig관련 대상에 있습니다.

개인적으로 선택하는 것이 좋습니다 silentoldconfig(파일에 변경된 사항이 없거나 파일을 새 커널로 업데이트한 경우 .config) .olddefconfig.config

답변2

merge_config.sh구성 조각

$ 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

프로세스 교체는 실제로아니요불행하게도 작동 중:

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

왜냐하면:https://unix.stackexchange.com/a/164109/32558

merge_config.shTarget의 간단한 프런트 엔드입니다 make alldefconfig.

크로스 컴파일 시 ARCH런타임을 내보내야 합니다 merge_config.sh. 예를 들면 다음과 같습니다.

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

결합된 출력 파일은 KCONFIG_CONFIG환경 변수를 통해 명시적으로 지정할 수 있습니다. 그렇지 않으면 덮어쓰게 됩니다 .config.

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

Buildroot는 자동화를 위해 다음 명령을 사용합니다 BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES.https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

관련된:https://stackoverflow.com/questions/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file

답변3

CentOS 커널을 업그레이드하고 여러 시스템에서 업그레이드해야 했기 때문에 동일한 문제에 직면했습니다. 내 새 CentOS 커널 트리가 /linux-5.1에 있다고 가정해 보겠습니다(저는 루트로 로그인했습니다).

  1. cd /linux-5.1
  2. 실행 make menuconfig하고 변경한 다음 저장하세요..config
  3. /linux-5.1/.config개발 서버에 파일 복사
  4. 이제 다음 컴퓨터를 업그레이드하려면 .config개발 서버의 파일을 /linux-5.1/.config새 컴퓨터로 복사해야 합니다.

이것이 같은 곤경에 처한 누군가에게 도움이 되기를 바랍니다.

관련 정보