Mengkonfigurasi, mengkompilasi dan menginstal kernel Linux kustom

38

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

Di mana saya memulai?

goldilocks
sumber

Jawaban:

51

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

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

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

  1. Unduh dan buka paket tarball sumber.

    Ini tersedia dari kernel.org . Yang terbaru terdaftar di halaman depan, tetapi jika Anda melihat di 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 tar.xzfile 74 MB .

    Setelah tarball diunduh, Anda harus membukanya di suatu tempat. Tempat normal di /usr/src. Tempatkan file di sana dan:

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

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

    Dalam 15+ tahun membangun kernel khusus (kebanyakan di Fedora / Debian / Ubuntu), saya tidak pernah punya masalah menggunakan sumber vanilla 1 . Akan tetapi, melakukan hal itu tidak membuat banyak perbedaan, di luar fakta bahwa jika Anda menginginkan kernel terbaru absolut, distro Anda mungkin belum mengemasnya. Jadi rute teraman adalah masih menggunakan paket distro, yang harus diinstal /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 harus melakukan ini - Anda bisa langsung masuk dan membuat konfigurasi dari awal. Namun, jika Anda belum pernah melakukannya sebelumnya, berharap banyak trial and error. 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, itu mungkin sudah berisi [src]/.configfile, jadi Anda bisa menggunakannya. Kalau tidak, periksa a /proc/config.gz. Ini adalah fitur opsional yang ditambahkan di kernel 2.6. Jika ada, salin itu ke tingkat atas pohon sumber dan gunzip -c config.gz > .config.

Jika tidak ada, itu mungkin karena opsi ini dikonfigurasi sebagai modul. Coba sudo modprobe configs, lalu periksa kembali /procdirektori tersebut config.gz.

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

Perhatikan bahwa opsi konfigurasi bergeser dan berubah dari satu versi kernel ke versi berikutnya, dan ketika Anda menjalankan salah satu make configprogram di bawah ini, Anda .configakan diurai dan diperbarui untuk mencocokkan versi yang 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 bekerja sama sekali sebaliknya (menggunakan konfigurasi dari versi yang lebih baru).

  1. Buat .configurasi.

    [src]/.configadalah file teks yang digunakan untuk mengkonfigurasi kernel. Jangan edit file ini secara langsung . Mengubah opsi seringkali bukan masalah yang mudah untuk mengganti a Ydengan N, dll; biasanya ada satu set interdependensi dan kemungkinan percabangan. Sebagai gantinya, Anda ingin menggunakan salah satu dari target konfigurasi dari kernel makefile (artinya, masukkan make _____pada baris perintah dari direktori sumber tingkat atas):

    • make configadalah yang paling dasar tetapi mungkin tidak sesuai selera kebanyakan orang. Ini adalah serangkaian pertanyaan - banyak pertanyaan - dan jika Anda berubah pikiran, Anda harus memulai lagi.

    • make oldconfigseperti make configkecuali, jika Anda sudah memiliki .configdari 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 lagi, saya tidak merekomendasikannya.

    • make menuconfigadalah metode pilihan saya (dan saya pikir kebanyakan orang lain). Itu membangun dan mengeksekusi antarmuka TUI (menu berwarna yang akan bekerja pada terminal). Ini mengharuskan Anda -devuntuk menginstal paket untuk ncurses. Ini 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" adalah setara dengan F1 menuconfig.

    • make xconfigadalah antarmuka GUI penuh. Ini membutuhkan qmakedan -devpaket untuk Qt diinstal, karena lagi-lagi, ini adalah program yang dikompilasi dan dibangun. Jika Anda tidak menggunakan ini sebelumnya, itu mungkin unduhan substansial. Alasan saya lebih suka menuconfigke versi GUI adalah bahwa hierarki opsi disajikan menggunakan layar berturut-turut di yang sebelumnya tetapi seperti akordeon terbuka di yang terakhir.

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

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

  2. Tentang initramfs[opsional]

    "Initramfs" adalah sistem file terkompresi yang dibangun ke dalam kernel dan / atau dimuat saat boot. Tujuan utamanya adalah untuk memasukkan modul-modul yang dibutuhkan kernel sebelum dapat mengaksesnya di /lib/modulesroot filesystem - misalnya, driver untuk perangkat yang berisi filesystem itu. Distro selalu menggunakan ini secara parsial karena drivernya tidak kompatibel satu sama lain, sehingga tidak semua dapat dibangun ke dalam kernel. Sebaliknya, yang sesuai dengan sistem saat ini dipilih dari dalam initramfs.

    Ini berfungsi dengan baik dan tidak mewakili segala kerugian, tetapi mungkin merupakan komplikasi yang tidak perlu ketika membangun kernel Anda sendiri. 2 Tangkapannya adalah, jika Anda tidak menggunakan initramfs, Anda perlu memastikan driver untuk sistem file root Anda (dan perangkat itu aktif) dibangun ke dalam kernel. Dalam menuconfig, ini adalah perbedaan antara Mopsi (= modul) dan opsi *(= bawaan). Jika Anda tidak melakukan ini dengan benar, sistem akan gagal sejak awal dalam proses boot. Jadi, misalnya, jika Anda memiliki harddisk SATA dan sistem file root ext4, Anda memerlukan driver untuk yang sudah ada di dalamnya. [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 menciptakan satu dibangun ke dalam kernel di [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, tetapi catatan bahwa distro tidak melakukan hal ini; mereka menggunakan file cpio gzip eksternal. Namun, dokumen itu memang berisi diskusi tentang apa yang harus masuk dalam initramfs(lihat "Isi initramfs").

  3. Bangun dan instal kernel.

    Langkah selanjutnya mudah. Untuk membuat kernel, jalankan saja makedi [src]direktori. Jika Anda menggunakan sistem multi-inti, Anda dapat menambah -j Nuntuk mempercepat, di mana Njumlah inti yang ingin Anda persembahkan + 1. Tidak ada testatau check. Setelah selesai, Anda bisa 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 yang /lib/modulescocok dengan nomor versi kernel plus string "Versi lokal" yang disebutkan dalam langkah 3, jika ada. Jika Anda tidak menggunakan string "Versi lokal", berhati-hatilah jika Anda sudah memiliki kernel dengan versi yang sama dengan yang Anda andalkan , karena modul-modul ini akan menggantikannya. 3 INSTALL_MOD_STRIP=1 adalah opsional, untuk signifikansi lihat di sini .

    Anda kemudian make installdapat menginstal kernel ke lokasi default. Namun rekomendasi saya adalah melakukannya sendiri untuk memastikan tidak ada file yang ditimpa. Lihat di [src]/arch/[ARCH]/bootfile bernama bzImage4 , di mana [ARCH]adalah x86jika Anda berada di x86 atau mesin x86-64 (dan sesuatu yang lain jika Anda pada sesuatu yang lain). Salin ke /bootdan ubah nama menjadi sesuatu yang lebih spesifik dan informatif (tidak masalah apa). Lakukan hal yang sama dengan [src]/System.map, tetapi ubah nama sesuai dengan skema berikut:

    System.map-[VERSION]
    

    Di sini, [VERSION]adalah persis sama dengan nama direktori di /lib/modulesdiciptakan olehmake modules_install , yang akan mencakup "versi lokal" string, misalnya, 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_customfile dengan tidak banyak di dalamnya. Jika tidak, buat itu dimiliki oleh root dan chmod 755(itu 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. Waspadalah dengan set root=garis. Contoh menganggap grub diinstal ke partisi pertama hard drive pertama (hd0,1). Jika Anda memiliki banyak drive, Anda mungkin ingin menggunakan UUID partisi dan ganti baris itu dengan:

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

    Kecuali jika grub tidak ada pada sistem file root Anda, ini juga harus sesuai dengan root=arahan pada linuxbaris tersebut, yang menunjukkan sistem file root Anda (yang dengan /sbin/initdan /lib/modules). Versi UUID itu adalah root=UUID=[the UUID].

    Anda dapat melihat /boot/grub2/grub.cfgpetunjuk yang ada tentang nama perangkat. Berikut panduan singkat untuk grub di bawah 2. Setelah Anda bahagia, jalankan grub2-mkconfig -o /boot/grub2/grub.cfg(tetapi buat cadangan Anda saat ini grub.cfgterlebih dahulu). Anda kemudian mungkin ingin mengedit file itu dan memindahkan entri Anda ke atas. Seharusnya masih berisi daftar untuk 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 berbeda dengan menuentryadalah ide bagus). Anda dapat menghapusnya nanti jika semuanya berjalan dengan baik.

    Anda juga bisa langsung memasukkan ke menuentrydalam grub.cfg, tetapi beberapa distro akan menimpa ini ketika kernel mereka diperbarui (sedangkan menggunakan /etc/grub.d/akan tetap dimasukkan).

    Itu dia. Yang perlu Anda lakukan sekarang adalah reboot. Jika tidak berhasil, coba dan simpulkan masalah dari output layar, reboot pilih kernel lama, dan kembali ke langkah 3 (kecuali gunakan yang .configsudah Anda miliki dan atur itu). Mungkin merupakan ide yang bagus untuk make clean(atau make mrproper) di antara upaya tetapi pastikan Anda menyalin [src]/.configke beberapa cadangan terlebih dahulu, karena itu akan terhapus. Ini membantu memastikan bahwa objek yang digunakan dalam proses pembuatan tidak basi.

  5. Mengenai header kernel et. Al.

    Satu hal yang sebaiknya Anda lakukan adalah symlink ( ln -s -i) /lib/modules/X.X.X/sourcedan /lib/modules/X.X.X/buildke /usr/srcdirektori tempat pohon sumbernya (simpan). Ini diperlukan agar beberapa alat userspace (dan penginstal driver pihak ketiga) dapat mengakses sumber untuk kernel yang sedang berjalan.

    Masalah yang terkait dengan ini adalah .hfile di /usr/include, dll. Perubahan ini sangat lambat, dan kompatibel dengan mundur . Anda memiliki dua pilihan:

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

    • Gunakan make headers_install.

    Karena mereka kompatibel ke belakang (artinya "sebuah program yang dibangun melawan 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 yang mungkin terjadi adalah jika Anda membangun kernel khusus dan menyimpannya untuk sementara waktu, selama itu distro memperbarui paket "kernel-header" ke versi yang lebih baru daripada yang digunakan untuk membangun kernel Anda, dan ternyata ada beberapa ketidakcocokan (yang hanya akan berlaku untuk perangkat lunak yang selanjutnya dikompilasi dari sumber).

Referensi

Berikut ini beberapa sumber:

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

  • The [src]/Documentationdirektori berisi banyak informasi yang dapat membantu dalam konfigurasi.

  • Sebagian besar buku Greg KH, Linux Kernel in a Nutshell (tersedia di sana secara gratis sebagai rangkaian PDF) berkisar seputar pembuatan kernel.

  • Grub 2 memiliki manual online .


1. "Vanilla" mengacu pada sumber resmi asli yang tidak tercemar seperti yang ditemukan di kernel.org. Sebagian besar distro mengambil sumber vanilla ini dan menambahkan beberapa penyesuaian kecil.

2. Perhatikan bahwa ada keadaan yang memerlukan initramfs karena beberapa ruang pengguna diperlukan untuk me-mount sistem file root - misalnya, jika dienkripsi, atau menyebar di array RAID yang kompleks.

3. Namun, itu tidak akan menghapus modul yang sudah ada di sana jika Anda tidak membangunnya, yang berarti Anda dapat menambahkan modul nanti dengan hanya memodifikasi konfigurasi Anda dan menjalankannya make modules_installlagi. Perhatikan bahwa membangun beberapa modul mungkin memerlukan perubahan pada kernel itu sendiri, dalam hal ini Anda juga harus mengganti kernel. Anda dapat mengetahui kapan Anda mencoba menggunakan modprobeuntuk memasukkan modul.

4. File ini dapat dinamai sesuatu yang berbeda jika Anda menggunakan opsi kompresi non-standar. Saya tidak yakin apa semua kemungkinannya.

goldilocks
sumber
3
Terpilih. Anda mungkin ingin menambahkan penyebutan localmodconfigdan alat-alat seperti streamline_config.plskrip; pendekatan yang bermanfaat untuk bekerja dari pengaturan yang ada ...
jasonwryan
1
Ini mungkin cukup detail untuk menjadi tipe pertanyaan kanonik per inisiatif @ terdon. Pertimbangkan untuk memberikan jawaban atas pertanyaannya tentang meta. Atau saya bisa, jika Anda mau. Sepertinya ini memang niatnya, karena kamu yang mengajukan pertanyaan. Termasuk metode distribusi khusus untuk membangun paket biner juga akan berguna, saya pikir.
Faheem Mitha
1
FYI: initramfsseharusnya digunakan hampir selalu. Misalnya, pengaturan rootfs pada LVM + RAID seringkali memerlukan satu. Root yang dienkripsi pasti bisa. Bahkan pengaturan RAID yang cukup rumit dilakukan. Dalam-kernel auto perakitan bahkan array sepele sebenarnya usang ...
derobert
2
@derobert: Itu menimbulkan pertanyaan bahwa "hampir selalu" linux digunakan untuk menjalankan server perusahaan. Maksud saya initramfsadalah bahwa jika Anda tidak perlu menggunakannya, Anda tidak perlu melakukannya dan ini menyederhanakan prosesnya. Lagi pula, saya telah menambahkan catatan kaki tentang fs root terenkripsi, dll.
goldilocks
Harap sertakan detail tentang EFI dan fungsi efi-stub linux.
IW16