Apa yang terjadi di setiap langkah proses pengembangan kernel Linux?

27

Saya telah membaca banyak tutorial tentang cara membangun kernel khusus dan mem-boot Ubuntu menggunakan kernel tersebut, dan berhasil mengikuti panduan dan mem-boot kernel kustom, tetapi saya tidak mengerti tentang apa yang masing-masing perintah dalam panduan lakukan dan apa yang sebenarnya terjadi dengan setiap perintah.

Prosedur yang dijelaskan di situs Ubuntu melakukan banyak pekerjaan dengan fakeroot, dpkg, make-kpkg, beberapa initramfs, dan hal-hal mengerikan lainnya yang bekerja tetapi hanya tidak membantu saya memahami apa yang sedang terjadi.

  • Apa output dari makedalam direktori kernel linux?
  • Apakah itu membuat "image kernel terkompresi"?
  • Apa nama file "image kernel terkompresi" dan di mana ia ditempatkan?
  • Apa yang make modulesharus dilakukan
  • Haruskah make modulesdilakukan sebelum atau sesudah make?
  • Tidak makemembangun modul saya secara otomatis?
  • Apa prosesnya (dalam bahasa Inggris, bukan hanya daftar perintah) untuk menambahkan kernel yang baru dibangun ke daftar kernel yang dapat di-boot?
  • Apa yang make installharus dilakukan
  • Akan make installmenambahkannya ke daftar kernel bootable sehingga saya tidak perlu melakukan apa-apa lagi?
  • Apakah ada yang setara make modules_install?
AnkurVj
sumber
Ini harus dibagi menjadi beberapa pertanyaan.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

34

Dari atas...

  • makemengkompilasi dan menautkan gambar kernel. Ini adalah satu file bernama vmlinuz.
  • make modulesmengkompilasi file individual untuk setiap pertanyaan yang Anda jawab Mselama konfigurasi kernel. Kode objek dihubungkan dengan kernel yang baru Anda buat. (Untuk pertanyaan yang dijawab Y, ini sudah menjadi bagian dari vmlinuz, dan untuk pertanyaan yang dijawab, Nmereka dilewati).
  • make installinstal kernel bawaan Anda ke /vmlinuz.
  • make modules_installmenginstal modul kernel Anda ke /lib/modulesatau /lib/modules/<version>.

Adapun menambahkannya ke daftar kernel yang tersedia, itu dirawat oleh boot loader. Ini berbeda untuk setiap boot loader, tetapi grubyang paling umum pada x86 dan amd64 jadi saya akan menjelaskannya. Ini sebenarnya cukup sederhana. Grub melihat ke dalam /, /bootdan /lib/modulesuntuk hal apa pun yang terlihat seperti kernel yang berfungsi dan menambahkannya. Dan ya, ini adalah deskripsi yang terlalu disederhanakan.

Itu "hal-hal mengerikan" ekstra dalam dokumentasi Ubuntu adalah hal-hal tambahan untuk membuat debpaket. Ketika Anda melakukannya untuk lebih dari diri Anda sendiri, itu jauh lebih baik untuk mengemasnya. Anda akan beralih waktu.

Membangun kernel dan modul disimpan terpisah karena untuk orang-orang yang perlu (yaitu, pengembang kernel) mereka sering membuat perubahan hanya pada modul. Mereka dapat menerapkan perubahan mereka, membangun kembali, dan menginstal hanya modul. Ini menghemat banyak waktu ketika harus dilakukan 20 kali sehari. Tidak akan pernah diperbarui untuk memiliki satu make everythingperintah. Anda sebaliknya, jalankan make && make modules && make install && make modules_install seperti yang dikatakan dokumentasi lakukan . Proses build lebih mendukung pengembang kernel, bukan Anda. Dan memang seharusnya begitu.

Pada kenyataannya hampir tidak ada alasan bagi siapa pun kecuali pengembang kernel atau pembuat paket distro untuk mengkompilasi kernel. Dalam hampir semua keadaan, fitur kernel yang Anda inginkan telah dibangun untuk Anda dan tersedia di salah satu kernel yang sudah dikemas sebelumnya. Ada pengecualian, tetapi mereka sangat jarang hari ini.

Bukannya saya mengecilkan hati Anda dari membangun kernel Anda sendiri, saya benar-benar mendorong Anda untuk melakukannya. Saya pikir membangun kernel Anda dari awal adalah praktik yang sangat berharga untuk mempelajari bagaimana semuanya bekerja di sana. Sebagian, karena mungkin suatu hari Anda akan menjadi pengecualian yang perlu. Tetapi itu juga mengajarkan Anda banyak tentang proses kernel & boot secara umum. Anda akan menjadi orang yang lebih baik karena telah melakukannya.

bahamat
sumber
1
Terima kasih banyak atas deskripsi proses yang dapat dibaca manusia. Saya punya beberapa keraguan. Kompilasi kernel saya menghasilkan vmlinux dan bukan vmlinuz. Saya pikir perbedaannya adalah kompresi. Haruskah saya mengompres gambar secara manual? Apakah /vmlinuzdirektori ada di folder root? ketika saya melakukan make install, apakah direktori ini akan dibuat dan kernel baru ditempatkan di sana? Apakah akan make modules_installmengganti modul yang saya instal saat ini? Misalkan saya menempatkan vmlinux saya di direktori / boot, apakah saya perlu melakukan sesuatu yang lain (seperti mengedit file konfigurasi grub dan melakukan pembaruan grub atau sesuatu setelah itu?)
AnkurVj
3
Anda benar, perbedaannya adalah kompresi. Perintahnya make bzimageadalah apa yang melakukan itu. /vmlinuzadalah file biner, bukan direktori. Saya hanya membuat kernel paket selama 5 tahun terakhir, jadi saya tidak ingat persis perilaku modules_installkernel yang diinstal secara langsung. Grub akan menemukan kernel Anda /boottanpa bantuan. Ya, Anda harus selalu menjalankan grub-updatesetelah menginstal kernel baru.
bahamat
jadi saya seharusnya melakukan make bzimagebukan make? APAKAH saya perlu melakukan make cleandan make bzimagelagi? Dengan /vmlinuzmaksud Anda file akan dibuat di direktori root atau di direktori source kernel linux?
AnkurVj
1
Tidak masalah apakah kernel Anda dikompres atau tidak. Terkompresi hanya membutuhkan sedikit ruang disk. Apa pun yang diawali dengan /adalah jalur absolut, jadi ya itu file di root.
bahamat
1
@GuyAvraham Modul menjawab Ydikompilasi dalam (yaitu, mereka adalah bagian dari vmlinuz). Modul yang dijawab Mdikompilasi sebagai modul yang dapat dimuat. Modul yang dijawab Ntidak dikompilasi. make modules_installhanya berlaku untuk mereka yang menjawab M.
bahamat