สคริปต์จะทำให้ menuconfig ทำการตั้งค่าลินุกซ์เคอร์เนลบิลด์ได้อย่างไร?


10

ฉันต้องการสร้างลินุกซ์อัตโนมัติ แต่ในที่สุดก็มาถึงจุดที่ฉันต้องรันสิ่งที่ดูเหมือนจะเป็นขั้นตอนที่make menuconfigต้องทำด้วยตัวเอง: . ดูเหมือนว่าจะซิงโครไนซ์การกำหนดค่าระหว่างระบบปฏิบัติการและการกำหนดค่าเคอร์เนล?

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.

ซึ่งดูเหมือนว่ามีกฎที่ขาดหายไปใน makefile อาจเป็นเพราะ makefile นั้นไม่มีอยู่จริงหรือ makefile ไม่ได้ถูกสร้างขึ้น / morphed เพื่อให้มีกฎนั้น แต่นั่นเป็นคำถามแยกต่างหาก

อาจมีวิธีที่ฉลาดกว่าในการเข้าถึงสิ่งนี้ด้วยกัน มีการกำหนดค่าอื่น ๆ ที่ฉันไม่ได้ติดตาม แต่ควร (เช่น oldconfig) หรือไม่


1
คุณผ่านการทดสอบแล้วmake olddefconfigหรือยัง
jimmij

ไม่อ่านเพิ่มเติมเกี่ยวกับตอนนี้ ... มันช่างเจ็บปวดเหลือเกินเพราะการทดลองขนาดเล็กใช้เวลานานมาก
tarabyte

คำตอบ:


8

ลีนุกซ์เคอร์เนลบิลด์ให้เป้าหมายการสร้างมากมาย, วิธีที่ดีที่สุดที่จะรู้ว่ามันน่าจะเป็น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ไฟล์ของคุณด้วยเคอร์เนลใหม่


1
randconfigทำให้ฉันประหลาดใจ ใช้สันนิษฐานว่าจะทดสอบการสร้างโดยการสร้างชุดค่าผสมที่ไม่น่า?
conorsch

2
ใช่มันถูกใช้อย่างแม่นยำเป็น fuzzer สำหรับไฟล์การกำหนดค่า ดูคำถามนี้เมื่อรวบรวมเคอร์เนล Linux จุดประสงค์make randconfigคืออะไร (บนเว็บไซต์ 'ถาม Ubuntu')
perror

2

merge_config.sh แฟรกเมนต์ config

$ 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.shเป็น front-end ที่เรียบง่ายสำหรับ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: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

ที่เกี่ยวข้อง: /programming/7505164/how-do-you-non-interactively-turn-on-features-in-a-linux-kernel-config-file


0

ฉันมีปัญหาเดียวกันนี้เนื่องจากฉันต้องการอัพเกรดเคอร์เนล 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บนเครื่องใหม่

หวังว่าสิ่งนี้จะช่วยให้ใครบางคนอยู่ในสถานการณ์เดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.