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.
-
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 MBtar.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 🙂 -
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 dangunzip -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).
-
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 menggantiY
denganN
, dll; biasanya ada satu set saling ketergantungan dan kemungkinan percabangan. Sebagai gantinya, Anda ingin menggunakan salah satu target konfigurasi dari kernel makefile (artinya, masukkanmake _____
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
sepertimake 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 membutuhkanqmake
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 sukamenuconfig
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...
-
-
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 dalaminitramfs
.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 antaraM
(=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 diinitramfs
(lihat “Isi initramfs”). -
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 manaN
adalah jumlah inti yang ingin Anda dedikasikan + 1. Tidak adatest
ataucheck
. Setelah selesai, Anda dapatmake 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 bernamabzImage
, di mana[ARCH]
adalahx86
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 olehmake modules_install
, yang akan menyertakan string “Versi lokal”, mis.,System.map-3.13.3-mykernel
. -
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 danchmod 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 denganset 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 padalinux
baris, yang menunjukkan sistem file root Anda (yang memiliki/sbin/init
dan/lib/modules
). Versi UUIDnya adalahroot=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, jalankangrub2-mkconfig -o /boot/grub2/grub.cfg
(tetapi buat cadangangrub.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 denganmenuentry
adalah ide yang bagus). Anda dapat menghapusnya nanti jika semuanya berjalan lancar.Anda juga dapat memasukkan
menuentry
kegrub.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 untukmake clean
(ataumake 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. -
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).
-
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.