Nachdem ich in den letzte Blog-Einträgen beschrieben habe, wie man den Kernel 4.4-RC2 oder den Kernel 4.2.6 mit GrSecurity Erweiterung kompiliert, möchte ich nun eine Methode vorstellen, wie ein Kernel speziell auf ein System hin optimiert werden kann.
Der Standard Debian ist so konfiguriert, dass er für die breite Masse an Hardware eingesetzt werden kann und diese bstmöglich unterstützt. Dies hat jedoch notwendigerweise zur Folge, dass der Kernel wesentlich größer ist, als für viele Systeme notwendig ist. Der im letzten Artikel kompilierte Kernel 4.2.6 mit GrSecurity Erweiterung ist zum Beispiel 164 MB groß.
$ du -chs /lib/modules/$(uname -r) /boot/vmlinuz-$(uname -r) /boot/System.map-$(uname -r) /boot/config-$(uname -r) 158M /lib/modules/4.2.6-grsec 3.4M /boot/vmlinuz-4.2.6-grsec 2.3M /boot/System.map-4.2.6-grsec 168K /boot/config-4.2.6-grsec 164M total
Um den Kernel individuell anzupassen, kann man vor der Kompilierung über make menuconfig alle Optionen in der .config Datei abwählen, welche auf dem Zielsystem nicht benötigt werden. Dies setzt jedoch jede Menge Zeit, Geduld vorraus. Es gibt auch eine einfachere Möglichkeit. So stellt Linus Torvald ein Script bereit, welches auf dem Zielsystem ausgeführt eine .config mit genau den für dieses Zielsystem notwendigen Optionen erstellt. Nachfolgend beschreibe ich kurz das vorgehen, um einen so optimierten Kernel zu erstellen.
1. Zielsystem starten
Die Kernel Version auf dem System starten, welche als minmal Version kompiliert werden soll. Z.B die im letzten Eintrag kompilierten Kernel 4.2.6 mit GrSecurity Patch.
2. Kernel-Quellen herunterladen
Quellen des gebooteten Kernels herunterladen
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.2.6.tar.gz --no-check-certificate.
3. .config das laufenden Kernels kopieren
cp /boot/config-$(uname -r) .config
4. Alle Geräte anschließen
Das Skript prüft anhand der geladenen Module, welche Module im Kernel aktiviert werden müssen. Aus diesem Grund sollte man alle Peripherien vor dem ausführen anschließen.
5. Minimal .config erstellen
Durch das ausführen des Skriptes wird eine minimal .config ausgegeben, welche nur in eine Datei umzuleiten ist.
wget https://github.com/torvalds/linux/raw/master/scripts/kconfig/streamline_config.pl chmod +x streamline_config.pl ./streamline_config.pl > ../.config
6. .config-Datei überprüfen
Bei mir wurde das Modul (rt2800usb) für die per USB angeschlossene WLAN-Stick (RT5370 USB) nicht mit aktiviert. So etwas sollte daher manuell noch einmal geprüft werden. Da die Optionen teilweise schwer zu finden sind kann es helfen, sich am Namen des Treiberpaketes des Herstellers zu orientieren, mit dem die Netzwerkkomponente aktuell betrieben wird. Denn das Modul dafür findet sich häufig im entsprechenden Zweig wieder.
Device Drivers ---> [*] USB support ---> <*> USB Wireless Device Management support Device Drivers ---> [*] Network device support ---> [*] Wireless LAN ---> <M> Ralink driver support ---> < > Ralink rt2400 (PCI/PCMCIA) support < > Ralink rt2500 (PCI/PCMCIA) support < > Ralink rt2501/rt61 (PCI/PCMCIA) support < > Ralink rt27xx/rt28xx/rt30xx (PCI/PCIe/PCMCIA) support <M> Ralink rt2500 (USB) support <M> Ralink rt2501/rt73 (USB) support <M> Ralink rt27xx/rt28xx/rt30xx (USB) support [*] rt2800usb - Include support for rt33xx devices [*] rt2800usb - Include support for rt35xx devices (EXPERIMENTAL) [*] rt2800usb - Include support for rt3573 devices (EXPERIMENTAL) [*] rt2800usb - Include support for rt53xx devices (EXPERIMENTAL) [*] rt2800usb - Include support for rt55xx devices (EXPERIMENTAL) [*] rt2800usb - Include support for unknown (USB) devices [ ] Ralink debug output <M> Realtek rtlwifi family of devices ---> <M> Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter [*] Debugging output for rtlwifi driver family
Ich hatte mein Logitech Keyboard zum Zeitpunkt der .config Erstellung nicht angeschlossen, daher musste ich es nachträglich aktivieren.
Device Drivers ---> HID support ---> Special HID drivers ---> <M> Logitech devices <M> Logitech Unifying receivers full support -M- Logitech HID++ devices support
Für die Unterstützung von Netzwerkgeräten sollte man auch noch wissen, dass im Menü von make manuconfig zwei Einträge dazu existieren. Einmal direkt im Hauptmenü:
[*] Networking support ---> -*- Wireless --->
und nochmal unter:
Device Drivers ---> [*] Network device support --->
7. Kernel kompilieren
Der Paketname des zu kompilierenden Kernels kann über den Parameter –revision angegeben werden. Wer darüber hinaus auch den apt-Paketnamen des Kernels anpassen möchte, muss dies anzuhängene Zeichenfolge in der .config über CONFIG_LOCALVERSION= angeben. Bei der Verwendung des GrSecurity wird statt dem Parameter in der .config eine Datei namens localversion-grsec zum setzten verwendet. In der Datei kann der Prefix entsprechend angepasst werden.
-grsec-fitlet
Wenn auf dem Zielsystem ein anderer Kernel läuft, als jetzt compiliert werden soll, muss über den Befehl die erstelle .config Datei noch um alle fehlenden neuen Kerneloptionen der höheren Version ergänzt werden. Dazu einmal die Konfiguration per menuconfig laden und erneut abspeichern.
Anschließend gehts ans Kompilierend des Kernels. Dies dauert übrigens bei einer minial Version nur wenige Minuten, statt 1h+ bei dem vollen Kernel.
cp ../.config .config make clean fakeroot make-kpkg --initrd --revision=4.2.6.grsec.small kernel_image kernel_headers
Während des Kompilierungsvorganges werden die Parameter des Kernels abgefragt, für welche in der .config-Datei keine Einstellunge angegeben sind, z.B. weil diese Einstellung neu ist. Die Fragen daher einfach mit N beantworten
Anschließend kann der Kerne installiert und wie hier beschrieben Testweise gebootet werden. Der so entstandene Kernel war auf meinem System wesentlich kleiner als der Origianl Kernel:
3,8M /lib/modules/4.2.6-grsec-fitlet 3,7M /boot/vmlinuz-4.2.6-grsec-fitlet 2,4M /boot/System.map-4.2.6-grsec-fitlet 100K /boot/config-4.2.6-grsec-fitlet 9,8M insgesamt
Ein Kommentar
Pingback: Projekt: Fitlet XA-10 als Linux Router › .: blog.cscholz.io :.