Im Folgenden wird beschrieben, wie ein Linux-Echtzeit-PC aufgesetzt wird.
Diese Anleitung ist am Institut für Regelungstechnik, Leibniz Universität Hannover unter Mitarbeit von Johannes Kühn, Alexander Tödtheide, Lars Johannsmeier und Moritz Schappler entstanden (2015 bis 2017). Die Autoren erhielten Förderung durch die Europäische Union (7. Forschungsrahmenprogramm Horizon 2020, Förder-Nr. 688857, "SoftPro") und das Bundesministerium für Bildung und Forschung (Förder-Nr. 16SV6175, "3. Arm").
(C) Institut für Regelungstechnik, Leibniz Universität Hannover
- Befehle auf Entwicklungsrechner (§)
- Normale Befehle auf Echtzeitrechner ($)
- Root-Befehle auf Echtzeitrechner (#)
Folgende Kriterien spielen bei der Auswahl des Linux-Kernels eine Rolle:
- Der Kernel muss mit RT-Patch unterstützt sein: https://www.kernel.org/pub/linux/kernel/projects/rt
- Optional: Sollte langzeit-unterstützt sein: https://de.wikipedia.org/wiki/Linux_(Kernel)#Versionen_mit_Langzeitunterst.C3.BCtzung
Folgende Kriterien spielen bei der Auswahl der Linux-Distribution eine Rolle:
- Welche Kernel-Versionen werden unterstützt?
- Distribution sollte langzeituntstützt sein
- Soll ROS unterstützt werden? (z.B. für RT-Interface)
- Ubuntu 14.04 (Trusty) für ROS Indigo, Ubuntu 16.04 (Xenial) für ROS Kinetic, Ubuntu 18.04 (Bionic) für ROS Melodic
Siehe auch:
Erprobt wurden bisher folgende Konfigurationen:
- LUbuntu 18.04 mit Kernel 4.19 (LUbuntu ist eine leichte Ubuntu-Variante)
- LUbuntu 16.04.1 mit Kernel 4.4
- LUbuntu 14.04.5 mit Kernel 4.4
Allgemein: Installation von Live-USB-Stick. Kopiere iso-Image auf USB-Stick. Am einfachstenunter Ubuntu mit dem "Startmedienersteller"
Herunterladen über offizielle Internetseite von Ubuntu
Die Alternate-Variante hat eine besonders einfache Desktop-Umgebung. Die Installation von ROS ist trotzdem möglich.
- LUbuntu 18.04: lubuntu-18.04-alternate-amd64.iso
- LUbuntu 16.04: lubuntu-16.04.1-alternate-amd64.iso
manche Distributionen kommen bereits mit einer Kernel-Version, die RT-unterstützt ist (z.B. LUbuntu 16.04.1 mit Kernel 4.4). Bei anderen ist dies nicht der Fall (z.B. LUbuntu 18.04 mit Kernel 4.15).
Modifiziere die Anleitung zur Installation des Kernels 4.19:
Nach Recherche des aktuellen Kernels: Hier z.B. 4.19.106, weil 4.19.106-rt45 die aktuellste RT-Patch-Version ist.
Passe die Download-Liste an: Wähle "generic", weil durch den RT-Patch bessere Eigenschaften als bei der Variante "lowlatency" erreicht werden.
$mkdir -p /tmp/kernel419
$cd /tmp/kernel419
$wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.106/linux-headers-4.19.106-0419106_4.19.106-0419106.202002240333_all.deb
$wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.106/linux-headers-4.19.106-0419106-generic_4.19.106-0419106.202002240333_amd64.deb
$wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.106/linux-image-unsigned-4.19.106-0419106-generic_4.19.106-0419106.202002240333_amd64.deb
$wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.19.106/linux-modules-4.19.106-0419106-generic_4.19.106-0419106.202002240333_amd64.deb
$sudo dpkg -i *.deb
Anschließend sollte in diesen Kernel gebootet werden. Wenn das nicht funktioniert (aus Hardware-Inkompatibilität) braucht man gar nicht mit dem Echtzeitpatch weitermachen. Dafür neustarten und im Grub-Bootloader den Kernel auswählen.
Tipp: Teilweise muss man beim Booten Shift (links) drücken, damit der Bootloader angezeigt wird.
Benutzer anlegen (hier am Beispiel des EtherCAT-Benutzers "ec")
$sudo adduser ec
SSH-Schlüssel für Benutzer erzeugen: https://wiki.ubuntuusers.de/SSH/#Authentifizierung-ueber-Public-Keys
§ssh-keygen -t rsa -b 4096 -f ~/.ssh/RTPC_ec
§ssh-copy-id -i ~/.ssh/RTPC_ec.pub [email protected]
SSH-Profil auf Entwicklungsrechner anlegen: https://wiki.ubuntuusers.de/SSH/#ssh-config
§nano ~/.ssh/config
Hineinkopieren (IP-Adresse dabei anpassen)
Host RTPC_ec
HostName 10.144.130.83
Port 22
User ec
IdentityFile ~/.ssh/RTPC_ec
Optional: Paketquellen auf Uni-Server umstellen: http://mirrors.ubuntu.com/mirrors.txt
Je nach Inhalt ist der eingestellte Server auch z.B. us.archive.ubuntu.com.
$sudo cp /etc/apt/sources.list /etc/apt/sources.list.orig
OLDMIRROR=http://de.archive.ubuntu.com/ubuntu/
NEWMIRROR=http://ftp.rrzn.uni-hannover.de/pub/mirror/linux/ubuntu/
$sudo sed -i "s|$OLDMIRROR|$NEWMIRROR|g" /etc/apt/sources.list
Programme installieren
$sudo apt-get install openssh-server sudo make gcc vim cmake
Die Umgebungsvariablen KERNEL
und RTPATCH
beschreiben die entsprechenden Versionen und sind abhängig vom installierten System (s.o.).
Für Ubuntu 16.04.1 und Ubuntu 14.04.5 bspw folgende Werte. Diese Variablen müssen an die gewählten Versionen angepasst werden:
KERNEL=4.4.66
RTPATCH=4.4.66-rt79
Abhängigkeiten dafür installieren
sudo apt-get install bison flex
Kernel-Quellen herunterladen
$uname -a
$mkdir -p ~/src
$cd ~/src
$wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-$KERNEL.tar.gz
$tar xvzf linux-$KERNEL.tar.gz
RT-Patch. Suche in https://www.kernel.org/pub/linux/kernel/projects/rt
Die Zahl "4.4" muss ggf. noch angepasst werden.
Herunterladen und entpacken:
$wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/patch-$RTPATCH.patch.gz
$gzip -d patch-$RTPATCH.patch.gz
Patch anwenden: http://linux-sxs.org/upgrading/patching.html
$cd linux-$KERNEL
$cat ../patch-$RTPATCH.patch | patch -p1
Konfigurieren: Option "5" wählen (Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL)). Den Rest auf Standard lassen (Enter gedrückt halten)
$cp /boot/config-$(uname -r) .config && make oldconfig
Setze parameter CONFIG_MODULE_SIG = No
$nano .config
Bauen: https://wiki.ubuntuusers.de/Kernel/Kompilierung/
Abhängigkeiten installieren:
$sudo apt-get install libssl-dev kernel-package
Kompilieren
$sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion
$make-kpkg clean
$CONCURRENCY_LEVEL=$(getconf _NPROCESSORS_ONLN) fakeroot make-kpkg --initrd --revision=0 kernel_image kernel_headers
Installation
$sudo dpkg -i ../linux-{headers,image}-$RTPATCH_*.deb
Anpassen der Werte: https://wiki.ubuntuusers.de/GRUB_2/Konfiguration/#Bedeutung-der-Variablen
$sudo nano /etc/default/grub
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
Übernehmen
$sudo update-grub
Anschließend kann in den RT-Kernel geboot werden (Auswahl des Eintrags im GRUB-Menü)
Namen des Boot-Eintrags herausfinden: Suche nach Stichwort "-rt"
$nano /boot/grub/grub.cfg
Liefert (z.B.): "Ubuntu, with Linux 4.19.106-rt45". Einsetzen in Grub-Eintrag (englische Lokalisierung vorausgesetzt):
GRUB_DEFAULT="Previous Linux versions>Ubuntu, with Linux 4.19.106-rt45"
Testweise übernehmen:
$sudo update-grub
Liefert (in diesem Beispiel):
Warning: Please don't use old title `Previous Linux versions>Ubuntu, with Linux 4.19.106-rt45' for GRUB_DEFAULT, use `Advanced options for Ubuntu>Ubuntu, with Linux 4.19.106-rt45' (for versions before 2.00) or `gnulinux-advanced-1c2a0fb0-7a54-456d-8c60-830a6ed6feac>gnulinux-4.19.106-rt45-advanced-1c2a0fb0-7a54-456d-8c60-830a6ed6feac' (for 2.00 or later)
Neuen korrekten Wert eintragen (für dieses Beispiel):
GRUB_DEFAULT="gnulinux-advanced-1c2a0fb0-7a54-456d-8c60-830a6ed6feac>gnulinux-4.19.106-rt45-advanced-1c2a0fb0-7a54-456d-8c60-830a6ed6feac"
Übernehmen
$sudo update-grub
Anschließend wird automatisch in den Echtzeit-Kernel gebootet (Keine manuelle Auswahl des Eintrags im GRUB-Menü erforderlich).
$sudo reboot now
Nutzerrechte setzen
$sudo addgroup realtime
$sudo adduser ec realtime
Prioritäten
$sudo nano /etc/security/limits.conf
Eintragen der folgenden Zeilen.
@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 102400
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 102400
Energiesparmodi deaktivieren
$sudo apt-get install sysfsutils
CPU-Frequenz und -energieverhalten https://wiki.ubuntuusers.de/Prozessortaktung/
Anzahl CPUs bestimmen:
$ls /sys/devices/system/cpu/ | grep cpu
Konfiguration bearbeiten:
$sudo nano /etc/sysfs.conf
Füge in Datei ein (Anpassung an tatsächliche Anzahl CPUs)
devices/system/cpu/cpu0/cpufreq/scaling_governor = performance
devices/system/cpu/cpu1/cpufreq/scaling_governor = performance
devices/system/cpu/cpu2/cpufreq/scaling_governor = performance
devices/system/cpu/cpu3/cpufreq/scaling_governor = performance
devices/system/cpu/cpu4/cpufreq/scaling_governor = performance
devices/system/cpu/cpu5/cpufreq/scaling_governor = performance
devices/system/cpu/cpu6/cpufreq/scaling_governor = performance
devices/system/cpu/cpu7/cpufreq/scaling_governor = performance
Kernel-Argumente für CPU
$sudo nano /etc/default/grub
In Zeile GRUB_CMDLINE_LINUX_DEFAULT ergänzen:
processor.max_cstate=1 idle=poll
Aktualisieren
$sudo update-grub
Die folgenden Quellen bieten einen Einstieg in ein tieferes Verständnis der Echtzeit-PC Konfiguration: