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

    1. Pingback: Projekt: Fitlet XA-10 als Linux Router › .: blog.cscholz.io :.

    Leave A Reply