make localmodconfig && make localyesconfig
jumlah parameter berkurang menjadi 1285. Menjadi menarik bagi saya untuk mencoba membuang semua hal yang tidak perlu dari kernel dan melihat apa yang terjadi.
Saya akan mengkompilasi kernel vanilla 5.4.0 karena itu adalah versi yang digunakan pada instalasi gentoo saya. Untuk mempercepat proses, saya mengkompilasi kernel pada mesin kerja saya (i7, 8 core, 64Gb RAM, tmpfs). Saya menyalin kernel yang sudah selesai ke mesin di oracle cloud. Anda perlu memulai proses dengan perintah:
make tinyconfig
Ini akan memberi Anda file .config untuk inti minimum dari arsitektur saat ini. Dalam kasus saya, file ini berisi 284 baris tidak kosong yang bukan merupakan komentar.
Mari kita kompilasinya dan lihat ukuran kernelnya:
$ yes ""|make -j$(nproc)
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 441872 Jan 31 18:09 arch/x86/boot/bzImage
284
$
Kernel ini sama sekali tidak berguna. Tidak hanya tidak bisa boot, tetapi bahkan tidak memiliki kemampuan untuk melaporkan masalah. Mari perbaiki ini. Untuk mengaktifkan parameter, saya akan menggunakan perintah:
script/config -e config_parameter_name
Jadi, kernel kami akan menjadi 64-bit, kami mengaktifkan keluaran diagnostik kernel, mengaktifkan dukungan terminal, mengkonfigurasi port serial dan konsol di atasnya:
./scripts/config -e CONFIG_64BIT -e CONFIG_PRINTK -e CONFIG_TTY -e CONFIG_SERIAL_8250 -e CONFIG_SERIAL_8250_CONSOLE
Mesin di cloud oracle tidak akan dapat melakukan boot dengan kernel ini, tidak akan ada output ke konsol. Ternyata, Anda perlu menambahkan dukungan untuk EFI dan ACPI, yang merupakan ketergantungannya. Script ./scripts/config tidak mengimplementasikan logika untuk menambahkan dependensi terbalik, mis. jika Anda hanya menambahkan CONFIG_EFI, make akan menghapus parameter ini dari konfigurasi. Perlu juga dicatat bahwa mengaktifkan opsi sering kali menyertakan opsi di bawah ini. Jadi dalam kasus mengaktifkan CONFIG_ACPI, itu secara otomatis diaktifkan, misalnya, dukungan untuk tombol on / off.
./scripts/config -e CONFIG_ACPI -e CONFIG_EFI -e CONFIG_EFI_STUB
Menyatukan inti:
$ yes ""|make -j$(nproc)
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 1036960 Jan 31 18:13 arch/x86/boot/bzImage
409
$
Kernel ini masih tidak dapat menyelesaikan proses boot, tetapi setidaknya dapat melaporkannya:
Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
Kernel Offset: 0x22000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)
---[ end Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance. ]---
Mari tambahkan parameter yang dibutuhkan:
# virtual guest support and pci
./scripts/config -e CONFIG_PCI -e CONFIG_VIRTIO_PCI -e CONFIG_VIRTIO -e CONFIG_VIRTIO_MENU -e CONFIG_PARAVIRT -e CONFIG_HYPERVISOR_GUEST
# disk support
./scripts/config -e CONFIG_BLOCK -e CONFIG_SCSI -e CONFIG_BLK_DEV_SD -e CONFIG_SCSI_VIRTIO
# filesystems
./scripts/config -e CONFIG_EXT4_FS -e CONFIG_PROC_FS -e CONFIG_SYSFS -e CONFIG_DEVTMPFS -e CONFIG_DEVTMPFS_MOUNT
# executable formats
./scripts/config -e CONFIG_BINFMT_ELF -e CONFIG_BINFMT_SCRIPT
# network
./scripts/config -e CONFIG_NET -e CONFIG_VIRTIO_NET -e CONFIG_PACKET -e CONFIG_UNIX -e CONFIG_INET -e CONFIG_NET_CORE -e CONFIG_NETDEVICES -e CONFIG_VIRTIO_NET
Menyatukan inti:
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 1950368 Jan 31 18:18 arch/x86/boot/bzImage
616
$
Dan kami dimuat. Kali ini, kernel berhasil menemukan disk root, tetapi kami melihat kesalahan di konsol:
The futex facility returned an unexpected error code. ... * Call to flock failed: Function not implemented
Kami mencoba masuk:
(none) login: root
process 182 (login) attempted a POSIX timer syscall while CONFIG_POSIX_TIMERS is not set
Password:
setgid: Function not implemented
Ini juga tidak berfungsi, tetapi kami dengan jelas diminta parameter mana yang akan ditambahkan. Tambahkan itu dan parameter lain yang diperlukan:
./scripts/config -e CONFIG_POSIX_TIMERS -e CONFIG_FUTEX -e CONFIG_FILE_LOCKING -e CONFIG_MULTIUSER
Menyatukan inti:
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 1979040 Jan 31 18:25 arch/x86/boot/bzImage
623
$
Kali ini kami berhasil masuk:
instance-20210124-1735 login: root
Password:
Last login: Mon Feb 1 02:25:10 UTC 2021 from 73.239.106.74 on ssh
root@instance-20210124-1735:~#
Hore! Ssh bekerja juga. Namun demikian, ada lagi kesalahan di konsol:
* Some local filesystem failed to mount
...
hwclock: Cannot access the Hardware Clock via any known method.
hwclock: Use the --verbose option to see the details of our search for an access method.
* Failed to set the system clock
Dan di dmesg kami juga menemukan:
[ 2.910198] udevd[360]: inotify_init failed: Function not implemented
Kami menambahkan dukungan untuk jam waktu nyata, sistem file vfat dan inotify:
./scripts/config -e CONFIG_RTC_CLASS -e CONFIG_DNOTIFY -e CONFIG_INOTIFY_USER -e CONFIG_VFAT_FS
Menyatukan inti:
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 2015904 Jan 31 18:36 arch/x86/boot/bzImage
643
$
Hmmm, drive vfat masih tidak dapat dipasang:
* Some local filesystem failed to mount
Dan inilah jawabannya mengapa di dmesg bersama dengan satu kesalahan lagi:
[ 3.782884] udevd[527]: error creating signalfd [ 4.107698] FAT-fs (sda15): codepage cp437 not found
Tambahkan parameter:
./scripts/config -e CONFIG_SIGNALFD -e CONFIG_NLS_CODEPAGE_437 -e CONFIG_NLS_ISO8859_1
Menyatukan inti:
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 2015904 Jan 31 18:41 arch/x86/boot/bzImage
646
$
Kami memuat, tidak ada kesalahan di konsol, tetapi kesalahan baru muncul di dmesg:
[ 2.756136] udevd[360]: error creating epoll fd: Function not implemented
Kami memperbaiki:
./scripts/config -e CONFIG_EPOLL
Menyatukan inti:
$ ll arch/x86/boot/bzImage && grep -v ^# .config|grep -c .
-rw-rw-r-- 1 kvt kvt 2020000 Jan 31 19:13 arch/x86/boot/bzImage
647
$
Kami reboot dan kali ini kami tidak melihat kesalahan baru!
Pada mesin saya yang berfungsi (i7, 8 core, 64gb RAM, tmpfs), konfigurasi terakhir dibangun dalam 1m 16s. Dalam oracle cloud dengan dua inti dan pada disk biasa, proses yang sama membutuhkan waktu 19m 51 detik.
Kernel yang dihasilkan tidak sepenuhnya minimal. Jadi, misalnya, mengaktifkan dukungan jaringan menambahkan sekumpulan adaptor jaringan yang berbeda. Saya tidak terlibat dalam perfeksionisme dan benar-benar membersihkan semua yang tidak diperlukan. Selain itu, saya ingin memperingatkan Anda bahwa meskipun pemuatan dan pengujian cepat tidak mengungkapkan masalah dengan tidak adanya komponen kernel penting tambahan, kemungkinan besar ada. Jadi jika tiba-tiba Anda memutuskan untuk menggunakan kembali konfigurasi saya silakan uji kernel secara menyeluruh untuk kasus khusus Anda dan tambahkan parameter kernel yang diperlukan jika perlu.