GNU/Linux >> Belajar Linux >  >> Linux

Linux – Mengonfigurasi, Mengkompilasi, dan Menginstal Kernel Linux Kustom?

Saya ingin mencoba menggunakan kernel selain yang disediakan oleh distro saya — baik dari tempat lain, atau yang disesuaikan oleh saya. Apakah ini sulit atau berbahaya?

Di mana saya mulai?

Jawaban yang Diterima:

Membangun kernel khusus dapat memakan waktu — sebagian besar dalam konfigurasi, karena komputer modern dapat melakukan pembangunan dalam hitungan menit — tetapi tidak terlalu berbahaya jika Anda menyimpan kernel Anda saat ini yang berfungsi, dan pastikan untuk membiarkannya sebagai opsi melalui bootloader Anda (lihat langkah #6 di bawah). Dengan cara ini, jika yang baru tidak berfungsi, Anda dapat mem-boot ulang yang lama.

Dalam instruksi berikut, jalur di dalam pohon sumber mengambil bentuk [src]/whatever , di mana [src] adalah direktori tempat Anda menginstal sumber, mis. /usr/src/linux-3.13.3 . Anda mungkin ingin melakukan hal ini su root karena pohon sumber harus tetap aman dalam hal izin menulis (harus dimiliki oleh root).

Meskipun beberapa langkah bersifat opsional, Anda tetap harus membacanya karena berisi informasi yang diperlukan untuk memahami proses selanjutnya.

  1. Unduh dan buka paket tarbal sumber.

    Ini tersedia dari kernel.org. Yang terbaru tercantum di halaman depan, tetapi jika Anda melihat ke dalam /pub/ direktori, Anda akan menemukan arsip kembali ke versi 1.0. Kecuali Anda memiliki alasan khusus untuk melakukan sebaliknya, Anda sebaiknya memilih "Stabil Terbaru". Pada saat penulisan ini, ini adalah 74 MB tar.xz berkas.

    Setelah tarball diunduh, Anda perlu membongkarnya di suatu tempat. Tempat normalnya ada di /usr/src . Tempatkan file di sana dan:

    tar -xJf linux-X.X.X.tar.xz
    

    Perhatikan bahwa distro individu biasanya menyarankan Anda menggunakan salah satu paket sumbernya daripada pohon vanilla. Ini berisi patch khusus distro, yang mungkin atau mungkin tidak penting bagi Anda. Ini juga akan cocok dengan header include kernel yang digunakan untuk mengkompilasi beberapa alat userspace, meskipun kemungkinan besar mereka identik.

    Dalam 15+ tahun membangun kernel khusus (kebanyakan di Fedora/Debian/Ubuntu), saya tidak pernah memiliki masalah menggunakan sumber vanilla. Melakukan hal itu tidak membuat banyak perbedaan, namun, di luar kenyataan bahwa jika Anda menginginkan kernel terbaru, distro Anda mungkin belum mengemasnya. Jadi rute paling aman adalah tetap menggunakan paket distro, yang harus diinstal ke /usr/src . Saya lebih suka kandang terbaru sehingga saya bisa bertindak sebagai kelinci percobaan sebelum diluncurkan ke distro 🙂

  2. Mulai dengan konfigurasi dasar [opsional].

    Anda tidak perlu melakukan ini — Anda bisa langsung masuk dan membuat konfigurasi dari awal. Namun, jika Anda belum pernah melakukannya, berharap banyak dari percobaan dan kesalahan. Ini juga berarti harus membaca sebagian besar opsi (ada ratusan). Taruhan yang lebih baik adalah menggunakan konfigurasi yang ada, jika tersedia. Jika Anda menggunakan paket sumber distro, mungkin sudah berisi [src]/.config file, sehingga Anda dapat menggunakannya. Jika tidak, periksa /proc/config.gz . Ini adalah fitur opsional yang ditambahkan di kernel 2.6. Jika ada, salin ke tingkat atas dari pohon sumber dan gunzip -c config.gz > .config .

Jika tidak ada, mungkin karena opsi ini dikonfigurasi sebagai modul. Coba sudo modprobe configs , lalu periksa /proc direktori untuk config.gz lagi.

Konfigurasi distro tidak terlalu ideal karena mencakup hampir semua kemungkinan driver perangkat keras. Ini tidak terlalu berpengaruh pada fungsionalitas kernel, karena mereka adalah modul dan kebanyakan dari mereka tidak akan pernah digunakan, tetapi ini sangat meningkatkan waktu yang dibutuhkan untuk membangun. Ini juga canggung karena memerlukan initramfs untuk memuat modul inti tertentu (lihat langkah #4 di bawah). Namun, ini mungkin merupakan titik awal yang lebih baik daripada default.

Perhatikan bahwa opsi konfigurasi bergeser dan berubah dari satu versi kernel ke versi berikutnya, dan ketika Anda menjalankan salah satu dari make config program di bawah .config . Anda pertama-tama akan diuraikan dan diperbarui agar sesuai dengan versi baru. Jika konfigurasi berasal dari versi yang jauh lebih lama, ini dapat menyebabkan hasil yang aneh, jadi perhatikan saat Anda melakukan konfigurasi. AFAIK tidak akan berfungsi sama sekali sebaliknya (menggunakan konfigurasi dari versi yang lebih baru).

  1. Buat .config urasi.

    [src]/.config adalah file teks yang digunakan untuk mengkonfigurasi kernel. Jangan edit file ini secara langsung . Mengubah opsi seringkali bukan hal yang sederhana untuk mengganti Y dengan N , dll; biasanya ada satu set saling ketergantungan dan kemungkinan percabangan. Sebagai gantinya, Anda ingin menggunakan salah satu target konfigurasi dari kernel makefile (artinya, masukkan make _____ pada baris perintah dari direktori sumber tingkat atas):

    • make config adalah yang paling mendasar tetapi mungkin tidak sesuai dengan selera kebanyakan orang. Ini adalah urutan pertanyaan — banyak pertanyaan — dan jika Anda berubah pikiran, Anda harus mulai lagi.

    • make oldconfig seperti make config kecuali, jika Anda sudah memiliki .config dari versi sebelumnya, akan melewatkan pertanyaan kecuali yang berkaitan dengan opsi baru. Masih ada banyak dari mereka dan kebanyakan dari mereka tidak akan relevan bagi Anda, jadi sekali lagi, saya tidak merekomendasikannya.

    • make menuconfig adalah metode pilihan saya (dan saya pikir sebagian besar orang lain). Itu membangun dan menjalankan antarmuka TUI (menu berwarna yang akan berfungsi di terminal). Ini mengharuskan Anda memiliki -dev paket untuk ncurses diinstal. Cukup jelas, kecuali untuk pencarian yang dapat diakses melalui /; "bantuan" F1 memberikan penjelasan untuk opsi saat ini. Ada versi alternatif, make nconfig , dengan beberapa fitur tambahan, di mana F2 “syminfo” setara dengan F1 menuconfig.

    • make xconfig adalah antarmuka GUI lengkap. Ini membutuhkan qmake dan -dev paket untuk Qt diinstal, sekali lagi, ini adalah program yang dikompilasi dan dibangun. Jika Anda tidak menggunakan ini sebelumnya, itu mungkin unduhan yang substansial. Alasan saya lebih suka menuconfig ke versi GUI adalah bahwa hierarki opsi disajikan menggunakan layar berturut-turut di yang pertama tetapi terbuka seperti akordeon di yang terakhir.

    Salah satu hal pertama yang harus (tetapi tidak harus) Anda lakukan adalah menambahkan string “Versi lokal” (di bawah Pengaturan Umum ). Alasan untuk ini disebutkan di #5 di bawah.

    "Labirin" adalah cara yang baik untuk menggambarkan hierarki opsi, dan masuk ke detailnya jauh di luar cakupan T&J seperti ini. Jika Anda ingin duduk dan menjalani semuanya, sisihkan jam . Greg Kroah-Hartman (pengembang lama untuk kernel linux) memiliki buku online gratis tentang kernel (lihat Referensi di bawah) yang berisi bab tentang konfigurasi, meskipun itu ditulis pada tahun 2006. Saran saya adalah memulai dengan dasar yang masuk akal dari kernel distro Anda saat ini (sesuai # 2) dan kemudian buka dan hapus centang semua hal yang Anda tahu tidak Anda butuhkan. Anda juga mungkin ingin mengubah beberapa opsi "modul" menjadi "bawaan", yang membawa kita ke poin berikutnya...

  2. Tentang initramfs [opsional]

    Sebuah "initramfs" adalah sistem file terkompresi yang dibangun ke dalam kernel dan/atau dimuat pada saat boot. Tujuan utamanya adalah untuk memasukkan modul-modul yang dibutuhkan kernel sebelum dapat mengaksesnya di /lib/modules pada sistem file root — mis., driver untuk perangkat yang berisi sistem file tersebut. Distro selalu menggunakan ini sebagian karena drivernya tidak kompatibel satu sama lain, dan karenanya tidak bisa semuanya dibangun ke dalam kernel. Sebagai gantinya, yang sesuai dengan sistem saat ini dipilih dari dalam initramfs .

    Ini bekerja dengan baik dan tidak menunjukkan kerugian apa pun, tetapi ini mungkin merupakan komplikasi yang tidak perlu ketika membangun kernel Anda sendiri. Masalahnya adalah, jika Anda tidak menggunakan initramfs, Anda perlu memastikan bahwa driver untuk sistem file root Anda (dan perangkat yang mengaktifkannya) sudah terpasang di dalam kernel. Di menuconfig , ini adalah perbedaan antara M (=modul) opsi dan * (=built-in) pilihan. Jika Anda tidak melakukannya dengan benar, sistem akan gagal di awal proses booting. Jadi, misalnya, jika Anda memiliki harddisk SATA dan sistem file root ext4, Anda memerlukan driver untuk itu. [Jika ada yang bisa memikirkan hal lain yang harus dimiliki, tinggalkan komentar dan saya akan memasukkannya di sini].

    Jika Anda ingin menggunakan initramfs , Anda harus memilih opsi yang sesuai di Pengaturan Umum . Ada panduan kerangka untuk membuat yang dibangun ke dalam kernel di [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt , tetapi perhatikan bahwa distro tidak melakukan ini; mereka menggunakan file cpio gzip eksternal. Namun, dokumen itu memang berisi diskusi tentang apa yang harus dilakukan di initramfs (lihat “Isi initramfs”).

  3. Buat dan instal kernel.

    Langkah selanjutnya mudah. Untuk membuat kernel, jalankan make di [src] direktori. Jika Anda menggunakan sistem multi-inti, Anda dapat menambahkan -j N untuk mempercepat, di mana N adalah jumlah inti yang ingin Anda dedikasikan + 1. Tidak ada test atau check . Setelah selesai, Anda dapat make modules . Pada kotak cepat, semua ini akan memakan waktu <10 menit.

    Jika semuanya berjalan dengan baik, make INSTALL_MOD_STRIP=1 modules_install . Ini akan membuat direktori di /lib/modules mencocokkan nomor versi kernel ditambah string "Versi lokal" yang disebutkan di langkah 3, jika ada. Jika Anda tidak menggunakan string “Versi lokal”, berhati-hatilah jika Anda sudah memiliki kernel dengan versi yang sama yang Anda andalkan , karena modul ini akan menggantikannya.INSTALL_MOD_STRIP=1 adalah opsional, untuk signifikansi lihat di sini.

    Anda kemudian dapat make install untuk menginstal kernel ke lokasi default. Namun, rekomendasi saya adalah melakukannya sendiri untuk memastikan tidak ada file yang ada yang ditimpa. Lihat di [src]/arch/[ARCH]/boot untuk file bernama bzImage , di mana [ARCH] adalah x86 jika Anda menggunakan mesin x86 atau x86-64 (dan sesuatu yang lain jika Anda menggunakan sesuatu yang lain). Salin ke /boot dan ganti namanya menjadi sesuatu yang lebih spesifik dan informatif (tidak peduli apa). Lakukan hal yang sama dengan [src]/System.map , tetapi ganti namanya sesuai dengan skema berikut:

    System.map-[VERSION]
    

    Di sini, [VERSION] adalah tepat sama dengan nama direktori di /lib/modules dibuat oleh make modules_install , yang akan menyertakan string “Versi lokal”, mis., System.map-3.13.3-mykernel .

  4. Konfigurasikan bootloader GRUB 2.

    Jika Anda tidak menggunakan grub (mayoritas pengguna desktop linux), ini jelas tidak berlaku untuk Anda. Anda harus memiliki /etc/grub.d/40_custom file dengan tidak banyak di dalamnya. Jika tidak, buat milik root dan chmod 755 (harus dapat dieksekusi). Untuk itu tambahkan:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Jika Anda menggunakan initramfs, Anda juga harus memiliki baris terakhir initrd /path/to/initramfs . Hati-hati dengan set root= garis. Contoh menganggap grub telah diinstal ke partisi pertama dari hard drive pertama (hd0,1). Jika Anda memiliki beberapa drive, Anda mungkin ingin menggunakan UUID partisi sebagai gantinya dan mengganti baris itu dengan:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    Kecuali grub tidak ada di sistem file root Anda, ini juga harus sesuai dengan root= direktif pada linux baris, yang menunjukkan sistem file root Anda (yang memiliki /sbin/init dan /lib/modules ). Versi UUIDnya adalah root=UUID=[the UUID] .

    Anda dapat melihat /boot/grub2/grub.cfg yang ada untuk petunjuk tentang nama perangkat. Berikut panduan singkat untuk grub 2. Setelah Anda puas, jalankan grub2-mkconfig -o /boot/grub2/grub.cfg (tetapi buat cadangan grub.cfg Anda saat ini pertama). Anda mungkin ingin mengedit file itu dan memindahkan entri Anda ke atas. Itu harus tetap berisi daftar kernel lama Anda (yang sedang berjalan), dan distro Anda mungkin memiliki mekanisme yang menggandakan entri untuk kernel baru secara otomatis (karena ditemukan di /boot; Fedora melakukan ini, karenanya, menggunakan judul yang berbeda dengan menuentry adalah ide yang bagus). Anda dapat menghapusnya nanti jika semuanya berjalan lancar.

    Anda juga dapat memasukkan menuentry ke grub.cfg secara langsung, tetapi beberapa distro akan menimpa ini ketika kernel mereka diperbarui (sedangkan menggunakan /etc/grub.d/ akan tetap tergabung).

    Itu dia. Yang perlu Anda lakukan sekarang adalah reboot. Jika tidak berhasil, coba simpulkan masalahnya dari output layar, reboot dengan memilih kernel lama, dan kembali ke langkah 3 (kecuali gunakan .config Anda sudah memiliki dan men-tweak itu). Mungkin ide yang bagus untuk make clean (atau make mrproper ) di antara percobaan tetapi pastikan Anda menyalin [src]/.config ke beberapa cadangan terlebih dahulu, karena itu akan terhapus. Ini membantu memastikan bahwa objek yang digunakan dalam proses pembuatan tidak usang.

  5. Mengenai header kernel et. al.

    Satu hal yang mungkin harus Anda lakukan adalah symlink (ln -s -i ) /lib/modules/X.X.X/source dan /lib/modules/X.X.X/build ke /usr/src direktori tempat pohon sumber berada (pertahankan itu). Ini diperlukan agar beberapa alat ruang pengguna (dan penginstal driver pihak ketiga) dapat mengakses sumber untuk kernel yang sedang berjalan.

    Masalah yang terkait dengan ini adalah .h file dalam /usr/include , dll. Perubahan ini sangat bertahap, dan kompatibel ke belakang. Anda memiliki dua pilihan:

    • Tinggalkan yang digunakan oleh distro Anda. Jika Anda memperbarui seluruh sistem secara teratur, distro akan menginstal yang baru secara berkala, jadi ini adalah opsi "paling tidak merepotkan".

    • Gunakan make headers_install .

    Karena mereka kompatibel ke belakang (artinya "program yang dibangun dengan pustaka C menggunakan header kernel yang lebih lama harus dijalankan pada kernel yang lebih baru"), Anda tidak perlu terlalu rewel tentang hal ini. Satu-satunya masalah potensial adalah jika Anda membangun kernel khusus dan menyimpannya untuk sementara waktu, selama waktu itu distro memperbarui paket “kernel-headers” ke yang lebih baru versi daripada yang digunakan untuk membangun kernel Anda, dan ternyata ada beberapa ketidakcocokan (yang hanya akan berlaku untuk perangkat lunak yang kemudian dikompilasi dari sumber).

Terkait:Linux – perintah jari tidak berfungsi?

Referensi

Berikut beberapa sumbernya:

  • [src]/README termasuk panduan singkat untuk membangun dan memasang.

  • [src]/Documentation direktori berisi banyak informasi yang mungkin berguna dalam konfigurasi.

  • Sebagian besar buku Greg K-H Linux Kernel in a Nutshell (tersedia di sana secara gratis sebagai serangkaian PDF) berkisar pada pembuatan kernel.

  • Grub 2 memiliki manual online.

Terkait:Ke env atau tidak ke env?


Linux
  1. Menginstal dan mengatur Grafana di linux

  2. Linux – Perbedaan Antara Ruang Pengguna dan Ruang Kernel?

  3. Menginstal dan Mengonfigurasi OpenSSH di Ubuntu dan Distribusi Berbasis Debian

  1. Mengonfigurasi alamat IPv6 di Red Hat Enterprise Linux 7 dan 8

  2. CentOS / RHEL :Menginstal dan Mengonfigurasi ASMLib

  3. Bagaimana cara menyimpan atau mengekspor konfigurasi kernel Linux khusus?

  1. Menginstal dan Menggunakan Pengelola Paket Homebrew di Linux

  2. Linux – Mengkompilasi Dan Menginstal Kernel.org Kernel Ke Volume Kustom Pada Disk?

  3. Linux – Tata Letak Tabel Halaman Dump (Konfigurasi kernel)?