Linux 2.6 in Echtzeit - Wie ein Kernel mit geringen Latenzen gebaut wirdHOWTO Kernel 2.6 Realtime SystemDieser 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. 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 Dinge2.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 KernelsFü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 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 dmesgund 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 -nbei 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 --> 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) 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. ALSAUm 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 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 InstallationDer folgende Befehl zeigt die verfügbaren Soundkarten nach erfolgreicher Installation. cat /proc/asound/cards 0 [I82801DBICH4 ]: ICH4 - Intel 82801DB-ICH4 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 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/realtimeeinfü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 Ein beherztes sudo shutdown -r nowstartet den Rechner neu. GlossarLinksJack: http://jackit.sourceforge.net/ |
SuchelanguageThemen |
wie startest du jackd mit us-122. Ich habe schon ausführlich gegoogelt aber nichts brauchbares gefunden. Auch mit der Datei .asoundrc komme ich nicht so klar. Über einen Tipp würde ich mich riesig freuen.
Ich habe übrigens Debian unstable mit kernel 2.6.16
Viele Grüße
Ralf
/usr/bin/jackd -R -P60 -p64 -t5000 -dalsa -r44100 -p256 -n4 -D -Chw:1 -Phw:1 -s -S -i2 -o2
"Chw:1" spezifiziert die Soundkarte über die aufgenommen werden soll, "Phw:1" wählt die Soundkarte zum Abspielen aus.
Auf die Datei "~/.asoundrc" kannst du IMHO verzichten.
Leider ist die Benachrichtigung über deinen Kommentar bei mir in den Spamfiltern hängengeblieben. Erst heute habe ich deine Frage gelesen.
Nico