GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengkompilasi kernel Linux di abad ke-21

Dalam komputasi, kernel adalah perangkat lunak tingkat rendah yang menangani komunikasi dengan perangkat keras dan koordinasi sistem umum. Selain beberapa firmware awal yang terpasang di motherboard komputer Anda, saat Anda memulai komputer, kernellah yang memberikan kesadaran bahwa ia memiliki hard drive dan layar serta keyboard dan kartu jaringan. Ini juga merupakan tugas kernel untuk memastikan waktu yang sama (kurang lebih) diberikan ke setiap komponen sehingga grafik dan audio serta sistem file dan jaringan Anda berjalan dengan lancar, meskipun berjalan secara bersamaan.

Pencarian untuk dukungan perangkat keras, bagaimanapun, sedang berlangsung, karena semakin banyak perangkat keras yang dirilis, semakin banyak hal yang harus diadopsi oleh kernel ke dalam kodenya untuk membuat perangkat keras bekerja seperti yang diharapkan. Sulit untuk mendapatkan angka yang akurat, tetapi kernel Linux tentu saja merupakan salah satu kernel teratas untuk kompatibilitas perangkat keras. Linux mengoperasikan komputer dan ponsel yang tak terhitung banyaknya, sistem tertanam pada papan chip (SoC) untuk keperluan hobi dan industri, kartu RAID, mesin jahit, dan banyak lagi.

Konten terkait

Kembali di abad ke-20 (dan bahkan di tahun-tahun awal abad ke-21), tidak masuk akal bagi pengguna Linux untuk berharap bahwa ketika mereka membeli perangkat keras yang sangat baru, mereka perlu mengunduh kode sumber kernel terbaru, kompilasi, dan instal agar mereka bisa mendapatkan dukungan untuk perangkat. Namun, akhir-akhir ini, Anda akan kesulitan menemukan pengguna Linux yang mengkompilasi kernel mereka sendiri kecuali untuk kesenangan atau keuntungan melalui perangkat keras khusus yang sangat khusus. Saat ini umumnya tidak diperlukan untuk mengkompilasi kernel Linux sendiri.

Berikut adalah alasannya, ditambah tutorial singkat tentang cara mengkompilasi kernel saat Anda membutuhkannya.

Perbarui kernel Anda yang ada

Baik Anda memiliki laptop baru dengan kartu grafis atau chipset WiFi baru yang mewah atau Anda baru saja membawa pulang printer baru, sistem operasi Anda (disebut GNU+Linux atau hanya Linux, yang juga merupakan nama kernel ) membutuhkan driver untuk membuka saluran komunikasi ke komponen baru tersebut (kartu grafis, chip WiFi, printer, atau apa pun). Terkadang bisa menipu saat Anda mencolokkan perangkat baru dan komputer Anda muncul untuk mengakuinya. Tapi jangan biarkan hal itu membodohi Anda. Terkadang itu semua yang Anda butuhkan, tetapi di lain waktu OS Anda hanya menggunakan protokol umum untuk menyelidiki perangkat yang terpasang.

Misalnya, komputer Anda mungkin dapat mengidentifikasi printer jaringan baru Anda, tetapi terkadang itu hanya karena kartu jaringan di printer diprogram untuk mengidentifikasi dirinya ke jaringan sehingga dapat memperoleh alamat DHCP. Ini tidak berarti bahwa komputer Anda tahu instruksi apa yang harus dikirim ke printer untuk menghasilkan halaman teks yang dicetak. Bahkan, Anda mungkin berpendapat bahwa komputer bahkan tidak benar-benar "tahu" bahwa perangkat itu adalah printer; mungkin hanya menampilkan bahwa ada perangkat di jaringan pada alamat tertentu dan perangkat mengidentifikasi dirinya dengan rangkaian karakter p-r-i-n-t-e-r . Konvensi bahasa manusia tidak ada artinya bagi komputer; yang dibutuhkan adalah driver.

Pengembang kernel, produsen perangkat keras, teknisi pendukung, dan penggemar semua tahu bahwa perangkat keras baru terus-menerus dirilis. Banyak dari mereka yang berkontribusi driver, diserahkan langsung ke tim pengembangan kernel untuk dimasukkan ke dalam Linux. Sebagai contoh, driver kartu grafis Nvidia sering ditulis ke dalam modul kernel Nouveau dan, karena kartu Nvidia umum, kode tersebut biasanya disertakan dalam kernel apa pun yang didistribusikan untuk penggunaan umum (seperti kernel yang Anda dapatkan saat mengunduh Fedora atau Ubuntu. Dimana Nvidia kurang umum, misalnya dalam sistem tertanam, modul Nouveau biasanya dikecualikan. Modul serupa ada untuk banyak perangkat lain:printer mendapat manfaat dari Foomatic dan CUPS, kartu nirkabel memiliki modul b43, ath9k, wl, dan sebagainya.

Distribusi cenderung menyertakan sebanyak yang mereka bisa secara wajar dalam kernel Linux mereka karena mereka ingin Anda dapat memasang perangkat dan mulai menggunakannya segera, tanpa instalasi driver yang diperlukan. Sebagian besar, itulah yang terjadi, terutama sekarang karena banyak vendor perangkat sekarang mendanai pengembangan driver Linux untuk perangkat keras yang mereka jual dan mengirimkan driver tersebut langsung ke tim kernel untuk distribusi umum.

Namun, terkadang Anda menjalankan kernel yang Anda instal enam bulan lalu dengan perangkat baru yang menarik yang baru saja diluncurkan seminggu yang lalu. Dalam hal ini, kernel Anda mungkin tidak memiliki driver untuk perangkat tersebut. Kabar baiknya adalah sering kali, driver untuk perangkat tersebut mungkin ada di kernel edisi terbaru, artinya Anda hanya perlu memperbarui apa yang sedang Anda jalankan.

Umumnya, ini dilakukan melalui manajer paket. Misalnya, di RHEL, CentOS, dan Fedora:

$ sudo dnf update kernel

Di Debian dan Ubuntu, pertama-tama dapatkan versi kernel Anda saat ini:

$ uname -r
4.4.186

Cari versi yang lebih baru:

$ sudo apt update
$ sudo apt search linux-image

Instal versi terbaru yang Anda temukan. Dalam contoh ini, yang terbaru tersedia adalah 5.2.4:

$ sudo apt install linux-image-5.2.4

Setelah upgrade kernel, Anda harus reboot (kecuali jika Anda menggunakan kpatch atau kgraft). Kemudian, jika driver perangkat yang Anda butuhkan ada di kernel terbaru, perangkat keras Anda akan bekerja seperti yang diharapkan.

Instal modul kernel

Terkadang sebuah distribusi tidak berharap bahwa penggunanya sering menggunakan perangkat (atau setidaknya driver perangkat tidak perlu berada di kernel Linux). Linux mengambil pendekatan modular untuk driver, sehingga distribusi dapat mengirimkan paket driver terpisah yang dapat dimuat oleh kernel meskipun driver tidak dikompilasi ke dalam kernel itu sendiri. Ini berguna, meskipun bisa menjadi rumit ketika driver tidak disertakan dalam kernel tetapi diperlukan saat boot, atau ketika kernel diperbarui dari bawah driver modular. Masalah pertama diselesaikan dengan initrd (disk RAM awal) dan di luar cakupan artikel ini, dan yang kedua diselesaikan oleh sistem yang disebut kmod .

Sistem kmod memastikan bahwa ketika kernel diperbarui, semua driver modular yang diinstal di sampingnya juga diperbarui. Jika Anda menginstal driver secara manual, Anda kehilangan otomatisasi yang disediakan kmod, jadi Anda harus memilih paket kmod kapan pun tersedia. Misalnya, sementara driver Nvidia dibangun ke dalam kernel sebagai driver Nouveau, driver Nvidia resmi hanya didistribusikan oleh Nvidia. Anda dapat menginstal driver bermerek Nvidia secara manual dengan membuka situs web, mengunduh .run file, dan menjalankan skrip shell yang disediakannya, tetapi Anda harus mengulangi proses yang sama setelah Anda menginstal kernel baru, karena tidak ada yang memberi tahu manajer paket Anda bahwa Anda menginstal driver kernel secara manual. Karena Nvidia menggerakkan grafis Anda, memperbarui driver Nvidia secara manual biasanya berarti Anda harus melakukan pembaruan dari terminal, karena Anda tidak memiliki grafis tanpa driver grafis yang berfungsi.

Namun, jika Anda menginstal driver Nvidia sebagai paket kmod, memperbarui kernel Anda juga memperbarui driver Nvidia Anda. Di Fedora dan terkait:

$ sudo dnf install kmod-nvidia

Di Debian dan terkait:

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

Ini hanya sebuah contoh, tetapi jika Anda menginstal driver Nvidia di kehidupan nyata, Anda juga harus memasukkan driver Nouveau ke daftar hitam. Lihat dokumentasi distribusi Anda untuk langkah terbaik.

Unduh dan instal driver

Tidak semuanya disertakan dalam kernel, dan tidak semuanya lain tersedia sebagai modul kernel. Dalam beberapa kasus, Anda harus mengunduh driver khusus yang ditulis dan dibundel oleh vendor perangkat keras, dan di lain waktu, Anda memiliki driver tetapi bukan frontend untuk mengonfigurasi opsi driver.

Dua contoh umum adalah printer HP dan tablet ilustrasi Wacom. Jika Anda mendapatkan printer HP, Anda mungkin memiliki driver generik yang dapat berkomunikasi dengan printer Anda. Anda bahkan mungkin dapat mencetak. Tetapi driver generik mungkin tidak dapat memberikan opsi khusus khusus untuk model Anda, seperti pencetakan dua sisi, susunan, pilihan baki kertas, dan sebagainya. HPLIP (sistem Pencitraan dan Pencetakan HP Linux) menyediakan opsi untuk mengelola pekerjaan, menyesuaikan opsi pencetakan, memilih baki kertas jika ada, dan seterusnya.

HPLIP biasanya dibundel dalam manajer paket; cukup cari "hplip."

Demikian pula, driver untuk tablet Wacom, tablet ilustrasi terkemuka untuk seniman digital, biasanya disertakan dalam kernel Anda, tetapi opsi untuk menyempurnakan pengaturan, seperti sensitivitas tekanan dan fungsionalitas tombol, hanya dapat diakses melalui panel kontrol grafis yang disertakan secara default dengan GNOME tetapi dapat diinstal sebagai paket tambahan kde-config-tablet di KDE.

Ada kemungkinan beberapa kasus tepi yang tidak memiliki driver di kernel tetapi menawarkan versi kmod dari modul driver sebagai file RPM atau DEB yang dapat Anda unduh dan instal melalui manajer paket Anda.

Menambal dan mengompilasi kernel Anda sendiri

Bahkan dalam utopia futuristik yaitu abad ke-21, ada vendor yang tidak cukup memahami open source untuk menyediakan driver yang dapat diinstal. Terkadang, perusahaan semacam itu menyediakan kode sumber untuk driver tetapi mengharapkan Anda untuk mengunduh kode, menambal kernel, mengompilasi, dan menginstal secara manual.

Model distribusi semacam ini memiliki kelemahan yang sama seperti menginstal driver paket di luar sistem kmod:pembaruan kernel Anda merusak driver karena harus diintegrasikan kembali ke kernel Anda secara manual setiap kali kernel ditukar dengan yang baru.

Ini menjadi langka, untungnya, karena tim kernel Linux telah melakukan pekerjaan yang sangat baik dengan memohon dengan keras agar perusahaan berkomunikasi dengan mereka, dan karena perusahaan akhirnya menerima bahwa open source tidak akan hilang dalam waktu dekat. Tetapi masih ada perangkat baru atau hiper-spesialisasi di luar sana yang hanya menyediakan patch kernel.

Secara resmi, ada preferensi khusus distribusi tentang bagaimana Anda harus mengkompilasi kernel agar manajer paket Anda tetap terlibat dalam memutakhirkan bagian penting dari sistem Anda. Ada terlalu banyak manajer paket untuk dibahas masing-masing; sebagai contoh, inilah yang terjadi di balik layar saat Anda menggunakan alat seperti rpmdev di Fedora atau build-essential dan skrip dev di Debian.

Pertama, seperti biasa, cari tahu versi kernel yang Anda jalankan:

$ uname -r

Dalam kebanyakan kasus, aman untuk memutakhirkan kernel Anda jika Anda belum melakukannya. Lagi pula, ada kemungkinan masalah Anda akan terpecahkan dalam rilis terbaru. Jika Anda mencobanya dan tidak berhasil, maka Anda harus mengunduh kode sumber dari kernel yang Anda jalankan. Sebagian besar distribusi menyediakan perintah khusus untuk itu, tetapi untuk melakukannya secara manual, Anda dapat menemukan kode sumbernya di kernel.org.

Anda juga harus mengunduh patch apa pun yang Anda butuhkan untuk kernel Anda. Terkadang, patch ini khusus untuk rilis kernel, jadi pilihlah dengan hati-hati.

Itu tradisional, atau setidaknya itu kembali ketika orang secara teratur mengkompilasi kernel mereka sendiri, untuk menempatkan kode sumber dan patch di /usr/src/linux .

Buka arsip sumber kernel dan file tambalan sesuai kebutuhan:

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d ../patch*bz2

File tambalan mungkin memiliki instruksi tentang cara melakukan tambalan, tetapi seringkali mereka dirancang untuk dieksekusi dari tingkat atas pohon Anda:

$ patch -p1 < patch*example.patch

Setelah kode kernel ditambal, Anda dapat menggunakan konfigurasi lama Anda untuk menyiapkan konfigurasi kernel yang ditambal:

$ make oldconfig

make oldconfig perintah memiliki dua tujuan:mewarisi konfigurasi kernel Anda saat ini, dan memungkinkan Anda untuk mengonfigurasi opsi baru yang diperkenalkan oleh tambalan.

Anda mungkin perlu menjalankan make menuconfig perintah, yang meluncurkan daftar opsi yang mungkin berdasarkan menu berbasis ncurses untuk kernel baru Anda. Menu bisa sangat banyak, tetapi karena ini dimulai dengan konfigurasi lama Anda sebagai fondasi, Anda dapat melihat melalui menu dan menonaktifkan modul untuk perangkat keras yang Anda tahu tidak Anda miliki dan tidak perlu Anda antisipasi. Sebagai alternatif, jika Anda tahu bahwa Anda memiliki beberapa perangkat keras dan melihatnya tidak disertakan dalam konfigurasi Anda saat ini, Anda dapat memilih untuk membangunnya, baik sebagai modul atau langsung ke dalam kernel. Secara teori, ini tidak perlu karena mungkin, kernel Anda saat ini memperlakukan Anda dengan baik tetapi untuk patch yang hilang, dan mungkin patch yang Anda terapkan telah mengaktifkan semua opsi yang diperlukan yang diperlukan oleh perangkat apa pun yang meminta Anda untuk menambal kernel Anda sejak awal. .

Selanjutnya, kompilasi kernel dan modulnya:

$ make bzImage
$ make modules

Ini meninggalkan Anda dengan file bernama vmlinuz , yang merupakan versi terkompresi dari kernel yang dapat di-boot. Simpan versi lama Anda dan tempatkan yang baru di /boot . Anda direktori:

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

Sejauh ini, Anda telah menambal dan membangun kernel dan modulnya, Anda telah menginstal kernel, tetapi Anda belum menginstal modul apa pun. Itulah langkah pembuatan terakhir:

$ sudo make modules_install

Kernel baru sudah terpasang, dan modul-modulnya sudah terpasang.

Langkah terakhir adalah memperbarui bootloader Anda sehingga bagian komputer Anda yang dimuat sebelum kernel tahu di mana menemukan Linux. Bootloader GRUB membuat proses ini relatif sederhana:

$ sudo grub2-mkconfig

Kompilasi dunia nyata

Tentu saja, tidak ada yang menjalankan perintah manual itu sekarang. Sebagai gantinya, lihat distribusi Anda untuk instruksi tentang memodifikasi kernel menggunakan perangkat pengembang yang digunakan oleh pengelola distribusi Anda. Perangkat ini mungkin akan membuat paket baru yang dapat diinstal dengan semua tambalan yang disertakan, memberi tahu manajer paket tentang pemutakhiran, dan memperbarui bootloader Anda untuk Anda.

Kernel

Sistem operasi dan kernel adalah hal yang misterius, tetapi tidak perlu banyak untuk memahami komponen apa yang mereka bangun. Lain kali Anda mendapatkan teknologi yang tampaknya tidak berfungsi di Linux, tarik napas dalam-dalam, selidiki ketersediaan driver, dan ikuti jalur yang paling tidak tahan. Linux lebih mudah dari sebelumnya—dan itu termasuk kernel.


Linux
  1. Bagaimana Linux datang ke mainframe

  2. Siklus hidup pengujian kernel Linux

  3. Linux – Bagaimana Cara Menentukan Modul Yang Menodai Kernel?

  1. Bagaimana Anda Secara Terprogram Mengatur Jam Perangkat Keras di Linux?

  2. Cara membersihkan cache yang digunakan oleh kernel Linux

  3. Bagaimana dukungan perangkat keras baru ditambahkan ke kernel linux?

  1. Bagaimana kernel Linux menentukan urutan panggilan __init?

  2. Bagaimana saya bisa memesan satu blok memori dari kernel Linux?

  3. Bagaimana saya bisa menemukan model perangkat keras di Linux?