Membangun Kernel Kustom

John Soros, Alessio, Brandon Nielsen Versi unspecified Last review: 2023-12-23
Dokumen ini memberikan petunjuk bagi pengguna tingkat lanjut yang ingin membangun ulang kernel dari sumber tertentu.

Saat membangun atau menjalankan kernel kustom, jangan mengharapkan dukungan dari tim kernel Fedora.

Beberapa alasan umum untuk membangun kernel kustom adalah:

  • Untuk menerapkan patch untuk pengujian yang mereka buat sendiri atau peroleh dari sumber lain

  • Untuk mengonfigurasi ulang kernel yang ada

  • Untuk mengetahui lebih lanjut tentang kernel dan pengembangan kernel

Dapatkan Dependensi

Cara termudah untuk menginstal semua dependensi build untuk kernel adalah dengan menggunakan berkas spesifikasi kernel Fedora:

sudo dnf install fedpkg
fedpkg clone -a kernel
cd kernel
sudo dnf builddep kernel.spec

Jika Anda ingin menggunakan make xconfig, Anda memerlukan beberapa paket tambahan:

sudo dnf install qt3-devel libXi-devel gcc-c++

Boot aman

Pastikan Anda menambahkan pengguna yang melakukan proses build ke /etc/pesign/users dan jalankan skrip otorisasi pengguna:

sudo /usr/libexec/pesign/pesign-authorize

Buat Kunci Pemilik Mesin (MOK) baru untuk diimpor ke UEFI:

openssl req -new -x509 -newkey rsa:2048 -keyout "key.pem" \
        -outform DER -out "cert.der" -nodes -days 36500 \
        -subj "/CN=<your name>/"

Impor sertifikat baru ke dalam basis data UEFI Anda:

Anda akan diminta untuk mengizinkan impor pada saat boot berikutnya.
mokutil --import "cert.der"

Buat berkas kunci PKCS #12:

openssl pkcs12 -export -out key.p12 -inkey key.pem -in cert.der

Anda dapat mengimpor sertifikat dan kunci ke dalam basis data NSS:

certutil -A -i cert.der -n "<MOK certificate nickname>" -d /etc/pki/pesign/ -t "Pu,Pu,Pu"
pk12util -i key.p12 -d /etc/pki/pesign

Setelah sertifikat dan kunci diimpor ke basis data NSS Anda, Anda dapat membangun kernel dengan kunci yang dipilih dengan menambahkan %define pe_signing_cert <MOK certificate nickname> ke berkas kernel.spec atau memanggil rpmbuild secara langsung dengan tanda`--define "pe_signing_cert <MOK certificate nickname>"`

Selama bug Bugzilla #1651020 masih terbuka, Anda mungkin perlu mengedit baris yang dimulai dengan %pesign dalam berkas spesifikasi kernel dan menggantinya dengan pesign -c %{pe_signing_cert} --certdir /etc/pki/pesign/ -s -i $KernelImage -o vmlinuz.signed.

Disarankan juga untuk menginstal ccache, yang dapat membantu mempercepat proses rebuild:

sudo dnf install ccache

Membangun Kernel dari repositori Fedora dist-git

Pertama, diperlukan checkout dari Fedora kernel dist-git:

git clone https://src.fedoraproject.org/rpms/kernel.git

Kernel, seperti paket Fedora lainnya, memiliki cabang untuk setiap rilis Fedora. rawhide sesuai dengan Rawhide, dan setiap versi Fedora memiliki cabang yang disebut f<version>.

  1. Misalnya, untuk membangun kernel Fedora 28, Anda perlu beralih ke cabang tersebut dengan perintah:

    git switch f28
  2. Untuk menghindari konflik dengan kernel yang sudah ada, Anda dapat menetapkan buildid kustom dengan ganti # define buildid .local menjadi %define buildid .<your_custom_id_here> di kernel.spec.

  3. Lakukan perubahan atau penyesuaian apa pun yang Anda butuhkan:

    1. Opsi konfigurasi kernel dapat diubah dengan memodifikasi berkas kernel-local.

    2. Patch yang sudah ada dapat ditambahkan ke linux-kernel-test.patch, dan akan secara otomatis terdeteksi selama proses kompilasi.

    3. Patch juga dapat disimpan dalam berkas terpisah dan ditambahkan ke kernel.spec dengan format Patch2: foo.patch, Patch3: bar.patch, dan seterusnya. Baris ApplyOptionalPatch foo.patch, ApplyOptionalPatch bar.patch harus ditambahkan untuk menerapkan patch selama proses pembangunan.

    4. Untuk melakukan modifikasi pada sumber kode kernel, ambil sumber kode kernel untuk cabang dist-git saat ini Anda dengan perintah fedpkg sources, lalu lakukan perubahan yang diinginkan pada sumber kode kernel dan buat patch, misalnya dengan perintah diff -rupN kernel_src_folder kernel_src_folder_patched > mypatch.patch. Patch tersebut kemudian dapat ditambahkan ke linux-kernel-test.patch atau berkas spesifikasi.

  4. Bangun RPM:

    fedpkg local
  5. Instal kernel baru:

    sudo dnf install --nogpgcheck ./x86_64/kernel-$version.rpm

Membangun kernel upstream vanilla

Terkadang seorang pengembang Fedora mungkin meminta Anda untuk mencoba membangun dan menginstal kernel upstream (mungkin dengan tambalan yang ditambahkan) untuk pengujian. Jika ada beberapa iterasi, mungkin lebih cepat bagi Anda untuk melakukannya daripada pengembang harus membuat beberapa paket RPM.

Saat ini sedang dilakukan upaya untuk mengemas biji vanila. Periksa terlebih dahulu apakah ini sesuai dengan kebutuhan Anda

Mendapatkan Sumber

Salin pohon kernel dari kernel.org. Jika Anda tidak tahu pohon mana yang Anda butuhkan, Anda sebaiknya menggunakan pohon kernel milik Linus:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

Anda juga mungkin ingin menggunakan pohon stabil (rilis 4.y.z), yang dapat Anda tambahkan dengan:

git remote add -f stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

Menerapkan tambalan

Untuk menerapkan berkas patch, Anda dapat menggunakan git-am:

git am -3 <patch file>

Konfigurasi kernel

Jika pengembang telah mengarahkan Anda ke berkas konfigurasi tertentu yang harus digunakan, simpan berkas tersebut di direktori Linux dengan nama berkas .config

Jika tidak, Anda perlu memilih berkas konfigurasi sebagai titik awal. Kernel Linux memiliki ribuan opsi konfigurasi, jadi Anda tidak ingin memulai dari nol kecuali Anda tahu apa yang Anda lakukan.

Mulai dari konfigurasi kernel yang telah diinstal

Jika Anda ingin menyesuaikan konfigurasi kernel yang sudah terpasang, Anda dapat memulai dengan konfigurasinya yang disimpan di /boot/. Misalnya, untuk memulai dengan konfigurasi kernel yang sedang berjalan:

cp /boot/config-`uname -r`* .config

Mulai dari dist-git

Jika Anda ingin menggunakan konfigurasi untuk kernel yang belum terpasang, Anda dapat mendapatkan konfigurasi tersebut dari repositori Fedora dist-git. Misalnya, untuk memulai dengan konfigurasi Rawhide terbaru:

cd <dist-git directory>
git checkout rawhide
./generate_all_configs.sh # Ensure the latest configuration files are generated
cp kernel-<arch>.config <linux kernel directory>.config

Versi debug dari berkas konfigurasi terdapat di kernel-<arch>-debug.config jika Anda ingin membangun kernel dengan opsi debugging yang diaktifkan.

Mengubah konfigurasi

Ada beberapa cara untuk mengubah konfigurasi. Anda dapat menjalankan make help dan melihat Configuration targets untuk daftar lengkapnya, tetapi make menuconfig adalah tempat yang baik untuk memulai. Anda juga dapat langsung mengedit berkas .config.

Salah satu opsi konfigurasi yang mungkin ingin Anda atur adalah CONFIG_MODULE_COMPRESS, yang mengompres modul (dengan gzip secara default) saat menginstalnya. Tanpa pengaturan ini, modul dapat menjadi sangat besar.

Membangun kernel

Setelah Anda mengonfigurasi kernel, Anda siap untuk membangunnya. Sebelum melakukannya, Anda perlu mengubah nilai EXTRAVERSION di berkas Makefile menjadi sesuatu yang dapat Anda kenali nanti. Misalnya, jika nilainya EXTRAVERSION = -rc5, ubah menjadi EXTRAVERSION = -rc5-dave:

$EDITOR Makefile

Sekarang Anda siap untuk membangun kernel:

make oldconfig
make bzImage
make modules

Menginstal kernel

Menginstal kernel sesederhana:

sudo make modules_install
sudo make install

Membangun kembali

Jika Anda telah diminta untuk mencoba beberapa hal yang berbeda, prosedur yang harus dilakukan setelah Anda telah membangun pohon sekali adalah sebagian besar sama. Disarankan untuk menjalankan make clean di antara proses build. Ini akan mempertahankan file .config, sehingga Anda dapat melewati langkah di atas dan langsung melanjutkan ke bagian make bzImage dari langkah-langkah di atas. Karena kita telah menginstal ccache pada langkah pertama, build selanjutnya mungkin akan jauh lebih cepat karena compiler akan mengakses file-file yang belum berubah sejak kali terakhir dibangun.

Membersihkan

Setelah Anda menguji kernel, dan Anda telah booting kembali ke salah satu kernel yang diinstal dari RPM, Anda dapat menghapus file-file yang diinstal oleh prosedur di atas.

Saat menjalankan perintah-perintah berikut, pastikan versi kernel yang digunakan benar!

Karena Anda mengubah EXTRAVERSION di Makefile untuk menambahkan ‘tag’, semua file yang diinstal akan memiliki tag tersebut sebagai bagian dari nama file. Jadi, Anda dapat menggunakan karakter wildcard untuk menghapus file-file tersebut dengan aman menggunakan perintah serupa dengan yang tercantum di bawah ini (ganti ‘dave’ dengan tag yang Anda pilih):

rm -f /boot/config-*dave* /boot/initramfs-*dave* /boot/vmlinuz-*dave* /boot/System.map-*dave*
rm -rf /lib/modules/*dave*

Akhirnya, Anda perlu menghapus kernel sebagai opsi di bootloader Anda. Jika sistem Anda menggunakan grub2, hal ini dapat dilakukan dengan menghapus entri spesifikasi bootloader dan membangun ulang konfigurasi grub:

rm -f /boot/loader/entries/*dave*
grub2-mkconfig -o /boot/grub2/grub.cfg