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.
- menyiratkan satu sama lain melalui
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:
-
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. -
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. -
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 padaDEBUG_INFO
:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFO
Jadi saat
DEBUG_INFO
tidak aktif, mereka tidak muncul sama sekali. -
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 sepertiDEBUG_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
-
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 diinit/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 adalah32
, tetapi kami memiliki64
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.