Bagaimana cara membuat skrip menuconfig untuk mengotomatisasi konfigurasi kernel Linux?


10

Saya ingin mengotomatisasi membangun Linux tapi akhirnya sampai ke titik di mana saya harus menjalankan apa yang tampaknya menjadi langkah yang sangat panduan: make menuconfig. Ini tampaknya menyinkronkan konfigurasi antara OS dan konfigurasi kernel?

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

Pada dasarnya, bagaimana cara menghapus panggilan ke make menuconfiguntuk skrip pembuatan?

Sebagai tambahan, ini sebagai reaksi terhadap kesalahan build yang tampaknya terjadi ketika saya berlari tanpa pernah memanggil make menuconfig:

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

Yang tampaknya ada aturan yang hilang dalam makefile mungkin karena makefile itu sendiri TIDAK ada atau makefile belum dibuat / diubah untuk mengandung aturan itu tetapi itu adalah pertanyaan yang terpisah.

Mungkin ada cara yang lebih cerdas untuk mendekati ini secara bersamaan. Apakah ada konfigurasi lain yang tidak saya lacak tetapi harus (mis. Oldconfig)?


1
Sudahkah Anda menguji make olddefconfig?
jimmij

tidak, membaca lebih lanjut tentang itu sekarang ... itu sangat menyakitkan karena setiap percobaan kecil memakan waktu begitu lama.
tarabyte

Jawaban:


8

Sistem kernel Linux memberikan banyak target pembuatan, cara terbaik untuk mengetahuinya adalah dengan melakukan 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

Seperti yang dikatakan Jimmij dalam komentar, bagian yang menarik ada di oldconfigtarget terkait.

Secara pribadi, saya akan merekomendasikan Anda untuk mencari silentoldconfig(jika tidak ada yang berubah dalam .configfile atau olddefconfigjika Anda memperbarui .configfile Anda dengan kernel baru.


1
randconfigmengejutkan saya. Agaknya digunakan untuk menguji bangunan dengan menghasilkan kombinasi yang tidak mungkin?
Conorsch

2
Ya, ini tepatnya digunakan sebagai fuzzer untuk file konfigurasi. Lihat pertanyaan ini: Ketika mengkompilasi Kernel Linux, apa tujuannya make randconfig? (di situs web 'Tanya Ubuntu').
perror

2

merge_config.sh fragmen konfigurasi

$ 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

Sayangnya, substitusi proses tidak berfungsi:

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

karena: https://unix.stackexchange.com/a/164109/32558

merge_config.shadalah front-end sederhana untuk make alldefconfigtarget.

Ketika kompilasi silang, ARCHharus diekspor saat Anda menjalankan merge_config.sh, misalnya:

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

File output gabungan dapat ditentukan secara eksplisit dengan KCONFIG_CONFIGvariabel lingkungan; kalau tidak, itu hanya akan menimpa .config:

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

Buildroot mengotomatiskannya dengan BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES: /programming/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Terkait: /programming/7505164/how-do-you-non-interactive-turn-on-features-in-a-linux-kernel-config-file


0

Saya memiliki masalah yang sama karena saya ingin memutakhirkan kernel CentOS saya dan perlu melakukannya pada beberapa mesin. Asumsikan di sini pohon kernel CentOS saya yang baru ada di /linux-5.1 (Saya masuk ke akun root)

  1. cd /linux-5.1
  2. jalankan make menuconfigdan lakukan perubahan Anda dan simpan untuk.config
  3. salin /linux-5.1/.configfile ke server pengembangan Anda
  4. Sekarang untuk mesin Anda berikutnya untuk memutakhirkan Anda akan menyalin .configfile dari server pengembangan Anda ke /linux-5.1/.configpada mesin baru.

Semoga ini bisa membantu seseorang dalam kesulitan yang sama.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.