Kernel 4.1.15 für Utilite Pro

Kernel 4.1.15 für Utilite Pro
Artikelbild: (C) LinuxLookup

Ich betreibe einen kleinen, sehr kleinen ARM-basierten Linux Server. Das Ding nutzt zum Booten "Das U-Boot" (Link), einen speziellen Bootloader. Intern werkelt eine kleine 32-GB SSD und er verfügt über HDMI, 2 x LAN diverse USB und verbraucht unglaublich wenig Strom. Er nutzt einen Freescale Cortex-A9 (1,2 GHz, 4 Kerne) und 2 GB Ram. Perfekt und immer noch genug für einen Linux Server ohne GUI. Eigentlich.

Der Utilite Pro genannte Industriecomputer wurde ursprünglich mit einem Ubuntu 12.04 ausgeliefert. Auf solch spezieller Hardware läuft natürich kein Mainline-Kernel und so ist ein Update schwierig. Es ist unmöglich einfach ein Ubuntu zu aktualisieren, eigentlich ist es sogar schon nicht so einfach überhaupt ein System auf die Kiste zu kriegen, wir arbeiten auf völlig anderer Architektur. Auch muss man sich mit einem RS232 Serial Cable verbinden, braucht noch einen USB-RS232 Adapter (oder einen sehr alten Client) und eine Terminal-Software, um überhaupt etwas sehen zu können.

Es ist schwierig. Allerdings habe ich es geschafft das System auf ein Ubuntu 14.04 zu aktualsieren um dann festzustellen, dass damit der ausgelieferte Kernel 3.0.X nicht mehr funktioniert, weil ihm ein grundlegendes Feature fehlte. Für diese spezielle Hardware benötigt man neben den Kernel Sources und all den speziellen Patches die nur für diese Machine existieren, auch noch ein DTS und PTB File, quasi das Hardware-Layout. Das alles liegt mir nach langem Suchen vor und so versuche ich, einen "aktuelleren" (der aktuelle Longterm Kernel ist 5.15.88 und der aktuelle Stable ist 6.1.6) Kernel zu kompilieren, denn ein Upgrade auf Ubuntu 22.04 schlug fehl, weil mein damals kompiliereter Kernel 3.1.X abermals wichtige Feaures missen lässt, die nun aber mandatory sind damit Apache etc. pp. überhaupt noch funktioneren. Es ist zum Verrücktwerden.

Ich muss also einen Kernel 4.1 kompilieren. 4.1.15 ist das letzte mit den Patches etc. kompatible Gespann, was ich auf GIT finden konnte. Jetzt möchte ich aufschreiben, was ich getan habe - und ob es überhaupt funktioniert.

Grundlage ist mein Utilite Pro mit Ubuntu 20.04.05, einem selbst kompilierten Kernel 3.1 und dem Willen, einen modernen Kernel zu bauen. Wenigstens ein bisschen moderne, damit das Utilite auch noch mit Ubuntu 22.04 läuft, dem aktuellen LTS.

Beachtet: wir arbeiten auf dem Utilite Pro auf dem ein aktuelles Linux läuft und wollen hier einen neuen alten Kernel kompilieren. Das heißt wir kompilieren auf ARM und brauchen so auch ARM Software, die APT Quellen etc. sind also Ports, nur falls ihr euch später wundert.

Ressourcen

How To Anleitung

Um das Vorgehen kurz zu beschreiben: wir klonen uns das GIT Verzeichnis auf unser Linux. Dann applizieren wir alle Utilite Patches. Dann laden wir die Utilite Pro Config für den Kernel, damit der Kernel korrekt eingestellt ist. An dieser Stelle kann man natürlich weitere Änderungen am Kernel konfigurieren. Dann kompilieren wir den Kernel, die Module, installieren diese nebst Firmware etc., dann bauen wir unser zImage aus dem Device Tree Blob und letztendlich installieren wir den Kernel nach /boot.

  1. Legt euch ein Arbeitsverzeichnis an, in welchem ihr kompilieren wollt. Wechselt in das Verzeichnis.
  2. Ladet euch den Patch herunter. Speichert ihn in eurem Arbeitsverzeichnis:
    wget http://thafaker.crabdance.com/files/utilite/linux-4.1.15-cm-fx6-8.0.patch
  3. Ladet euch den Kernel von Github in euer Arbeitsverzeichnis:
    git clone https://github.com/varigit/linux-2.6-imx.git kernel
  4. Wechselt in den herunter geladenen Kernel
    cd kernel
  5. Patcht aus dem Kernel Verzeichnis heraus:
    patch -p1 < ../linux-4.1.15-cm-fx6-8.0.patch
  6. Jetzt ist unser Kernel vorbereitet, um für das Utilite Pro kompiliert zu werden

Jedoch gibt es an dieser Stelle ein Problem: Kernel 4.1.15 ist ziemlich alt. Aktuell nutzen die Distributionen gcc in Version 9 und höher. Der alte Kernel lässt sich nicht mit einem so neuen gcc kompilieren. Wir brauchen also neben dem aktuellen GCC ein altes GCC nur für unseren Kernel 4.1. Garantiert funktionieren wird GCC-4.9; dieses lässt sich unter Ubuntu 18.04 und höher jedoch nicht mehr nachinstallieren. Wir müssen uns eines Tricks bedienen. Wir erweitern unseren Paketmanager APT um die alten Quellen von Ubuntu Xenial und installieren so gcc-4.9; nicht schön, aber immerhin funktioniert es.

  1. sudo nano /etc/apt/sources.list
  2. Tragt folgende Paketquellen ein:
  3. 'deb http://ports.ubuntu.com xenial main'
    deb http://ports.ubuntu.com xenial universe
  4. gefolgt von einem sudo apt update
  5. Jetzt haben wir die alten Quellen eingelesen und können mit dem Befehl:
  6. sudo apt install gcc-4.9
  7. Mit einem Befehl innerhalb des Kernel-Verzeichnisses können wir ihm sagen, dass wir nun anstelle von gcc-9 unser altes gcc-4.9 nutzen möchten. Damit klappt die Kompilierung. Der Befehl der hinter make angehangen wird, lautet:
    CC=gcc-4.9 gefolgt vom eigentlich Befehl.

Wir befinden uns in unserem herunter geladenen und entpackten kernel 4.1.15 Verzeichnis, es sollte kernel heißen.

  1. Wir laden die Defconfig des Utilite Pro mit folgendem Befehl:
make CC=gcc-4.9 cm_fx6_defconfig

2. Jetzt erstellen wir die Module und den Kernel, mit dem Schalter -j4 sagen wir, dass er auf 4 Kernen kompilieren soll. Die Durchführung dauert auf dem Utilite Pro dennoch eine Ewigkeit. Ca. 30 Minuten.

make CC=gcc-4.9 -j4 zImage modules

3. Jetzt wird es Zeit, die kompilierten Module zu installieren. Alle Befehle als root.

sudo make modules_install

4. Wir installieren die Firmwares:

sudo make firmware_install

5. Wir installieren die Header:

sudo make headers_install

6. Jetzt bauen wir den Device Tree Blob. Ursprünglich beinhaltete das Kernelimage auch die Beschreibung der vorhandenen Hardware. Das ist unflexibel und deshalb wurde diese Beschreibung in eine externe Datei gepackt. Das hat zudem den grossen Vorteil, dass auch U-Boot die gleiche Information über die Hardware nutzen kann.

make imx6q-sbc-fx6m.dtb imx6dl-sbc-fx6m.dtb

Die erste ist für den Utilite Pro, die zweite für den normalen Uilite, jenachdem welchen ihr habt.

7. Jetzt packen wir das Kenel zImage und den DTB zusammen und bauen daraus ein einzelnes File, welches unter tmp landet (wir befinden uns noch immer im Kernel-Verzeichnis):

cat arch/arm/boot/zImage arch/arm/boot/dts/imx6q-sbc-fx6m.dtb > /tmp/zImage-cm-fx6
zImage und DTB für den Utilite Pro

Das wars, wir sind fertig. Jetzt kopieren wir das zImage und das DTB File in unsere Boot-Partition. Das Kernel-Image muss folgenden Namen haben:
* zImage-cm-fx6
Das DTB muss folgenden Namen haben:
* cm-fx6.dtb

Utilite Pro mit 4.1.15 Kernel zImage und DTB
Utilite Pro mit 4.1.15 Kernel zImage und DTB

Nach einem Reboot startet euer Utilite mit dem neuen Kernel.

Ressources

Installing Ubuntu 14.04 on the utilite computer from scratch · umiddelb/armhf Wiki
interesting stuff about arm devices (Utilite, SolidRun, Odroid) - Installing Ubuntu 14.04 on the utilite computer from scratch · umiddelb/armhf Wiki
GitHub - varigit/linux-2.6-imx: Variscite public linux-2.6-imx.git
Variscite public linux-2.6-imx.git. Contribute to varigit/linux-2.6-imx development by creating an account on GitHub.

Kommentare