Der Einplatinencomputer Odroid-C2 von Hardkernel wird standardmäßig mit dem nicht mehr ganz aktuellen Kernel 3.14.x ausgeliefert. Unter Arch Linux läuft mein System aktuell mit dem Mainline Kernel. So steht immer die aktuelle Version des Linux Kernels zur Verfügung. Allerdings ist dieser Vorgang mit ein wenig Vorsicht zu betrachten. Es ist nicht garantiert, dass alle Funktionen mit dem Mainline Kernel gegeben sind, da durchaus benötigte Patches fehlen können. Im reinen Headless Betrieb kann ich auf alle wichtigen Funktionen wie Ethernet und USB Ports zugreifen. Der Wechsel auf den Mainline Kernel ist generell nicht kompliziert. Allerdings empfiehlt sich auf jeden Fall im Vorfeld ein Backup anzulegen, um wieder ohne großen Aufwand auf die vorherige Version zurückwechseln zu können. Eine einfache Lösung liefert Partclone unter Linux. Damit lassen sich komprimierte Images einer Partition anlegen.
Wie der Vorgang funktioniert, ist hier beschrieben. Klick
Ist das Image des aktuellen Zustands erzeugt, sollte das System auf den aktuellen Stand gebracht werden.
sudo pacman -Syu
Um den Mainline Kernel auch starten zu können, muss zusätzlich auf die U-Boot Mainline Version gewechselt werden. Die aktuell eingesetzte Version wird dazu entfernt.
sudo pacman -R uboot-odroid-c2
Sollte später wieder das Image mit dem ausgelieferten Kernel zurückgewechselt werden, muss der Bootloader angepasst werden. Wie das funktioniert, folgt später. Um die Mainline Versionen des Kernels und U-Boots zu nutzen, werden diese aus den Repositories installiert.
sudo pacman -S uboot-odroid-c2-mainline linux-aarch64
Danach wird der Odroid-C2 neu gestartet.
Mit dem Mainline Kernel sollte geprüft werden, ob alle Systemdienste ordentlich laufen.
sudo systemctl list-units
Zum Zeitpunkt der Erstellung des Artikels mit Kernel 4.14 hatte ich Probleme mit “haveged” und “cpupower”. Damit cpupower wieder funktioniert, muss die boot.txt angepasst und danach in eine boot.scr konvertiert werden.
cd /boot sudo nano boot.txt
Folgender Inhalt muss eingefügt werden.
#add support for cpupower fdt addr ${fdt_addr_r}; fdt set /scpi/clocks status okay;
Die gesamte boot.txt sieht dann so aus:
# After modifying, run ./mkscr test -n "${distro_bootpart}" || setenv distro_bootpart 1 part uuid ${devtype} ${devnum}:${distro_bootpart} uuid setenv bootargs "console=ttyAML0,115200n8 root=PARTUUID=${uuid} rw rootwait earlycon" if load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /boot/Image; then if load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /boot/dtbs/${fdtfile}; then #add support for cpupower fdt addr ${fdt_addr_r}; fdt set /scpi/clocks status okay; if load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /boot/initramfs-linux.img; then booti ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}; else booti ${kernel_addr_r} - ${fdt_addr_r}; fi; fi; fi
Damit die angepasste Datei auch angewendet wird, muss eine neue boot.scr Datei erstellt werden. Dazu muss das Paket „uboot-tools“ installiert sein.
sudo ./mkscr
Nach einem Neustart funktioniert auch cpupower wieder. Haveged kann durch “rng-tools” ersetzt werden.
sudo pacman -R haveged
sudo pacman -S rng-tools
Um die rng-tools sauber zu verwenden, wird die Konfiguration entsprechend angepasst.
sudo nano /etc/conf.d/rngd
RNGD_OPTS="-o /dev/random -r /dev/hwrng”
Danach kann der Dienst gestartet werden.
sudo systemctl enable rngd.servive
sudo systemctl enable rngd.servive
Wird der Odroid-C2 mit einem eMMC Modul betrieben, kann es mit dem Mainline Kernel zu CRC Fehlern beim Starten kommen. Das Dateisystem wird dann nur noch im Lesemodus eingebunden. Um das zu verhindern, kann die Taktung des eMMC Moduls heruntergesetzt werden. Dazu muss der vorhandene Device Tree Blob wieder in ein Device Tree Source rekompiliert werden.
cd /boot/dtbs/amlogic
sudo dtc -I dtb -O dts -o meson-gxbb-odroidc2.dts meson-gxbb-odroidc2.dtb
sudo nano meson-gxbb-odroidc2.dts
In der Datei gibt es zwei Einträge für „max-frequency“. Der erste Eintrag ist für die SD Karte, der zweite für das eMMC Modul. Das eMMC Modul hat standardmäßig einen Wert von „200000000“ oder „0xbebc200“ in Hex Form. Um die CRC Fehler zu vermeiden, kann der Wert auf „0x8f0d180“ (150000000) gesetzt werden. Danach muss das DTS wieder in ein DTB kompiliert werden.
sudo dtc -O dtb -b O -o meson-gxbb-odroidc2.dtb meson-gxbb-odroidc2.dts
Ab jetzt sollte das System ohne Fehler starten.
Der Wechsel auf den ursprünglichen Kernel kann auch direkt aus dem System erfolgen, ohne das Image zurückzuspielen.
sudo pacman -R uboot-odroid-c2-mainline
sudo pacman -S uboot-odroid-c2 linux-odroid-c2
Sollte das erstellte Image zurückgespielt werden, muss noch zusätzlich der Bootloader angepasst werden. Dazu wird die SD Karte oder das eMMC Modul eingebunden, um es bearbeiten zu können. Das Gerät „/dev/sdX“ muss natürlich an den tatsächlichen Namen angepasst werden.
sudo mkdir /mnt/odroid
sudo mount /dev/sdX1 /mnt/odroid
cd /mnt/odroid/boot
sudo ./sd_fusing.sh /dev/sdX
cd ../..
sudo umount /mnt/odroid
Ohne diesen Schritt würde das System nicht mehr starten.
Der Wechsel auf den Mainline Kernel unter Arch Linux ist nicht sonderlich aufwändig. Allerdings sollte im Vorfeld geprüft werden, welche Funktionalitäten zwingend gegeben sein müssen. Auch nach dem Wechsel sollte auf jeden Fall geprüft werden, ob das System in einem brauchbaren Zustand ist, bevor es ansonsten im laufenden Betrieb zu permanenten Störungen kommt.