Raspbian Minimal-Image mit Realtime-Kernel selbst erstellen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo zusammen,

    im Zuge meiner Tüfteleien für eine Art autonomes Fahrzeug kam mir der Gedanke, dass es nicht schlecht wäre, wenn das verwendete OS auf dem als Master-Controller eingesetzten Raspi

    • möglichst schlank wäre und
    • mit möglichst niedrigen Latenz-Zeiten reagieren würde.

    Animiert durch das durchaus interessante Latetenz-Verhalten (dargestellt -> hier <- in einer Grafik) habe ich also mal versucht, ein möglichst schlankes System mit dem ua-netinstaller auf den raspi zu bringen, die passenden Kernel-Sourcen zu installieren, mit dem Realtime-Patch zu versehen und das enstandene Linux dann auf der Kiste zu booten.
    Dazu habe ich zwei Vorgehen ausprobiert, und die Ergebnisse mal hier niedergeschrieben.

    Um Platz auf der SD-Karte zu sparen habe ich die Kernel-Sourcen auf eine USB-Platte ausgelagert, und damit es schneller geht den Kernel und die Module auf meinem Laptop unter Ubuntu per toolchain erzeugt.
    Das geht natürlich auch auf der lokalen Festplatte Eures Linux-Rechners, nur dann müsst ihr den Transfer der Sourcen des ua-netinst-Kernel später über das Umstecken der SD-Karte bewerkstelligen und habt den ganzen compilierten Krempel auf Eurem Rechner.
    Wer keinen Linux-Rechner zur Verfügung hat: das sollte auch in einer VM oder mit einer Live-CD funktionieren ...

    Vorarbeiten:
    Schliesst eine USB-Platte an Euren Linux-Rechner an und besorgt Euch erst mal die aktuelle toolchain.
    Dazu könnt ihr nach -> dieser Anleitung <- unter dem Punkt Install toolchain vorgehen. Aber erst nur die toolchain installieren, sonst nichts.
    Kurz zusammengefasst:

    Zitat
    Code
    $ git clone https://github.com/raspberrypi/tools


    You can then copy the toolchain to a common location such as /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian, and add /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin to your $PATH in the .bashrc in your home directory. For 64bit, use /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin. While this step is not strictly necessary, it does make it easier for later command lines!

    In der Zwischenzeit könnt ihr die aktuelle Version des ua-netinst nach der -> Anleitung auf github <- installieren und den Raspi booten.

    Achtung! Beim netinstaller gibt es keinen User pi. Der Default-Benutzer ist root und das Passwort ist raspbian. Das gilt auch für ssh-Verbindungen.

    Variante 1: Kernel-Sourcen per apt-get installieren und patchen:
    Nach dem booten des Raspi mit

    Code
    apt-get intall linux-source


    die Sourcen installieren.
    Diese liegen, inclusive dem passenden RT-Patch, anschliessend unter /usr/src als komprimiertes Archiv vor.
    Jetzt die USB-Platte am RPi mounten, sowohl das Archiv als auch den patch auf die externe Platte kopieren und anschliessend die Platte wieder aushängen.
    Die Festplatte jetzt an einen Ubuntu- oder anderen Linux-Rechner anschliessen.
    Jetzt den Sourcecode entpacken und patchen:

    Code
    tar xf linux-source-3.2.tar.bz2
    cd linux-source-3.2
    patch -p1 < ../linux-patch-3.2-rt.patch


    Das sollte fehlerfrei durchlaufen.
    Anschliessend geht es an den Kernel-build und das Kopieren der Dateien auf die SD-Karte.
    Fahrt dazu den Raspi herunter und steckt die SD-Karte in einen Karten-Leser oder den SD-Slot Eures Linux-Rechners. Der folgende bash-script ist "on-the-fly" entstanden und kann von Euch genutzt werden.
    Aber Vorsicht! Bitte die Pfade zur gemoounteten FAT- und EXT4-Partition der SD-Karte sowie der USB-Platte resp. dem Tools- und Verzeichnis vorher anpassen.
    Zum Verständnis:
    /media/8ED4-1059 enthält die FAT-Partition der SD-Karte
    /media/bfdb4208-5a99-4063-85b9-a868931c851a enthält die EXT4-Partition der SD-Karte
    /media/USB_HDD ist der mountpoint meiner USB-Platte

    Dieser script ist zum build für einen Raspi Modell B Rev. 2 ... also nicht für einen Raspi 2!
    Um für den RPi 2 einen Kernel zu bauen, müsst ihr die entsprechenden Zeilen mit einem Kommentar versehen bzw. diesen entfernen.

    Variante 2: bereits mit patch versehene Kernel-Sourcen von emlid installieren:
    Der Sourcetree ist ziemlich umfangreich und umfasst auch die Firmware-Module. Das lässt auf gute Latenzzeiten und auf einen stabilen Kernel hoffen.
    Den Sourcecode per git in ein Verzeichnis Eurer Wahl klonen und anschliessend übersetzen. Auf den Seiten von -> emlid auf github <- ist eine Anleitung enthalten, die auch ich verwendet habe. Den Punkt mit den tools könnt ihr überspringen, weil ihr die ja bereits installiert habt.

    Anschliessend stehen drei bootbare Kernel zur Verfügung:
    /boot/kernel.img -> der Original-Kernel vom netinstaller
    /boot/kernel-rtlinux.img -> der Kernel aus den selbst gepatchten Sourcen
    /boot/kernel-rt.img -> der Kernel aus den Sourcen von emlid

    In der datei /boot/config.txt könnt ihr nun den Kernel angeben, den ihr booten wollt:

    Code
    ...
    #kernel=vmlinuz-3.18.0-trunk-rpi
    kernel=kernel-rtlinux.img
    #kernel=kernel-rt.img
    ...


    Alle anderen Einträge braucht ihr nicht anzufassen.


    Latenz-Verhalten:

    Das Latenz-Verhalten des aktuell laufenden Kernels Eures RPi könnt ihr z.B. mit cyclictest testen. Dieses Tool ist auf sourceforge.net/p/raspberrypisnip/wiki/RealTime erhältlich.
    Zum Testen habe ich ein kleines script geschrieben:

    Bash
    #!/bin/bash
    #
    cd /root/rt-tests
    #
    ./cyclictest -l1000000 -m -n -a0 -t1 -p99 -i400 -h400 -q > "`uname -r`.log" &
    while pidof cyclictest
    do 
    echo "still running ..."
    ./hackbench -f 10 -s 10 2>&1 >/dev/null
    done

    Mit dem Standard-Kernel aus dem ua-netinstaller kommt cyclictest auf folgende Latenz-Zeiten:

    Code
    # Total: 000999920
    # Min Latencies: 00029
    # Avg Latencies: 00056
    # Max Latencies: 01997
    # Histogram Overflows: 00080
    # Histogram Overflow at cycle number:
    # Thread 0: 02031 15001 28086 40803 53611 66530 79217 92426 105472 118527 118528 131537 144746 156055 157921 170860 183394 196434 209267 222268 235205 248391 261554 274902 287841 300734 313901 327065 340047 353450 366831 379896 393106 405684 418769 431699 445049 458284 471328 484171 497195 510136 520866 523256 536323 549416 562435 575543 588936 602011 615087 627734 640828 654092 667365 680682 693683 706610 719841 732618 745764 758813 771967 785080 798252 811020 823952 837128 849894 862870 875731 888736 901875 914884 928105 941331 954303 967450 980382 993290

    Der mit dem RT-patch selbst erzeugte Kernel liefert erstaunlicherweise schlechtere Werte:

    Code
    # Total: 000999802
    # Min Latencies: 00017
    # Avg Latencies: 00043
    # Max Latencies: 08478
    # Histogram Overflows: 00198
    # Histogram Overflow at cycle number:
    # Thread 0: 00772 06258 12023 13487 17963 23726 29446 35229 40986 46770 52774 58558 64314 70144 75901 81806 87776 89562 89565 89568 93491 99210 105126 110963 116706 116707 122624 128408 134110 139819 145580 151234 156955 162771 168536 174742 180654 186507 192341 198362 204273 210052 215812 221591 227551 233336 239027 244884 250905 256863 262640 268500 274328 280073 285821 291575 297324 303053 308829 314730 319550 320427 326188 331870 336742 337622 342494 343380 349203 355045 360743 360744 365701 366480 371341 372221 378007 383936 389667 395529 401526 401527 407467 407468 413285 419035 424815 430817 436637 442408 448204 454172 460020 465846 471681 477419 483304 489064 494924 499856 500731 505663 506539 512356 518574 524321 530023 535815 541633 547319 553344 559212 565402 571144 577062 582912 588830 594686 600436 606413 612438 618162 623999 629804 635677 635678 640571 641424 647259 653306 659150 665017 665018 670657 676386 682120 687873 693909 699660 705343 711132 717106 722788 728519 734300 740139 746066 751807 757544 763378 768199 769075 773954 774826 780637 786372 792162 797109 797962 803733 809679 815497 821324 827061 833095 838863 844713 850463 856192 861942 861943 867886 873630 879401 885287 891007 896783 902652 908508 913500 914367 919548 920426 926197 932049 937964 943700 949623 949624 955525 960501 961379 967399 973143 978910 984760 990522 996314

    Top-Latenzzeiten dagegen mit dem Kernel von emlid:

    Code
    # Total: 001000000
    # Min Latencies: 00030
    # Avg Latencies: 00054
    # Max Latencies: 00100
    # Histogram Overflows: 00000
    # Histogram Overflow at cycle number:
    # Thread 0:

    Mein Fazit:
    Mit max. 100 µs Latenz ist der emlid-Kernel der wohl berechenbarste Linux-Kernel.
    Für die Steuerung des Fahrzeugs werde ich wohl diese Variante verwenden.
    Wer sich den Zirkus mit dem Kernel-build sparen möchte, der kann ein Image von der -> Homepage von emlid <- downloaden.

    Vielleicht noch eine Anmerkung: eine Zusammenfassung, wie ihr mit dem ua-netinst Euer ganz spezielles System zusammenstellen könnt, findet ihr z.B. in -> diesem Beitrag <- hier im Forum.

    Viel Spass beim Experimentieren,
    -ds-

  • Raspbian Minimal-Image mit Realtime-Kernel selbst erstellen? Schau mal ob du hier fündig wirst!

  • Hast Du nicht Bock ein Image fertig zu machen und es zur Verfügung zu stellen? Deine Anleitung ist super, aber Du weißt, gerade beim Raspberry Pi ist das Publikum vielschichtig und warum einige verzweifeln lassen, das Patchen ist nun wirklich schon hohe Kunst und nicht für jeden verständlich. Ich hätte noch Platz für sowas auf meinem Server und würde das Image auch selbst machen, aber warum soll man was zusammenexperimentieren, wenn jemand schon gesicherte Erkenntnisse hat.

    EDIT: Sorry, ich maule ja sonst die Leute voll sie sollen bis zu Ende lesen, bei den vielen Codeansichten habe ich den Link auf das fertige Image übersehen.

  • Hi Jörg,

    Zitat


    ... Ich hätte noch Platz für sowas auf meinem Server und würde das Image auch selbst machen,
    ...


    Im Prinzip eine nette Idee, aber da das emlid-Image wohl das bessere zu sein scheint:

    Zitat


    Wer sich den Zirkus mit dem Kernel-build sparen möchte, der kann ein Image von der -> Homepage von emlid <- downloaden.

    ;) ...

    cu,
    -ds-

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!