Gentoo-Linux ist aus meiner Sicht die optimale Wahl um aus Embedded-Systemen wie dem Cubietruck die maximale Performance oder Energieeffizienz zu holen. Ich wurde nun mehrfach gebeten eine einfache Anleitung für ein gebrauchsfähiges Gentoo-System für den Cubietruck zu schreiben. Hier ist sie:
0. Arbeitsmittel bzw. Voraussetzungen
Gentoo-Linux lässt sich auf einer sehr kleinen SD-Karte (um 1GB) installieren, jedoch benötigt man dann für Updates ein externes Linux-System, was üblicherweise keinen Spaß macht. Ich empfehle eine 16-32GB Speicherkarte oder eine SATA-Festplatte. Benötigt wird zudem ein funktionierendes Linux-System. Sei es ein Desktop-Rechner oder ein schon im NAND des Cubietruck installiertes System, beides genügt.
1. Vorbereitung
Zunächst benötigen wir eine aktuelle Version von Gentoo-Linux, die für den Cubietruck übersetzt wurde. Die so genannten Stage-3-Tarballs kann man sich hier herunterladen:
http://distfiles.gentoo.org/releases/arm/autobuilds/current-stage3-armv7a_hardfp/
Um das System starten zu können wird zusätzlich ein Boot-Loader (U-Boot), ein Boot-Skript und ein Kernel-Image benötigt. Diese habe ich hier bereitgestellt:
Mainline-Kernel für Cubietruck.
Im Archiv enthalten sind auch alle nötigen Module. Diese befinden sich im „lib“-Verzeichnis, welches ins Wurzelverzeichnis „/“ kopiert werden müssen.
2. Erstellung der SD-Karte
Für die Boot-Partition empfehle ich so um die 50MB, damit für spätere Experimente und Backups von Kernels immer noch genug Platz bleibt. Meine Partitionstabelle für eine 16GB-SD-Karte sieht so aus:
Disk /dev/mmcblk0: 14.7 GiB, 15720251392 bytes, 30703616 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xXXXXXXXX Device Boot Start End Blocks Id System /dev/mmcblk0p1 2048 104447 51200 83 Linux /dev/mmcblk0p2 104448 30703615 15299584 83 Linux
Für eine SATA-Festplatte mit dem Root-Dateisystem empfehle ich auch eine (identisch große) Boot-Partition anzulegen, weil der U-Boot hoffentlich in naher Zukunft auch den Mainline-Kernel direkt von der SATA-Festplatte booten kann und damit der zusätzliche Schritt über eine SD-Karte entfallen kann. Anschließend kann die Boot-Partition mit dem Extended-2-Dateisystem (mkfs.ext2) formatiert werden. Für die Root-Partition empfehle ich BTRFS oder EXT4.
Anschließend können die Dateien aus meinem Kernel-Archiv kernel_4.0_cubie_sunxi_ss_1008MHz auf die Boot-Partition entpackt werden. Nun muss man sich für eine der Boot-Optionen entscheiden. Ich habe vier Optionen vorbereitet:
-
boot_mmc_hdmi.src
-
boot_mmc_vga.scr
-
boot_sata_part2_hdmi.scr
-
boot_sata_part2_vga.scr
Ich selbst verwende die boot_sata_part2_vga.scr-Version. Die entsprechende *.scr-Datei muss nun in boot.scr umgenannt werden um vom Bootloader gefunden zu werden. Anschließend kann der Bootloader installiert werden:
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8
Bei der Benutzung eines PCs zum Erstellen der SD-Karte auch hier wieder den korrekten Namen der SD-Karte angeben – wichtig! hier muss dann z.B. /dev/sdd stehen und nicht eine der Partitionen. Der Bootloader wird direkt hinter die Partitionstabelle geschrieben. Damit ist die Boot-Partition der SD-Karte fertig eingerichtet.
3. Root-Dateisystem entpacken
Nun kann die Stage-3-Tarball-Datei ausgepackt werden. Hierbei muss darauf geachtet werden, dass die Datei unter Beibehaltung der Dateirechte entpackt wird. Dies geschieht via:
tar vxjpf stage3-armv7a_hardfp-20141023.tar.bz2
im Wurzelverzeichnis der jeweiligen Root-Partition. Also hier Partition 2 auf der SD-Karte oder der SATA-Festplatte.
4. Root-Passwort setzen
Vor dem ersten Start sollte man nicht vergessen, das Root-Passwort zu setzen. Dies geschieht in der Datei etc/shadow. Achtung, bitte darauf achten, nicht die shadow-Datei des aktuell laufenden Systems zu ändern 😉 Das Standardpasswort „admin“ kann man setzen, indem man die schon vorhandene Zeile für root mit dieser ersetzt:
root:$6$U6.oL2DZ$Kl0Koaq/r/BzbT9edZSDWQXqMgbatx7fMn0xPTUAyqm.OrqKIGN59kH40snsS.09lNmrSXKoiKpFCrJjITDUH.::0:::::
4. Neustart
Nun kann das System gestartet werden. Damit die Module des Kernels via „modprobe“ gefunden werden können, müssen einmalig die Modulabhängigkeiten erzeugt werden. dies geschieht via „depmod -a“.
Viel Spaß mit dem Gentoo-System! Für die weitere Einrichtung des Systems kann man gerne das sehr umfangreiche Gentoo-Handbuch oder das WIKI des Gentoo-Projektes zu Rate ziehen.
Update: Das bereitgestellte Kernel-Archiv wurde auf die Release-Version des Kernel 4.0 aktualisiert. Es enthält einen Patch um die 1008MHz-Taktrate wiederherzustellen und Unterstützung für das SUNXI-Security-System, den Crypto-Beschleuniger des Cubietruck.
Über die Vorzüge des Crypto-Beschleunigers habe ich hier berichtet.
Update 2: Die von mir bereitgestellten Kernels habe ich nun auf eine eigene, permanente Seite ausgelagert. Sie befindet sich hier.
Hi Robert!
Ich habe dein Howto ausprobiert, momentan nur auf SDCard und EXT4 als Root-Partition. Jedoch möchte ich lieber JFS einsetzen, da ich auf meinen Linux Systemen eine generelle „JFS Politik“ fahre (und meine externen HDDs ebenfalls). Kannst du evtl. deinen Kernel mit JFS support enabled zur Verfügung stellen bzw. auf eine Seite verlinken, wo erklärt wird, wie man den 4er Kernel kompiliert?
Danke!
Hallo Ingo,
ich habe mein bereitgestelltes Kernel-Image um JFS und XFS erweitert. Wie der Kernel zu übersetzen ist, habe ich in dem folgenden Beitrag schon einmal für Kernel 3.19 beschrieben, beim Kernel 4.0 hat sich prinzipiell daran nichts geändert:
https://www.robert-sperling.de/2015/01/03/cubietruck-migration-auf-mainline-kernel/
Wenn der Kernel 4.0 mit meiner Kernelkonfiguration übersetzt werden soll, müssen zuvor die Kernel-Patches in der ZIP-Datei angewendet werden. Ansonsten läuft der Cubietruck nur mit 920MHz und der Treiber für den Crypto-Beschleuniger fehlt.
Grüße,
Robert
Danke Robert für das neue Kernel Image!
Ich werde es bei Gelegenheit selbst probieren, aber ich glaube momentan stimmt was in meiner Toolchain nicht.
Hat es einen bestimmten Grund, warum du im Post das Archiv vom 20141023 angibst, obwohl offensichtlich das hier das aktuellere ist? http://distfiles.gentoo.org/releases/arm/autobuilds/20141024/stage3-armv7a-20141024.tar.bz2
Alles klar! ARMv7 HardFP!
Hallo Robert,
es waere prima, wenn sich dein Kernel auch zum network-booten
eignete.
Es scheint zumindest der nfs support zu fehlen.
Wenn es hilft, eine Kopie der Konfiguration fuer den alten 3.4.101 Kernel findet sich hier:
http://muth.org/Robert/config.gz
Gruss,
Robert
Danke für die Anregung. Meine Grundregel lautet, aus Sicherheitsgründen alles abzuschalten, was nicht gebraucht wird. NFS-Boot klingt aber spannend genug, um es als Standard-Option in meine Kernels aufzunehmen. Was benötigst Du? NFS2, NFS3 (mit oder ohne ACL Protocol-Extension), oder NFS4. Möchtest Du NFS-Swapping Support und sollte NFS Client Caching ins lokale Dateisystem aktiviert sein?
Hallo Robert,
ich stehe ziemlich auf dem Schlauch… Ich habe deinen Kernel auf meinem CubieTruck unter Debian Jessie am laufen – aber ich weiss nicht, wie ich es dazu bringe, deine Kernel Module zu finden. Ich hab den Unterordner lib aus dem Archiv kernel_4.0_cubie_sunxi_ss_1008MHz.zip auf mein Wurzelverzeichnis geschoben und einzelne *.ko.gz Dateien ausgepackt – aber so einfach ist das offenbar nicht. Wobei mein root directory auf /dev/sda1 liegt, also ich gehe direkt auf die Sata-Platte. Ausser dass die Module nicht da sind, läuft es eigentlich schon ganz ordentlich…
VG
Peter
Hallo Peter,
danke für den Hinweis, das werden ich im Artikel noch ergänzen. Die Module muss man nicht entpacken, es reicht das lib-Verzeichnis nach / zu kopieren. Danach müssten sie die Module via „insmod“ und vollem Pfad laden lassen. Damit sie von „modprobe“ gefunden werden, müssen einmalig die Modul-Abhängigkeiten erzeugt werden. Dies geschieht via „depmod -a“ mit dem aktuell laufenden Kernel.
Hallo Robert,
irgentwo klemmt noch immer was – es ist absolut seltsam, aber ich bekomme keine Module geladen.
root@circe:~# lsmod
Module Size Used by
root@circe:~# uname -r
4.0.5
root@circe:~# insmod /lib/modules/4.0.5/kernel/drivers/cpufreq/cpufreq_conservative.ko.gz
insmod: ERROR: could not insert module /lib/modules/4.0.5/kernel/drivers/cpufreq/cpufreq_conservative.ko.gz: Invalid module format
root@circe:~#
Kann das daran liegen, dass ich ein selbstkompiliertes U-Boot benutze? Wohl eher nicht. Sind da noch andere Teile des Systems, die mit einer bestimmten Version von gcc kompiliert sein müssen? Ich hab schon ziemlich viel Zeit in eine ergebnislose Suche investiert. In den verschiedenen Logs taucht auch nichts auf. Auch die Option -v von insmod oder modprobe liefert keine Hinweise. Es wäre irgentwie schade, so knapp vor der Ziellinie zu scheitern…
„depmod -a“ kommt auch direkt zurück, während es auf meinen anderen Rechnern einige Zeit lang läuft. Irgent etwas ist da oberfaul.
Danke für die Hilfe & Viele Grüsse
Peter
Hallo Peter,
einen Zusammenhang mit dem U-Boot würde ich ausschließen. Ich habe eher die modutils im Verdacht. Möglicherweise sind sie zu alt oder wurden nicht mit zlib-Unterstützung übersetzt.
Was gibt „modprobe -V“ aus? Funktioniert das Laden der ungepackten Module? Was gibt „modprobe -v cpufreq_conservative“ aus? Klappte das Laden der gepackten Module mit dem 3.4er Kernel? Welche Distribution verwendest Du? Gentoo?
Hallo Robert,
aaalso, wenn ich ein Modul entpacke, kann ich es per insmod laden. Das ist schon mal ein ziemlich guter Fortschritt. Ansonsten:
root@circe:~# modprobe -V
kmod version 20
Mit insmod und dem vollen Pfad kann ich die entpackten Module laden. Jetzt muss ich aber erst mal herausfinden, warum locate die Module nicht findet. Da ist etwas ziemlich faul.
Mit dem 3.4er Kernel waren Module geladen. Ich könnte (aber erst am Wochenende) die alte SD-Karte einstecken und Tests mit dem alten Kernel machen. Derzeit läuft Debian Jessie auf dem Board. Ich bin gerade dabei, Gentoo auf einem Raspi aufzusetzen und wenn ich dort Samba am laufen habe, werde ich Gentoo auch auf dem Cubie installieren. Ich werde nach und nach auf allen meinen Maschinen von Debian auf Gentoo wechseln, da ich von bei zumindest bei einer Maschine unlösbare Probleme mit systemd hab. Aber das alles braucht seine Zeit…
Vielen Dank für den Support! Ich glaube, du hast mir schon ein gutes Stück weitergeholfen.
MfG
Peter
Hallo Robert,
ich bin nochmal weiter: wenn ich ein Module entzippe, taucht es nach einem Reboot und „insmod -a“ in /lib/modules/4.0.5/modules.dep auf – und dann kann ich es per modprobe laden… d.h. ich werde mein Problem mit einem Script lösen, das alle Module im Verzeichnisbaum entpackt.
VG
Peter
Es sollte ein depmod -r ‚kernel-version‘ gemacht werden. Als Kernelversion zb 4.1, sollte dem entsprechen was unter /lib/modules/kernel-version zu finden ist.
Das depmod mit der Angabe der Kernel-Revision ist nur nötig, wenn zur Zeit ein anderer Kernel läuft. Ansonsten genügt aus meiner Sicht das „depmod -a“ zum Proben aller Module nach dem Neustart.
Vielen Dank,
die 4.1.1 läuft perfekt auf meinem Gentoo Cubie.
Weiter so….
Endlich wieder Gentoo … mir ging das ganze Ubuntu und Debiangeraffel mit veralteten Repositories für ARM total auf den Senkel.
Vielen Dank für die Anleitung und das vorbereitete Kernelimage!
Lief auf Anhieb auf meinem Cubietruck mit 4.5.1 mit ext4 auf SD-Karte.
Prima, schön, dass ich helfen konnte. Aus meiner Sicht ist Gentoo aktuell neben Arch-Linux die erste Wahl für den Cubietruck.
Nachtrag: Nach nun drei Monaten im Dauereinsatz erweist sich der Cubietruck mit Gentoo, und mittlerweile einer 2TB 2,5″ HDD als zuverlässiger kleiner Heimserver im 24/7 Betrieb. Die Rechenleistung reicht vollauf für Gentoo.
Auch mit Verschlüsselung erreiche ich Datenraten >30mb/sec auf der HDD. Ok, das Erreicht nicht die Leistung eines x86-Systems mit SSE3 – aber es genügt für meine Anwendungsszenarien vollauf. Kurzum: Ich bin weiterhin begeistert!
Hallo .*,
beim Einrichten meines Cubietrucks laufe ich leider in das Problem, dass eth0 nicht hochkommt (Interface ist down). Manuelles starten (ifconfig eth0 up) funktioniert. Eine entsprechender Link unter /etc/init.d wurde auch angelegt, bringt nach einem Neustart aber auch keine Änderung. Wenn ich das Script manuell starte, kommt das Netzwerk hoch.
Hatte jemand schonmal ähnliche Erfahrungen gemacht und kann mich auf meinen Fehler hinweisen?
Thanks in Advance,
Falko
Das Starten des Ethernet-Interfaces hängt je nach Distribution an einem Dienst. Bei Gentoo muss zum Starten des Ethernet-Interfaces:
rc-update add net.eth0 default
ausgeführt werden. Die Dienste-Datei erzeugt man z.B. durch einen symbolische Link:
ln -s /etc/init.d/net.lo /etc/init.d/net.eth0
Bei anderen Distributionen sollte man dazu die jeweilige Installationsanleitung konsultieren. Ich hoffe, das hilft.
Grüße,
Robert