GNU/Linux >> Belajar Linux >  >> Debian

Kernel kustom di Ubuntu/Debian – bagaimana, kapan dan mengapa

Jadi, Anda telah memutuskan untuk mencoba hal yang Anda dengar orang lain bicarakan, yang disebut 'mengkompilasi kernel khusus'. Jika Anda mencoba ini sebagai hobi, atau karena Anda ingin mempelajari keterampilan baru, sangat baik – baca terus.

Namun, sebelum kita mulai, kita akan mencoba menjelaskan situasi ketika kebutuhan ini muncul dan bagaimana menghadapinya. Perhatikan bahwa ini adalah subjek yang luas yang membutuhkan lebih banyak ruang daripada yang akan kami berikan di sini. Anda akan mempelajari dasar-dasarnya, apa yang Anda butuhkan, apa yang harus dilakukan, dan apa yang akan Anda capai.

Untuk info lebih lanjut, seperti biasa, Google adalah teman Anda; juga , penduduk dokumentasi di pohon sumber kernel akan menjawab banyak pertanyaan. Jadi, mari kita mulai dari awal, dengan catatan terakhir :jika perlu, kami akan menerbitkan lebih banyak artikel terkait kompilasi kernel yang berkaitan dengan distro lain.

Ketika Anda perlu mengkompilasi kernel Anda sendiri

Situasi pertama adalah ketika Anda membutuhkan kernel yang lebih baru daripada yang disediakan distro Anda, terutama ketika Anda menjalankan distribusi yang stabil (misalnya Debian stable, CentOS), karena kernel Anda tidak mendukung beberapa fitur/driver yang Anda butuhkan, atau hanya karena Anda merasa Anda ingin mencoba yang terbaru dan terbaik.

Namun, peringatan : jika Anda ingin menjalankan kernel yang mutakhir, pastikan itu kompatibel dengan komponen kunci lain dari sistem Anda (seperti glibc), ingatlah bahwa yang lebih baru berarti lebih sedikit pengujian dan (mungkin) lebih banyak ketidakstabilan; pengelola kernel distribusi Anda biasanya melakukan pekerjaan yang baik dengan mem-backport beberapa fitur baru ke kernel yang lebih lama dan lebih stabil, jadi pastikan Anda benar-benar membutuhkan yang terbaru. Saran kami adalah untuk tidak menggunakan kernel ini (kernel jangka panjang akan membuat pengecualian di sini) pada sistem produksi. Seperti yang dikatakan, percayai pengelola distro Anda.

Situasi kedua adalah Anda merasa menjalankan kernel yang membengkak, dengan banyak komponen yang tidak dibutuhkan. Sementara kernel hanya memuat modul yang cocok dengan perangkat keras yang ada, jejak memori kernel yang lebih kecil biasanya membantu mempercepat dan waktu boot.

# lspci -vv
# lsusb
# hwinfo
# cat /proc/cpuinfo

Perintah di atas membantu Anda untuk lebih mengenal perangkat keras Anda. Tuliskan apa yang Anda temukan dan pastikan Anda menjalankan perintah ls* di atas sebagai root, untuk informasi tambahan.

Situasi lain adalah Anda ingin membantu menguji kernel dengan menjalankan yang terbaru di sistem Anda. Peringatan yang sama seperti di atas berlaku:lakukan itu pada sistem pengujian, tetap berhubungan dengan upstream jika Anda menemukan bug (lkml.org adalah milis kernel utama – lalu lintas tinggi) dan cobalah untuk membantu sebisa mungkin ketika dimintai informasi .Ini tidak dapat cukup ditekankan :baca dokumentasi, baik karena Anda berada dalam situasi yang tidak menyenangkan , ingin melaporkan bug atau hanya memiliki pertanyaan.

Selanjutnya, Anda mungkin ingin menjadi anak yang keren di blok dan menjalankan yang terbaru dan terhebat, mungkin melirik sumbernya (asalkan Anda menyukai ini dan Anda memiliki pengetahuan C dan ASM) dan bahkan mengirimkan tambalan. Anda mungkin ingin melihat terlebih dahulu jika distribusi Anda belum menawarkan paket kernel yang lebih baru, misalnya Anda dapat menginstal kernel dari eksperimental Debian pada sistem pengujian, jika Anda mengubah sources.list Anda sesuai dengan itu. Sekali lagi, bekerja samalah dengan pengelola jika Anda menemukan bug.

Terminologi

Sebelum kita menggali lebih jauh ke dalam subjek yang agak misterius ini, kita harus membuat beberapa istilah dasar menjadi jelas(er); ini penting untuk memahami bagian-bagian penting dari pengujian dan kompilasi kernel.

  • kernel – Inti dari sistem operasi, bertanggung jawab mengelola sumber daya perangkat keras (I/O, jaringan, CPU, memori…). Pada dasarnya, ini adalah bagian penting dari OS yang bertanggung jawab atas semua pekerjaan kotor. Program pengguna berkomunikasi dengan kernel, meminta waktu CPU atau sumber daya lain oleh perpustakaan sistem yang bertindak sebagai perantara antara pengguna (lihat di bawah) dan kernel / perangkat keras. Kernel dapat berupa monolitik dan mikrokernel (untuk informasi lebih lanjut, jika Anda tertarik, lihat Pendekatan desain seluruh kernel di Wikipedia.org. Kernel mikro (seperti Minix) menggunakan skema desain yang membagi inti dari sisa kernel, dan itu sisanya dibagi menjadi beberapa komponen, masing-masing melakukan sesuatu yang spesifik :I/O, jaringan, dll. Kernel monolitik (Linux, BSD, Solaris), seperti namanya, terdiri dari sebagian besar kernel dalam satu unit, memiliki fungsionalitas tambahan (mis. ) disediakan oleh modul. Ada juga kernel hybrid, kombinasi antara keduanya, contoh yang baik adalah kernel Windows.
  • negara pengguna – segala sesuatu di OS yang bukan bagian dari kernel (library, aplikasi) dikatakan sebagai bagian dari userland. Namanya begitu jelas.
  • modul – seperti yang ditunjukkan sebelumnya, modul kernel adalah bagian dari perangkat lunak biner yang pada dasarnya "mengajarkan" kernel cara "berbicara" dengan perangkat keras atau menyediakan beberapa fungsionalitas (misalnya nfs)
  • kompiler – compiler adalah aplikasi yang pada dasarnya mengambil kode tertulis, seperti yang Anda unduh dari kernel.org, dan mengubahnya menjadi binari. Kompiler yang ditemukan di distribusi Linux disebut 'gcc', dan itu adalah singkatan dari GNU Compiler Collection, yang juga membutuhkan komponen penting untuk membangun perangkat lunak:utilitas yang ditemukan di binutils seperti assembler (as) atau library archiver (ar) .Pada sistem Debian, atau Ubuntu, orang dapat menemukan paket mana yang dimiliki file dengan menginstal dan menjalankan apt-file. Omong-omong, mari kita lihat paket apa yang perlu kita instal untuk membangun kernel yang sukses.
  • kernel vanila – ini adalah nama yang digunakan untuk kernel upstream, seperti yang ditemukan di kernel.org, jadi tanpa patch khusus distro.

Harap dicatat bahwa setiap kali Anda melihat perintah dalam dokumen ini dimulai dengan prompt ‘$’ itu berarti perintah harus dijalankan seperti biasa, pengguna sehari-hari; setiap kali Anda melihat ‘#’ prompt, artinya perintah tersebut harus dijalankan sebagai root (kami menggunakan sudo, tetapi itu tidak wajib). Direktori saat ini, kecuali ditentukan lain, adalah direktori yang menyimpan pohon sumber Anda, dalam hal ini, linux-2.6.

Yang perlu Anda instal

  • gcc – tentu saja, compiler sangat penting
  • binutils – paket ini berisi linker, assembler, dan utilitas lain yang penting untuk mengkompilasi program yang ditulis dalam C.
  • gcc-doc – halaman manual dan info untuk gcc. Berguna jika Anda ingin menjadi kotor dan memodifikasi beberapa flag kompilasi. Berguna pula jika Anda ingin menulis atau mengkompilasi paket C.
  • gdb – Debugger GNU. Tidak wajib tetapi berguna jika terjadi kesalahan. Gdb-doc juga akan membantu.
  • libreadline5-dev – untuk menggunakan antarmuka berbasis ncurses konfigurasi kernel. Anda dapat menggunakan antarmuka lain (lihat di bawah).
  • make – akan diinstal sebagai dependensi, tetapi hanya sedikit kata yang diurutkan. Lihat manual atau buku, karena ini bukan subjek yang bisa dijelaskan dengan mudah dalam waktu sesingkat itu. Make adalah utilitas yang digunakan saat mengkompilasi program C/C++, dan fungsinya adalah tampilannya di Makefile, berisi aturan tentang bagaimana dan dalam urutan apa build harus terjadi, dan mencoba menjalankan arahan tersebut. Baca Makefiles di pohon sumber untuk melihat sekilas.
  • git – Git adalah VCS (sistem kontrol versi), melakukan apa yang cvs atau subversion lakukan, yaitu membuat Anda tetap up-to-date dengan kernel tree terbaru.

Mendapatkan sumber kernel

Jika Anda ingin menginstal sumber dari distribusi Anda, gunakan

# apt-get install linux-source-<version>

di mana dapat dikumpulkan dari penerbitan:

uname -r

Gunakan ini jika Anda ingin memodifikasi kernel yang ada (menambahkan driver, memangkas, dll.). Jika tidak, Anda menginginkan kernel vanilla. Anda bisa mendapatkannya dari www.kernel.org ( kami sarankan wget atau curl di sini sebagai pengelola unduhan ) atau, jika Anda menginginkan yang terbaru, Anda akan menggunakan git. Sebaiknya simpan sumber di direktori home pengguna Anda, dan perintah untuk mendapatkan pohon arus utama terbaru adalah ( lihat man git ):

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

Di masa lalu kami menemukan mini-howto di http://linux.yyz.us/git-howto.html berguna; lihat juga kernelnewbies.org . Perintah di atas akan membuat folder di direktori Anda saat ini bernama linux-2.6, yang dapat diperbarui nanti dengan memasukkannya ke dalamnya dan mengeluarkan

sederhana
make clean; git pull 

Sekarang, setelah Anda memiliki sumbernya, kita harus mengkonfigurasi kernel .

Konfigurasi dan pembuatan

Jika Anda memiliki file .config yang sudah ada (file yang menyimpan opsi untuk pembuatan kernel – apa yang masuk dan apa yang tidak), salin file tersebut di linux-2.6 (dari /boot/config- atau /proc/config .gz – konfigurasi saat ini). Jika Anda tidak ingin mengubah .config yang ada, cukup keluarkan

$ make oldconfig

Jika tidak, baca terus. Jika Anda ingin mengubah konfigurasi yang ada, terbitkan

$ make menuconfig

(rekomendasi:Anda dapat menggunakan make config untuk banyak pertanyaan tentang opsi di kernel, atau make xconfig , yang memerlukan pustaka qt, untuk menu grafis yang lebih bagus), dan pilih “Load an Alternate Configuration File” dan tekan enter untuk .config , nama default file konfigurasi, atau ketik nama file alternatif yang sudah disimpan di linux-2.6.

Setelah itu, mulailah menelusuri menu untuk membuat perubahan yang diperlukan Aturan praktis di sini adalah "jika Anda tidak tahu apa fungsinya, jangan main-main dengannya", setidaknya sampai Anda mendapatkan pengalaman. Pada akhirnya, dari menu atas, pilih “Save an Alternate Configuration File” , tekan enter untuk nama default (.config – direkomendasikan) dan kemudian “Exit” dari bawah. Jika Anda ingin memulai dari awal, lupakan langkah "Muat File Konfigurasi Alternatif" dan lanjutkan. Pada kompilasi kernel Anda berikutnya, setelah membersihkan dan memperbarui pohon, gunakan 'make oldconfig' seperti di atas untuk menggunakan konfigurasi lama. Oke, sekarang kita memiliki konfigurasi yang disesuaikan dengan kebutuhan kita yang tinggal menunggu untuk dibangun. Membangun kernel semudah mengonfigurasinya (!). Cukup ketik make dan hasilnya akan terlihat seperti di bawah ini:

$ make 

  HOSTCC  scripts/basic/fixdep 
  HOSTCC  scripts/kconfig/conf.o 
  SHIPPED scripts/kconfig/zconf.tab.c 
  SHIPPED scripts/kconfig/zconf.lex.c 
  SHIPPED scripts/kconfig/zconf.hash.c 
  HOSTCC  scripts/kconfig/zconf.tab.o 
  HOSTLD  scripts/kconfig/conf 
  
  CHK     include/linux/version.h 
  UPD     include/linux/version.h 
  CHK     include/generated/utsrelease.h 
  UPD     include/generated/utsrelease.h 
  CC        kernel/bounds.s 
  GEN     include/generated/bounds.h 
  CC        arch/x86/kernel/asm-offsets.s 
...

dan , setelah beberapa saat, tergantung pada mesin dan konfigurasi kernel Anda, itu akan selesai. Jika Anda ingin sedikit mempercepat, gunakan flag -jn untuk membuat, di mana n adalah jumlah prosesor/core + 1. Namun hati-hati, itu dapat mengekspos bug di kernel atau membangun infrastruktur, jadi jika terjadi kesalahan, coba lagi dengan hanya menggunakan make tanpa flag. Jika setelah membaca manual gcc (dan jika Anda masih waras), Anda merasa ingin tahu dan ingin memodifikasi beberapa flag khusus perangkat keras, atau ingin mengoptimalkan kode, gunakan halaman manual make untuk mengetahui caranya (terutama COPTS dan CFLAGS ). Namun, pengoptimalan yang lebih besar dari -O2 berisiko.

Hati-hati dan perkirakan kerusakan, kernel dapat dikompilasi tanpa masalah, tetapi dapat bertindak aneh. Ingatlah untuk mengetik semua perintah sebagai pengguna biasa. Tidak perlu membangun sebagai root dan pengembang kernel tidak menyukai ide tersebut.

Pemasangan

Sekarang mari kita instal modul :ini perlu dilakukan sebagai root, karena modul diinstal di /lib, dan pengguna biasa tidak memiliki akses tulis di sana. Jadi,

# make modules_install 

melakukan hal itu, dan ini perlu dilakukan sebelum menginstal kernel agar modul dan kernel yang diinstal sinkron. Gunakan

# make install 

untuk menginstal kernel ke /boot, lalu

# depmod 

dan bersiaplah untuk membuat initramfs ( sistem file RAM awal ), yang merupakan sistem file sementara yang dimuat ke RAM pada tahap boot awal, dan digunakan untuk menyediakan driver dasar dan fasilitas lain agar sistem file root dapat dipasang. Informasi lebih lanjut dapat ditemukan di halaman Initrd Wikipedia. Perintah yang diperlukan untuk tugas tersebut adalah update-initramfs (ini dipanggil juga setiap kali kernel baru diinstal, dipicu oleh manajer paket) yang dapat membuat initramfs ( -c ) atau memperbarui yang sudah ada ( -u ) . Perintah lengkapnya adalah

# update-initramfs -c -k  

Versi adalah yang akan Anda lihat setelah 'make modules_install' selesai ( baris terakhir dari outputnya adalah "DEPMOD"). Jika Anda ingin memiliki nomor versi yang tepat dan lebih panjang, Anda dapat memberi tahu pengembang apa "git moment" yang Anda gunakan, pilih "Pengaturan Umum" → "Secara otomatis menambahkan informasi versi ke string versi" setelah mengeluarkan menuconfig. Output pada sistem Ubuntu saya terlihat seperti ini :

update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+
...

Perbarui Grub Anda agar mengetahui kernel baru Anda dengan

# update-grub

Pada mesin pengujian Debian saya, outputnya terlihat seperti ini :

Generating grub.cfg ... 
Found background image: /usr/share/images/desktop-base/desktop-grub.png 
Found linux image: /boot/vmlinuz-3.0.0-1-amd64 
Found initrd image: /boot/initrd.img-3.0.0-1-amd64 
Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 
Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 
Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 
Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 
Found linux image: /boot/vmlinuz-2.6.39-2-amd64 
Found initrd image: /boot/initrd.img-2.6.39-2-amd64 
Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 
Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 
Found linux image: /boot/vmlinuz-2.6.38.5 
Found initrd image: /boot/initrd.img-2.6.38.5 
Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 
Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 
Found linux image: /boot/vmlinuz-2.6.38.4 
Found initrd image: /boot/initrd.img-2.6.38.4 
Found linux image: /boot/vmlinuz-2.6.38-2-amd64 
Found initrd image: /boot/initrd.img-2.6.38-2-amd64 
Found linux image: /boot/vmlinuz-2.6.32-5-amd64 
Found initrd image: /boot/initrd.img-2.6.32-5-amd64 
Found memtest86+ image: /memtest86+.bin 
Found memtest86+ multiboot image: /memtest86+_multiboot.bin 
done 

Tentu saja, output Anda tidak akan terlihat persis sama, tetapi garis besarnya harus sama; terakhir, ingat:jika Anda mau, edit /etc/default/grub untuk mengubah beberapa opsi sebelum update-grub dan , dengan harapan, reboot mesin Anda untuk menguji kernel baru.

Jika terjadi kesalahan

Situasi yang paling umum ketika kernel baru Anda tidak dapat digunakan adalah Anda tidak dapat mem-boot-nya sejak awal, atau kernel baru Anda boot dan tidak memiliki beberapa driver penting (misalnya driver jaringan). Biasanya, update-grub bekerja dengan baik dalam menulis file menu grub, tetapi Anda mungkin tetap ingin memeriksanya. Jika Anda melewati grub, kemungkinan Anda terlalu bersemangat dan mengeluarkan driver penting untuk sistem, seperti bagian terkait disk (ATA, SATA, SCSI…), atau mungkin NFS, jika Anda memiliki root yang dipasang di NFS. Boot kernel yang berfungsi dan konfigurasi ulang, menggunakan Google dan kemungkinan sumber lain, seperti IRC .

Kemungkinannya adalah seseorang telah menemukan masalah Anda di masa lalu dan Anda memiliki peluang untuk menemukan jawaban. Jika masalahnya lebih serius, dan Anda yakin telah membaca tentang netiket dan cara memposting ke milis kernel, tanyakan dengan baik. Ada banyak orang baik dan suka membantu di luar sana, tetapi mereka cenderung tidak terlalu baik ketika Anda belum mengerjakan pekerjaan rumah dan/atau membuang-buang waktu mereka. Jika Anda memiliki /boot terpisah, perlu diingat bahwa itu biasanya tidak terlalu besar dan mungkin akan cepat penuh dengan kernel. Juga /lib/modules cenderung mengakumulasi banyak ruang di /, jadi pastikan untuk melakukan pembersihan dari waktu ke waktu. Ingatlah bahwa kernel adalah perangkat lunak yang kompleks dan banyak penyebab yang dapat menjadi akar masalah Anda. Jika Anda tidak mengalami masalah dalam mengikuti panduan ini, Anda siap untuk konfigurasi kernel Linux yang lebih canggih.


Debian
  1. Cara Menginstal Python 3.7 di Ubuntu, Debian dan LinuxMint

  2. Mengapa Ubuntu Membutuhkan Dua Kernel?

  3. Cara Menginstal Monit (Pemantauan Proses dan Layanan) di Ubuntu / Debian

  1. Cara Menghapus Kernel Lama di Ubuntu 16.04, 18.04, dan 19.04

  2. Debian – Bagaimana Melakukannya Sebelum Dual-boot Windows 7 Dan Debian Di Efi?

  3. Cara Mengkompilasi dan Menginstal wxWidgets di Ubuntu/Debian/Linux Mint

  1. Cara Menginstal Netflix di Kodi di Ubuntu dan Debian

  2. Cara menghapus kernel lama di Ubuntu

  3. Cara Menginstal dan Mengkonfigurasi Webmin di Debian / Ubuntu