GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dilakukan make oldconfig persis di makefile kernel Linux?

Itu membaca .config yang ada file yang digunakan untuk kernel lama dan meminta pengguna untuk opsi di sumber kernel saat ini yang tidak ditemukan di file. Ini berguna saat mengambil konfigurasi yang sudah ada dan memindahkannya ke kernel baru.


Sebelum Anda menjalankan make oldconfig , Anda perlu menyalin file konfigurasi kernel dari kernel lama ke direktori root dari kernel baru.

Anda dapat menemukan salinan file konfigurasi kernel lama pada sistem yang sedang berjalan di /boot/config-3.11.0 . Atau, kode sumber kernel memiliki konfigurasi di linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

Jika sumber kernel Anda berada di /usr/src/linux :

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig

Ringkasan

Seperti yang disebutkan oleh Ignacio, ini memperbarui .config Anda untuk Anda setelah Anda memperbarui sumber kernel, mis. dengan git pull .

Itu mencoba mempertahankan opsi Anda yang ada.

Memiliki skrip untuk itu sangat membantu karena:

  • opsi baru mungkin telah ditambahkan, atau yang lama dihapus

  • format konfigurasi Kconfig kernel memiliki opsi yang:

    • menyiratkan satu sama lain melalui select
    • bergantung pada yang lain melalui depends

    Hubungan opsi tersebut membuat resolusi konfigurasi manual menjadi lebih sulit.

Mari ubah .config secara manual untuk memahami cara menyelesaikan konfigurasi

Pertama, buat konfigurasi default dengan:

make defconfig

Sekarang edit .config yang dihasilkan file secara manual untuk meniru pembaruan kernel dan menjalankan:

make oldconfig

untuk melihat apa yang terjadi. Beberapa kesimpulan:

  1. Jenis baris:

    # CONFIG_XXX is not set
    

    bukan sekadar komentar, tetapi sebenarnya menunjukkan bahwa parameter tidak disetel.

    Misalnya, jika kita menghapus baris:

    # CONFIG_DEBUG_INFO is not set
    

    dan jalankan make oldconfig , ia akan bertanya kepada kita:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    Setelah selesai, .config file akan diperbarui.

    Jika Anda mengubah karakter baris apa pun, mis. ke # CONFIG_DEBUG_INFO , tidak masuk hitungan.

  2. Jenis baris:

    # CONFIG_XXX is not set
    

    selalu digunakan untuk negasi properti, meskipun:

    CONFIG_XXX=n
    

    juga dipahami sebagai negasi.

    Misalnya, jika Anda menghapus # CONFIG_DEBUG_INFO is not set dan jawab:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    dengan N , maka file keluaran berisi:

    # CONFIG_DEBUG_INFO is not set
    

    dan bukan:

    CONFIG_DEBUG_INFO=n
    

    Juga, jika kita mengubah baris secara manual menjadi:

    CONFIG_DEBUG_INFO=n
    

    dan jalankan make oldconfig , lalu baris diubah menjadi:

    # CONFIG_DEBUG_INFO is not set
    

    tanpa oldconfig meminta kami.

  3. Konfigurasi yang dependensinya tidak terpenuhi, tidak muncul di .config . Semua yang lain melakukannya.

    Misalnya, tetapkan:

    CONFIG_DEBUG_INFO=y
    

    dan jalankan make oldconfig . Sekarang akan meminta kami untuk:DEBUG_INFO_REDUCED , DEBUG_INFO_SPLIT , dll. konfigurasi.

    Properti tersebut tidak muncul di defconfig sebelumnya.

    Jika kita melihat di bawah lib/Kconfig.debug di mana mereka didefinisikan, kita melihat bahwa mereka bergantung pada DEBUG_INFO :

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Jadi saat DEBUG_INFO tidak aktif, mereka tidak muncul sama sekali.

  4. Konfigurasi yang selected dengan mengaktifkan konfigurasi secara otomatis diatur tanpa meminta pengguna.

    Misalnya, jika CONFIG_X86=y dan kami menghapus baris:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    dan jalankan make oldconfig , baris dibuat ulang tanpa meminta kami, tidak seperti DEBUG_INFO .

    Ini terjadi karena arch/x86/Kconfig berisi:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    dan pilih memaksa opsi itu menjadi kenyataan. Lihat juga:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig

  5. Konfigurasi yang batasannya tidak terpenuhi akan diminta.

    Misalnya, defconfig telah menetapkan:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Jika kita mengedit:

    CONFIG_64BIT=n
    

    dan jalankan make oldconfig , ia akan bertanya kepada kita:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    Ini karena RCU_FANOUT didefinisikan di init/Kconfig sebagai:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    Oleh karena itu, tanpa 64BIT , nilai maksimumnya adalah 32 , tetapi kami memiliki 64 atur di .config , yang akan membuatnya tidak konsisten.

Bonus

make olddefconfig menyetel setiap opsi ke nilai defaultnya tanpa bertanya secara interaktif. Itu dijalankan secara otomatis pada make untuk memastikan bahwa .config konsisten jika Anda memodifikasinya secara manual seperti yang kami lakukan. Lihat juga:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfig seperti make olddefconfig , tetapi juga menerima fragmen konfigurasi untuk digabungkan. Target ini digunakan oleh merge_config.sh skrip:https://stackoverflow.com/a/39440863/895245

Dan jika Anda ingin mengotomatiskan .config modifikasi, itu tidak terlalu sederhana:Bagaimana Anda secara non-interaktif mengaktifkan fitur dalam file .config kernel Linux?


Memperbarui konfigurasi lama dengan opsi baru/diubah/dihapus.


Linux
  1. Apa itu Kernel Linux, dan haruskah Anda mengupgrade ke Kernel terbaru?

  2. Linux – Apa yang Dilakukan 'membuat Localmodconfig'?

  3. Apa artinya mengatakan kernel linux bersifat preemptive?

  1. Bagaimana kernel Linux menentukan urutan panggilan __init?

  2. Apa sumber kernel Linux saat ini?

  3. Apa arti pipa linux | melakukan?

  1. Apa manfaat mengkompilasi kernel linux Anda sendiri?

  2. Apa sebenarnya header kernel Linux itu?

  3. Apa arti nama antarmuka eth0 di Linux?