Apa cara sederhana untuk mengkompilasi ulang kernel?

41

Saya tertarik mengkompilasi kernel baru di bawah Ubuntu 12,04 x86 64 bit.

Saya menemukan halaman wiki ini yang pada dasarnya adalah cermin untuk blog ini dan ada banyak langkah ( git , dll.) Yang tampak tidak berguna bagi saya.

Dengan rilis / distro sebelumnya, saya biasa membuat .configfile dan memodifikasi Makefilejika perlu, kemudian jalankan makedan selesai.

Apakah ada cara sederhana untuk melakukan ini di Ubuntu?

pengguna827992
sumber
1
Layak dicoba
Colin Ian King

Jawaban:

39

1. Gunakan apt-get sourceuntuk mengunduh versi Ubuntu dari kernel

apt-get source linux-image-$(uname -r)

memberikan folder yang berisi, misalnya:

linux-3.2.0 linux_3.2.0-26.41.dsc
 linux_3.2.0-26.41.diff.gz   linux_3.2.0.orig.tar.gz

Perbedaan bolded mencakup semua penyesuaian Ubuntu / Debian.

2. Untuk membangun kernel stock dengan milik Anda sendiri .config, gunakan make-kpkgmetode Debian "kuno"

Ini adalah cara kuno alternatif yang dijelaskan dalam wiki:

sudo apt-get install kernel-package

Jika Anda mengkompilasi kernel untuk pertama kalinya:

sudo apt-get build-dep linux-image-$(uname -r)

Kemudian cdke direktori sumber (di sini, linux-3.2.0), dan jalankan make oldconfiguntuk membuat .configfile dengan konfigurasi kernel Anda yang sedang berjalan, atau salin bagian ketiga .configke direktori ini.

Bergantung pada apakah Anda menginginkan konfigurasi teks atau grafis, instal:

(Teks)

sudo apt-get install libncurses5 libncurses5-dev

(Grafis)

sudo apt-get install qt3-dev-tools libqt3-mt-dev

Dan kemudian jalankan:

(Teks)

make menuconfig

(Grafis)

make xconfig

Setelah selesai, jalankan:

fakeroot make-kpkg -j N --initrd --append-to-version=my-very-own-kernel kernel-image kernel-headers

di mana Nberapa banyak pekerjaan yang harus dijalankan secara paralel (biasanya jumlah CPU yang Anda miliki), dan my-very-own-kernelmerupakan string khusus untuk mengidentifikasi bangunan ini.

Setelah selesai, gambar kernel dan file header akan siap sebagai deb di direktori induk; Anda dapat menginstalnya dengan sudo dpkg -i, yang juga akan mengurus penambahan entri GRUB, dll.

ish
sumber
mengapa mereka tidak memberi tahu Anda tentang perbedaan ini, bagi saya perbedaan hanyalah perbedaan, ia dapat berisi segalanya.
user827992
Saya tidak tahu, Anda harus bertanya kepada mereka (google untuk Tim Kernel Canonical). Saya baru saja memberi tahu Anda cara membuatnya;)
ish
1
ok, pertanyaan terakhir, bagaimana cara menerapkan diff terkompresi ini? : DI harus masuk ke linux-3.2.0direktori dan menjalankan patch -p1 <../patch.diff?
user827992
1
Tidak perlu menerapkan diff; apt-get source ...Sudah melakukannya untukmu!
ish
2
-1 Anda menyebutnya "kuno," Saya menyebutnya ketinggalan jaman. fakeroot debian/rules editconfigs, fakeroot debian/rules clean, fakeroot debian/rules binaryAdalah benar cara, bebas masalah.
Aleksandr Dubinsky
19

Inilah langkah-langkahnya. Prosedur ini berdasarkan pada nixCraft 's How to: Compile Linux kernel 2.6 - tetapi dimodernisasi secara signifikan.

Unduh dan ekstrak kode sumber kernel yang ingin Anda buat.

Anda bisa mendapatkan kode sumber kernel hulu di kernel.org . Versi 3.16.1 (kernel stabil terbaru saat penulisan ini) akan digunakan di sini. Jadi, Anda mungkin perlu memodifikasi perintah ini jika Anda menggunakan versi yang berbeda.

Kode sumber kernel saat ini disediakan di. tar . arsip xz , jadi klik tautan "tar.xz" oleh versi apa pun yang Anda inginkan:

tangkapan layar dari kernel.org, menunjukkan arsip sumber kernel yang tersedia untuk diunduh

Setelah masuk cdke direktori tempat Anda mengunduh arsip, Anda dapat mengekstraknya dengan tar:

tar xf linux-3.16.1.tar.xz

Instal alat bantu yang diperlukan dan lakukan konfigurasi kernel.

Untuk mendapatkan Ubuntu toolchain ( gcc, make, dan sebagainya) menginstal build-essentialInstal build-essential metapackage:

sudo apt-get update
sudo apt-get install build-essential

Dua cara yang mudah digunakan untuk mengkonfigurasi apa yang masuk ke kernel Anda disediakan oleh maketarget xconfigdan menuconfig.

xconfigmenjalankan utilitas konfigurasi grafis, sementara menuconfigberbasis teks (yaitu, antarmuka muncul sepenuhnya dalam terminal Anda). Masing-masing memerlukan beberapa perangkat lunak tambahan yang tidak disediakan oleh build-essentialInstal build-essential .

Untuk mengkonfigurasi secara grafis , instal libqt4-devInstal libqt4-dev dan pkg-configInstal pkg-config dan jalankanmake xconfig:

sudo apt-get install libqt4-dev pkg-config
make xconfig

Untuk mengkonfigurasi di terminal , installibncurses5-dev(terima kasih kepada Hannu untuk info ini) dan jalankanmake menuconfig:

sudo apt-get install libncurses5-dev
make menuconfig

Bangun kernel yang sudah dikonfigurasi.

Pertama jalankan ini untuk mengkompilasi kernel dan membuat vmlinuz:

make

vmlinuzadalah "kernel." Secara khusus, ini adalah image kernel yang akan dikompresi dan dimuat ke memori oleh GRUB atau apa pun bootloader lain yang Anda gunakan.

Kemudian buat modul kernel yang dapat dimuat :

make modules

Instal kernel Anda yang baru dibangun.

Dengan asumsi makeperintah - perintah tersebut selesai dengan sukses, saatnya untuk menginstal kernel baru. Pertama instal modul:

sudo make modules_install

Kemudian instal kernel itu sendiri:

sudo make install

Itu menempatkan vmlinuz-3.16.1(salinan vmlinuz), config-3.16.1(file teks menyimpan parameter konfigurasi kernel), dan System.map-3.16.1( tabel pencarian simbol kernel ) di /boot. Untuk detail lebih lanjut, lihat posting comp.os.linux.misc ini oleh Hadron dan man installkernel.

Pengaturan akhir, sehingga kernel dapat dimulai dan mem-boot sistem:

Bagian ini sebagian didasarkan pada informasi dalam Kernel / Kompilasi .

Dengan kernel yang sekarang diperlukan, dibutuhkan:

Hasilkan initramf Anda denganmkinitramfs:

cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1

Ketika Anda memperbarui konfigurasi boot loader GRUB2 - yang telah menjadi default di Ubuntu sejak 9.10 - secara otomatis akan mendeteksi kernel baru dan menambahkan opsi untuk boot dari sana.

sudo update-grub

Coba kernel Anda.

Sekarang Anda dapat reboot untuk menguji kernel baru Anda. Anda mungkin perlu menahan Shiftatau menekan Escselama boot untuk melihat menu boot GRUB di mana Anda dapat memilih di antara kernel yang berbeda yang diinstal.

Untuk menjadikan kernel Anda (atau yang lain) sebagai default, lihat Bagaimana cara mengubah urutan boot GRUB?

Pemula
sumber
Langkah 3, make menuconfigmembutuhkanapt get install libncurses5-dev
Hannu
@ Hanu terima kasih, saya benar-benar lupa menyebutkan itu. Pengguna sistem 64-bit mungkin memerlukan "ia32-libs" juga untuk mendukung program 32-bit untuk dijalankan.
Pemula
Bisa lebih baik untuk menemukan paket versi-independen juga ... Saya tidak yakin ada.
Hannu
@EliahKagan Terima kasih. Apakah boleh sekarang atau saya harus menghapusnya sepenuhnya? Saya tidak memiliki masalah dalam melakukan itu.
Pemula
1
-1 Ini tidak menghasilkan kernel Ubuntu . Bahkan tidak menghasilkan file deb. Ini adalah resep untuk masalah.
Aleksandr Dubinsky
3

Instruksi cepat untuk membangun kernel Ubuntu (tidak seperti vanilla) dapat ditemukan di sini: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel .

Saya tidak akan menyalin seluruh wiki, tetapi saya akan mencantumkan langkah-langkah minimal untuk mengkompilasi versi kernel Ubuntu yang saat ini telah Anda instal. (Untuk mendapatkan versi terbaru, klon repositori kernel git dari rilis Ubuntu yang akan datang.) Diuji pada Ubuntu 16.04.

# Get source code
apt-get source linux-image-$(uname -r)

# Install dependencies
sudo apt-get build-dep linux-image-$(uname -r)

# Compile
cd linux-4.4.0
fakeroot debian/rules clean
fakeroot debian/rules binary

# Install (obviously the versions will be different)
cd ..
sudo dpkg -i linux-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb linux-headers-4.4.0-38_4.4.0-38.57_all.deb linux-headers-4.4.0-38-generic_4.4.0-38.57_amd64.deb
Aleksandr Dubinsky
sumber