Làm thế nào để script tạo menuconfig để tự động hóa cấu hình xây dựng nhân Linux?


10

Tôi muốn tự động hóa một bản dựng Linux nhưng cuối cùng đến một điểm mà tôi cần chạy những gì dường như là một bước rất thủ công : make menuconfig. Điều này dường như để đồng bộ cấu hình giữa hệ điều hành và cấu hình kernel?

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

Về cơ bản, làm thế nào tôi có thể loại bỏ lệnh gọi make menuconfigcho tập lệnh xây dựng?

Bên cạnh đó, đây là phản ứng với lỗi xây dựng dường như xảy ra khi tôi chạy mà không bao giờ gọi làm cho menuconfig:

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

Dường như có một quy tắc bị thiếu trong tệp tạo tệp có lẽ vì bản thân tệp tạo tệp KHÔNG tồn tại hoặc tệp tạo tệp chưa được tạo / biến đổi để chứa quy tắc đó nhưng đó là một câu hỏi riêng biệt.

Có thể có một cách thông minh hơn để tiếp cận hoàn toàn điều này. Có cấu hình nào khác mà tôi không theo dõi nhưng nên (ví dụ oldconfig) không?


1
Bạn đã thử make olddefconfigchưa?
jimmij

không, đọc thêm về điều đó bây giờ ... thật là đau đớn bởi vì bất kỳ thử nghiệm nhỏ nào cũng mất quá nhiều thời gian.
tarabyte

Câu trả lời:


8

Hệ thống xây dựng nhân Linux cung cấp nhiều mục tiêu xây dựng, cách tốt nhất để biết về nó có lẽ là thực hiện 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

Như jimmij nói trong các bình luận, các phần thú vị nằm trong các oldconfigmục tiêu liên quan.

Cá nhân, tôi khuyên bạn nên đi silentoldconfig(nếu không có gì thay đổi trong .configtệp hoặc olddefconfignếu bạn cập nhật .configtệp của mình bằng kernel mới.


1
randconfiglàm tôi ngạc nhiên. Có lẽ được sử dụng để kiểm tra các bản dựng bằng cách tạo ra các kết hợp không thể?
conorsch

2
Có, điều này được sử dụng chính xác như một fuzzer cho tập tin cấu hình. Xem câu hỏi này: Khi biên dịch Linux Kernel, mục đích của nó là make randconfiggì? (trên trang web 'Hỏi Ubuntu').
perror

2

merge_config.sh cấu hình các đoạ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

Thay thế quá trình không hoạt động không may:

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

vì: https://unix.stackexchange.com/a/164109/32558

merge_config.shlà một mặt trước đơn giản cho make alldefconfigmục tiêu.

Khi biên dịch chéo, ARCHphải được xuất khi bạn chạy merge_config.sh, ví dụ:

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

Tệp đầu ra được hợp nhất có thể được chỉ định rõ ràng với KCONFIG_CONFIGbiến môi trường; mặt khác, nó chỉ ghi đè .config:

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

Buildroot tự động hóa nó với BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Liên quan: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file


0

Tôi gặp vấn đề tương tự vì tôi muốn nâng cấp kernel CentOS của mình và cần phải làm điều đó trên một số máy. Giả sử ở đây cây nhân CentOS mới của tôi nằm trong /linux-5.1 (Tôi đã đăng nhập vào tài khoản root)

  1. cd /linux-5.1
  2. chạy make menuconfigvà thực hiện các thay đổi của bạn và lưu chúng vào.config
  3. sao chép /linux-5.1/.configtệp vào máy chủ phát triển của bạn
  4. Bây giờ để máy tiếp theo của bạn nâng cấp, bạn sẽ sao chép .configtệp từ máy chủ phát triển sang /linux-5.1/.configmáy mới.

Hy vọng điều này sẽ giúp ai đó trong tình trạng khó khăn tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.