HOWTO Kernel 2.6 Realtime System
Dieser Artikel wurde vor mehr einem Jahr geschrieben und ist aus diesem Grund in einigen Punkten nicht mehr aktuell. Ein guter Einstiegspunkt für Benutzer, die aktuelle Informationen benötigen und der englischen Sprache mächtig sind, ist das Realtime Wiki.
Echtzeitanwendungen wie Jack, Ardour oder Muse zeigen wie zielstrebig Linuxapplikationen in den professionellen Audio- und Videobereich vordringen. Diese Programme sind davon abhängig, dass sie zu bestimmten Zeitpunkten Rechenzeit auf dem Prozessor bekommen, um ihre Aufgaben abzuarbeiten. Der offizielle Kernel (auch als vanilla-kernel bezeichnet) von www.kernel.org ist hinsichtlich seiner Echtzeitfähigkeit für Musikanwendungen verbesserungsfähig.
Dieser Artikel beleuchtet die zu Grunde liegende Systemkonfiguration.
Als Distribution dient ein Gentoo Linux in Kernelversion 2.6.14.6 mit Ingo Molnars Realtime Erweiterung. Das ganze läuft auf einem Centrino Laptop (Bullman VK Model CL50-15 / CL-50) mit dem USB Soundmodul US-122 von Tascam.
Diese Beschreibung ist nicht fertig und die schnelle Entwicklung in Kernel und Anwendungen wird sie schnell alt aussehen lassen. Wenn der geneigte Leser Fehler entdeckt oder etwas nicht versteht, erwarte ich einen Kommentar.
Stand der Dinge
2.6.
Der Aufbruch in die Welt der multimedialen Echtzeitverarbeitung unter Linux begann im Jahr 2000 mit einem
Aufruf einiger Multimedia Entwickler an die Kernelentwickler. Sie forderten für ihre Programme ein Betriebsystem als Grundlage, das Latenzen von mindestens 2-3ms garantieren können sollte. Entgegen hehrer Hoffnungen änderte sich am Echtzeitverhalten des Kernels lange Zeit nichts.
Inzwischen lassen sich allerdings hochperformante Desktopsysteme mit geringen Latenzen zaubern. (Kernelversionen ≥2.6.12)
Andrew Mortons Präemptiver Realtime Patch (Installation unten beschrieben) verhilft Linux zu sehr guten Werten im 1-2ms Bereich für die interne Soundkarte meines Laptops. Die US-122 beschleunigt auf 10,7ms (jackd: SR 48K, 128 Frames/Period, Buffer 4 Periods).
Diese schlechten Werte für die externe Soundkarte lassen sich mit der Prioritisierung der Interruptzuweisung durch das Betriebssystem lösen. Davon profitieren natürlich auch interne PCI Soundkarten. Zwei Lösungen zur automatischen Prioritätszuweisung sind mir bekannt:
Zunächst das
rtirq Skript von Rui Nuno Capela. Eine andere Lösung bietet der
irqbalance daemon.
RT Linux
Noch ein Wort zu Latenz. Linuxderivate, die harten Echtzeitanforderungen bis in den μs Bereich gerecht werden, zielen auf industrielle Anwendungen und den Einsatz als eingebettete (
embedded) Systeme. Unter
Variants auf
http://www.realtimelinuxfoundation.org/ werden verschiedene Geschmacksrichtungen verlinkt.
Von Kernelentwicklern wie Linus Torvalds wurde dieser Weg schnell verworfen, denn nicht nur Gerätetreiber hätten neu geschrieben werden müssen.
Der Sprung des Antwortverhaltens in der Größenordnung einer Zehnerpotenz wie ihn RT Linux realisiert, ist auch nicht notwendig, um dem Anwender das Gefühl eines in Echtzeit reagierenden Systems zu vermitteln. Das zeitliche Auflösungsvermögen des Gehörs für Impulse liegt bei ~15ms. Selbst dem geübtesten Tonmeister oder Musiker dürfte eine Verzögerung von 1-2ms nicht auffallen. Immerhin wohnt dem etablierten
MIDI Standard eine Latenz von 1ms pro Note(!) inne.
Neben der Konfiguration des Kernels gibt es noch andere
Schrauben im PC, an denen geschraubt werden sollte. Die Festplatte, das Dateisystem, die Interruptverteilung der Hardwarekomponenten und deren PCI Latenzen. Auf die gehe ich hier noch nicht ein.
Konfiguration des Kernels
Für meine Konfiguration habe ich mir auf
www.de.kernel.org/pub/linux/kernel/v2.6/ den 2.6.14.6 heruntergeladen. (Im Makefile
Affluent Albatross benannt.) Als Realtime Patch habe ich den dazugehörigen
patch-2.6.14-rt22 gewählt. Nach den folgenden Schritten liegen die gepatchten Realtime Kernelquellen im Verzeichnis /usr/src/linux:
cd /usr/src
su root
#passwort#
tar xvzf /pfad/zu/linux-2.6.14.6.tar.gz
mv linux-2.6.14.6 linux-2.6.14.6-realtime
ln -si linux-2.6.14.6-realtime linux
cd linux
patch -p1 < /pfad/zu/patch-2.6.14-rt22
Als nächstes muss der Kernel konfiguriert und damit auf den eigenen PC zugeschnitten werden. Dazu braucht man genaue Informationen zu den Hardwarekomponenten des Rechners. Die Ausgaben von
dmesg
und
lspci -v (als root)
geben wichtige Hinweise zu den verbauten Chips und dem Status der Hardwareerkennung.
Um schnell die richtigen Module für die vorhandene Hardware zu finden, kann man die Ausgabe von
lspci -n
bei diesem
Webdienst einfügen und erhält eine Liste der zuständigen Module.
In den meisten Fällen ist es eine gute Idee die Konfiguration des aktuell laufenden Kernels als Ausgangspunkt für Optimierungen zu nehmen.
Die Grundeinstellungen des laufenden Kernels werden übernommen und das Kernelkonfigurationsprogramm wird gestartet:
zcat /proc/config.gz > .config
make menuconfig
-->
General setup
DEBUG_DEADLOCKS nicht anwählen
Frei wählbarer Appendix für den erzeugten Kern. Ich wähle hier eine Kombination mit einem Datum.
CONFIG_LOCALVERSION="-realtime-04.02.2006"
Wichtig für
Jack.
CONFIG_SHMEM=y
Processor type and features
passenden Prozessor wählen und
CONFIG_X86_GENERIC NICHT anwählen
Ich habe MIDI und/oder Muse noch nicht gebraucht oder ausprobiert, doch habe ich gelesen, dass der folgende Parameter Probleme verursachen kann. Also gegebenenfalls auf
no setzen:
CONFIG_HPET_TIMER=y [n?]
Aktiviert den Patch
CONFIG_PREEMPT_RT=y
CONFIG_PREEMPT=y
CONFIG_PREEMPT_SOFTIRQS=y
CONFIG_PREEMPT_HARDIRQS=y
CONFIG_PREEMPT_BKL=y
CONFIG_PREEMPT_RCU=y
Firmware Drivers
CONFIG_HZ_1000=y
CONFIG_HZ=1000
Power Management Options ACPI und CPUFreq
..machen bei mir keine Probleme. Sind darum als Modul kompiliert.
Auf einem reinen Audiosystem haben sie im Zweifelsfall allerdings nichts zu suchen.
Pseudo Filesystems
Wichtig für
Jack.
CONFIG_TMPFS=y
Sound
Da die Soundtreiber im Kernel meist älter sind, habe ich mich entschieden die Soundtreiber nicht aus den Kernelquellen heraus zu erzeugen. Gentoo bietet mit dem ebuild
media-sound/alsa-driver neuere und damit hoffentlich besser auf meine Hardware abgestimmte Treiber an. Ausserdem kann ich so schneller mal die Soundtreiber aktualisieren ohne gleich den ganzen Kernel upzudaten.
Die Soundunterstützung im Kernel muss trotzdem angeschaltet werden, auch wenn die Module später von woanders kommen.
CONFIG_SOUND=y
Kernel Hacking
Allgemein nützlich, wenn neueste Entwicklungen wie gepatchte Kernel eingesetzt werden: Ermöglicht in fast jeder Situation, das System sicher herunterzufahren. Der Dreiklang
[AltGr][Druck/S-Abf] + "s", + "u" und +"b"
synchronisiert die eingebundenen Dateisysteme, mountet sie schreibgeschützt und fährt das System neu hoch. Mehr dazu in den Kernelquellen unter /usr/src/linux/Documentation/sysrq.txt.
CONFIG_DEBUG_KERNEL=y
CONFIG_MAGIC_SYSRQ=y
Security options
Dieses Modul (realtime-lsm) ermöglicht es, Programme, die Echtzeitansprüche stellen, mit höchstmöglicher Priorität auszuführen.
siehe
Wichtig ist, dass die SECURITY_CAPABILITIES als Modul eingebunden werden soll, wie im Folgenden angegeben.
Enable different security models=y
SECURITY_CAPABILITIES=m
IO Schedulers
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_AS=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
Save sichert die Konfiguration nach
.config
Der nächste Schritt kompiliert den Kern und die Module und installiert alles nötige unter /boot, nicht ohne eine Sicherungskopie des alten Kernels zu erstellen.
make && make modules_install && make install
Nach diesem Schritt sollte die Datei grub.conf angepasst werden und um den Eintrag ergänzt werden, der den gerade laufenden Kernel zur Not wieder starten kann.
Ein Ausschnitt aus meiner
grub.conf, die Partitionsangaben der root Partition und der boot Partition müssen natürlich angepasst werden:
nano -w /boot/grub/grub.conf
hinzufügen
title Affluent Albatross (2.6.14.6-realtime)
root (hd0,5)
kernel (hd0,4)/vmlinuz-2.6.14.6-realtime-04.02.2006 vga=4
# Alter Kernel (von make install automatisch mit der Endung .old versehen)
title Alter Kern
root (hd0,5)
kernel (hd0,4)/vmlinuz-2.6.x.old vga=4
Jetzt sollte mit dem neuen Kern gebootet werden. Die Ausgaben während der Bootphase sollte man gewissenhaft verfolgen. Die Hardware des Rechners sollte erkannt werden.
Fehler, die beim Laden von Soundmodulen und anderen extern eingebundenen Kernelmodulen auftreten, können getrost ignoriert werden und sollten nach den folgenden Schritten nicht mehr auftauchen.
ALSA
Um nicht alle ALSA Module zu kompilieren, die angeboten werden, wird /etc/make.conf editiert und die Variable ALSA_CARDS eingefügt.
Mein Laptop hat einen Soundchip von Intel auf dem Board, das Modul dafür heisst
intel8x0, das US-122 wird durch das Modul
usb-usx2y bedient. Die MIDI Unterstützung des US-122 wird über das usb-audio Modul geregelt, auf dessen Konfiguration ich zu einem späteren Zeitpunkt eingehen möchte.
nano -w /etc/make.conf
hinzufügen:
ALSA_CARDS="intel8x0 usb-usx2y usb-audio"
Das US-122 benötigt neben dem Treiber das ALSA Firmware Paket mit Hotplug Skripten und dem Programm
usx2yloader:
emerge media-sound/alsa-firmware
Installieren des ALSA Moduls und der gewünschten Treiber
emerge media-sound/alsa-driver
Konfiguration von ALSA
nano -w /etc/modules.d/alsa
Meine Konfiguration beschränkt sich auf die folgenden Zeilen (ohne OSS Emulation):
## ALSA portion
alias char-major-116 snd
alias snd-card-0 snd-intel8x0
alias snd-card-1 snd-usb-usx2y nrpacks=1
options snd-usb-usx2y index=1
Das US-122 versteckt sich hinter der letzten Zeile. Wichtig für die Latenz ist der Parameter
nrpacks. Ohne eine Angabe steht dieser Wert auf 4. Geringe Latenzen lassen sich erst mit dem Umschalten in den USB Raw Modus verwirklichen. Das geschieht hiermit.
Als zusätzliche Option wird dem US-122 Treiber der Soundkartenindex mitgegeben. Damit ist gewährleistet, dass man die Soundkarte über den gewählten Index ansprechen kann. Ohne diese Option kann es leicht passieren, dass die Soundkarte nach dem Booten auf einem anderen Index zu finden ist.
Die Treiber sollen beim Start automatisch geladen werden:
echo "snd-usb-usx2y" >> /etc/modules.autoload.d/kernel-2.6
Nicht immer funktioniert das automatische Laden der Firmwaredaten auf das US-122. In diesem Fall hilft der Aufruf des Firmwareloaders. Dies kann als normaler Benutzer geschehen.
usx2yloader
Jetzt sollte der USB Indikator am Gerät leuchten und das Gerät betriebsbereit sein.
Überprüfen der ALSA Installation
Der folgende Befehl zeigt die verfügbaren Soundkarten nach erfolgreicher Installation.
cat /proc/asound/cards
0 [I82801DBICH4 ]: ICH4 - Intel 82801DB-ICH4
Intel 82801DB-ICH4 with ALC202 at 0xf0000400, irq 11
1 [USX2Y ]: USB US-X2Y - TASCAM US-X2Y
TASCAM US-X2Y (1604:8007 if 0 at 002/003)
Unter Verzicht auf die ALSA Konfigurationsdatei
.asoundrc im Heimatverzeichnis des Benutzers, ist die interne Soundkarte auf dem ALSA Device "hw:0", das US-122 auf dem Device "hw:1" zu erreichen. Dieser direkte Weg zur Soundkarte ist dem Zugriff über ein in
.asoundrc definiertem Device vorzuziehen.
Realtime-LSM (Linux Security Modul)
Anmerkung: Die Lösung der Rechtezuweisung für den Echtzeitzugriff auf Systemressourcen über das realtime-lsm Modul ist als "depreciated" (abgelehnt) gekennzeichnet und wird zur Zeit durch die kernelinterne Lösung rtlimit abgelöst. Nichtsdestotrotz beschreibe ich hier die Installation mit Hilfe des realtime-lsm Moduls. (Bis ich Zeit habe, die rtlimits Lösung zu installieren.)
Um Soundprogramme als normaler Benutzer mit Echtzeitprivilegien starten zu können, braucht es das Realtime-lsm Modul. Im Portagetree von Gentoo ist es maskiert. Die Maskierung wird aufgehoben, dann wird es normal kompiliert.
echo "sys-apps/realtime-lsm ~x86" >> /etc/portage/package.keywords
emerge sys-apps/realtime-lsm
echo "realtime" >> /etc/modules.autoload.d/kernel-2.6
Modulkonfiguration:
Alle Benutzer einer angegebenen Gruppe bekommen das Recht Echtzeitprozesse mit der nötigen hohen Priorität laufen zu lassen.
Gruppe 18 ist bei mir die Gruppe
audio. Mein Benutzeraccount ist Gruppenmitglied.
nano -w /etc/modules.d/realtime
einfügen
options realtime gid=18 mlock=1
Die ALSA Module und das Echtzeit Sicherheits Modul sind jetzt auf dem neuesten Stand. Da bei mir auch noch andere Module benötigt werden, z.B. Treiber für WLAN und diese auch neu kompiliert werden müssen, wenn ich die Kernelversion wechsle, verhilft mir der folgende Befehl zu einem aktuellen System.
Nicht aktuelle Module werden automatisch neu gebacken und damit unter dem neuen Kernel nutzbar. Die erste Zeile installiert das benötigte Dienstprogramm,
populate sammelt Module, die gerade Treiber in den Kernel integrieren und die letzte Zeile stößt die Kompilation der nötigen Module an:
emerge sys-kernel/module-rebuild
module-rebuild populate
module-rebuild rebuild
Ein beherztes
sudo shutdown -r now
startet den Rechner neu.
Glossar
Latenz
Overdub Verfahren
Links
Jack: http://jackit.sourceforge.net/
JackGUI QJackCtl
Ardour: http://www.ardour.org/
Muse: http://www.muse-sequencer.org
Der Brief zu Niedriglatenz und Linux: http://groups.google.de/group/fa.linux.kernel...
Tascam US-122: http://www.tascam.de/us-122.html
Gentoo: http://gentoo.org
Das Pro Audio Overlay für Gentoo hat jetzt ein englischsprachiges WiKi online. Die Liste der verfügbaren Pakete (ebuilds) ist lang. Sie umfasst professionell zu nutzende Software, einen angepassten Betriebssystemkern und andere Dinge, die Gentoo von Ha
Tracked: May 17, 00:07