make localmodconfig && make localyesconfig
Die Anzahl der Parameter verringerte sich auf 1285. Es wurde für mich interessant zu versuchen, alle unnötigen Dinge aus dem Kernel zu entfernen und zu sehen, was passiert.
Ich werde den Vanillekern 5.4.0 kompilieren, da dies die Version ist, die für meine Gentoo-Installation verwendet wird. Um den Prozess zu beschleunigen, kompiliere ich den Kernel auf meinem Arbeitscomputer (i7, 8 Kerne, 64 GB RAM, tmpfs). Ich kopiere den fertigen Kernel auf die Maschine in der Oracle Cloud. Sie müssen den Prozess mit dem folgenden Befehl starten:
make tinyconfig
Dadurch erhalten Sie eine .config-Datei für den minimalen Kern der aktuellen Architektur. In meinem Fall enthält diese Datei 284 nicht leere Zeilen, die keine Kommentare sind.
Lassen Sie es uns kompilieren und die Kernelgröße betrachten:
$ 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
$
Dieser Kernel ist völlig nutzlos. Es kann nicht nur nicht booten, sondern auch nicht einmal Probleme melden. Lassen Sie uns das beheben. Um die Parameter zu aktivieren, verwende ich den folgenden Befehl:
script/config -e config_parameter_name
Unser Kernel wird also 64-Bit sein, wir aktivieren die Kernel-Diagnoseausgabe, aktivieren die Terminalunterstützung, konfigurieren die serielle Schnittstelle und die Konsole darauf:
./scripts/config -e CONFIG_64BIT -e CONFIG_PRINTK -e CONFIG_TTY -e CONFIG_SERIAL_8250 -e CONFIG_SERIAL_8250_CONSOLE
Ein Computer in der Oracle Cloud kann mit diesem Kernel nicht booten. Es erfolgt keine Ausgabe an die Konsole. Wie sich herausstellte, müssen Sie Unterstützung für EFI und ACPI hinzufügen, was die Abhängigkeit darstellt. Das Skript ./scripts/config implementiert nicht die Logik zum Hinzufügen von umgekehrten Abhängigkeiten, d.h. Wenn Sie nur CONFIG_EFI hinzufügen, entfernt make diesen Parameter aus der Konfiguration. Es ist auch erwähnenswert, dass das Aktivieren von Optionen häufig die folgenden Optionen umfasst. Wenn Sie also CONFIG_ACPI aktivieren, wird es automatisch aktiviert, z. B. die Unterstützung für die Ein / Aus-Schaltfläche.
./scripts/config -e CONFIG_ACPI -e CONFIG_EFI -e CONFIG_EFI_STUB
Den Kern zusammenfügen:
$ 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
$
Dieser Kernel kann den Startvorgang immer noch nicht abschließen, kann ihn jedoch zumindest melden:
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. ]---
Fügen wir die erforderlichen Parameter hinzu:
# 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
Den Kern zusammenfügen:
$ 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
$
Und wir sind geladen. Diesmal findet der Kernel die Root-Festplatte erfolgreich, aber es werden Fehler in der Konsole angezeigt:
The futex facility returned an unexpected error code. ... * Call to flock failed: Function not implemented
Wir versuchen uns einzuloggen:
(none) login: root
process 182 (login) attempted a POSIX timer syscall while CONFIG_POSIX_TIMERS is not set
Password:
setgid: Function not implemented
Es funktioniert auch nicht, aber wir werden eindeutig gefragt, welcher Parameter hinzugefügt werden soll. Fügen Sie es und andere notwendige Parameter hinzu:
./scripts/config -e CONFIG_POSIX_TIMERS -e CONFIG_FUTEX -e CONFIG_FILE_LOCKING -e CONFIG_MULTIUSER
Den Kern zusammenfügen:
$ 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
$
Diesmal schaffen wir es, uns anzumelden:
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:~#
Hurra! Ssh funktioniert auch. Trotzdem gibt es wieder Fehler in der Konsole:
* 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
Und in dmesg finden wir auch:
[ 2.910198] udevd[360]: inotify_init failed: Function not implemented
Wir bieten Unterstützung für Echtzeituhr, vfat-Dateisystem und inotify:
./scripts/config -e CONFIG_RTC_CLASS -e CONFIG_DNOTIFY -e CONFIG_INOTIFY_USER -e CONFIG_VFAT_FS
Den Kern zusammenfügen:
$ 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, das vfat-Laufwerk kann immer noch nicht gemountet werden:
* Some local filesystem failed to mount
Und hier ist die Antwort, warum in dmesg zusammen mit einem weiteren Fehler:
[ 3.782884] udevd[527]: error creating signalfd [ 4.107698] FAT-fs (sda15): codepage cp437 not found
Parameter hinzufügen:
./scripts/config -e CONFIG_SIGNALFD -e CONFIG_NLS_CODEPAGE_437 -e CONFIG_NLS_ISO8859_1
Den Kern zusammenfügen:
$ 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
$
Wir laden, es gibt keine Fehler in der Konsole, aber ein neuer Fehler ist in dmesg aufgetreten:
[ 2.756136] udevd[360]: error creating epoll fd: Function not implemented
Wir reparieren:
./scripts/config -e CONFIG_EPOLL
Den Kern zusammenfügen:
$ 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
$
Wir starten neu und sehen diesmal keine neuen Fehler!
Auf meinem Arbeitscomputer (i7, 8 Kerne, 64 GB RAM, tmpfs) ist die endgültige Konfiguration in 1 bis 16 Sekunden erstellt. In einer Orakelwolke mit zwei Kernen und auf einer normalen Festplatte dauert der gleiche Vorgang 19 Minuten und 51 Sekunden.
Der resultierende Kernel ist nicht absolut minimal. Wenn Sie beispielsweise die Netzwerkunterstützung aktivieren, werden eine Reihe verschiedener Netzwerkadapter hinzugefügt. Ich habe mich nicht auf Perfektionismus eingelassen und absolut alles ausgeräumt, was nicht benötigt wird. Darüber hinaus möchte ich Sie warnen, dass das Laden und schnelle Testen zwar keine Probleme mit dem Fehlen zusätzlicher wichtiger Kernelkomponenten ergab, diese jedoch höchstwahrscheinlich vorhanden sind. Wenn Sie sich also plötzlich entscheiden, meine Konfiguration wiederzuverwenden Bitte testen Sie den Kernel gründlich für Ihren speziellen Fall und fügen Sie gegebenenfalls die erforderlichen Kernelparameter hinzu.