Howto: Audio kernel with RealTime Preemption
For an English version please visit jacklab.net. thx oc2pus for translating :) Da dank AudioProLinux, oc2pus und }-Tux-{ das Projekt jacklab.net ins Leben gerufen wurde, und unsere apt-spezis oc2pus & }-Tux-{ eine ganze Menge rpm's für professionelle Audiobearbeitung erstellt haben (zu finden in http://ftp.gwdg.de/pub/linux/misc/suser-oc2pus bzw http://ftp.gwdg.de/pub/linux/misc/suser-tux ) soll an dieser stelle ein kleines HowTo entstehen, wie man sein System zur AudioWorkstation "umfunktioniert". Bei Audiobearbeitung ist der entscheidende Punkt die Latenz, sprich die Verzögerung vom Zeitpunkt der Entstehung eines Signales bis es beim System "ankommt" (beispielsweise Tastendruck auf MIDI-Keyboard bis er hörbar ist). Der Standard-Kernel hat den Nachteil dass er im Vergleich zu Windows oder gar Mac wesentlich langsamer ist (~11ms). Je schneller das System, sprich je kürzer die Latenz, desto mehr kann man mit dem System zeitgleich machen (mehrere Synths etc). Es gibt ein Projekt von Redhat Developer Ingo Molnar und Kollegen, dessen Bestreben es ist die Latenz von Linux auf ein Minimum zu reduzieren: Realtime Preemption Gute Audiohardware vorausgesetzt, erreicht man damit Latenzzeiten < 1ms, damit schneller als ein durchschnittlicher Mac. Für Interessierte und Bastelwütige nun also ein kleines step-for-step Howto wie man sich einen "vanilla" kernel von kernel.org mit Realtime Preemption patcht und diesen kompiliert Anmerkung: Im Vergleich zum derzeit aktuellen kernel von SuSE 9.2 verliert man dabei support für folgendes: - das reiser4 filesystem (welches für audio eh denkbar ungeeignet ist) - lirc (IR fernbedienung) - submount (eh überflüssig, suse 9.2 kommt mit udev, daher: hal/dbus/ivman für automounting, man kann aber subfs auch nachträglich bauen, dazu muss der neue kernel bereits laufen, siehe "Kernelhowto" hier im board) - ein paar ipv6 sachen und noch andere kleinigkeiten Beispiel-Kernel ist der aktuell stabile 2.6.11.7. 1. Kernel Source und patches herunterladen als user in einem beliebigen Verzeichnis: | Code: | # Herunterladen des aktuellen vanilla kernels wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.11.7.tar.bz2 # den passenden Realtime Preemption patch dazu wget http://people.redhat.com/mingo/realtime-preempt/older/realtime-preempt-2.6.11-final-V0.7.40-04 # und noch den realtime-lsm patch, um als user mit realtime prio arbeiten zu können (aus -mm broken-out) wget http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.11/2.6.11-mm4/broken-out/rt-lsm.patch # wer den bootsplash nicht missen möchte: wget http://www.bootsplash.de/files/bootsplash-3.1.4-2.6.11.diff | 2. Entpacken und Patchen des Kernels | Code: | cd /usr/src/linux su <passwort> tar xvjf /pfad/zu/linux-2.6.11.7.tar.bz2 mv linux-2.6.11.7 linux-2.6.11.7-realtime cd linux-2.6.11.7-realtime patch -p1 < /pfad/zu/realtime-preempt-2.6.11-final-V0.7.40-04 patch -p1 < /pfad/zu/rt-lsm.patch patch -p1 < /pfad/zu/bootsplash-3.1.4-2.6.11.diff | Man beachte dass beim patchen von realtime-preemption am ende ein "FAILED" zu sehen sein wird. Davon lassen wir uns nicht weiter stören! Grund ist dass der patch im Makefile mit 2.6.11 rechnet, allerdings heißt er tatsächlich 2.6.11.7 Dann geben wir unserem Kernel einen eigenen Namen: ..hängen an die EXTRAVERSION=.7 etwas dran ala -realtime und speichern das. 3. Konfiguration des Kernels zunächst "klonen" wir die config des laufenden Kernels, um sicherzustellen, dass danach auch alles weiter funktioniert: | Code: | | zcat /proc/config.gz > .config | und nehmen dann ein paar Einstellungen vor: wer es lieber etwas graphischer haben möchte kann xconfig verwenden: | Code: | # als user xhost + su <pw> make xconfig | die für Realtime Preemption relevanten Einstellungen sind hier: | Code: | Processor type and features ---> Preemption Mode (Complete Preemption (Real-Time)) ---> ( ) No Forced Preemption (Server) ( ) Voluntary Kernel Preemption (Desktop) ( ) Preemptible Kernel (Low-Latency Desktop) (X) Complete Preemption (Real-Time) | bei default SuSE kernel sollte man noch folgendes deaktivieren (sonst verweigert MuSE den Dienst) | Code: | Device Drivers ---> Character devices ---> [ ] HPET Control RTC IRQ | Einem Tip von drumfix folgend nehmen wir noch folgende Einstellungen vor: Im Falle einer x86 CPU | Code: | Power management options (ACPI, APM) ---> [*] Power Management support ACPI (Advanced Configuration and Power Interface) Support ---> [*] ACPI Support | Der Rest bleibt oder wird deaktiviert. Dann schalten wir noch das USB HID polling aus. | Code: | Device Drivers ---> USB support ---> < > USB Human Interface Device (full HID) support USB HID Boot Protocol drivers ---> < > USB HIDBP Keyboard (simple Boot) support < > USB HIDBP Mouse (simple Boot) support | realtime-lsm aktivieren (WICHTIG: das MUSS als Modul <M> gebaut werden ): | Code: | Security options ---> <M> Realtime Capabilities | Eine zusätzliche Optimierung bringt die Auswahl des passenden Prozessortyps in "Processor type and features", Athlon/Duron/K7 zB. Generic x86 kann man dann abschalten. Mit "Exit" verlassen und speichern wir das. 4. Kompileren und Installieren des Kernels Nun wird der Kernel kompiliert und die Module installiert: | Code: | | make && make modules_install | Das kann bei der default SuSE config, welche wir geklont haben, ein Weilchen dauern. Wenn fertig, kopieren wir den Kernel nach /boot (dabei vergeben wir den Namen, den wir in EXTRAVERSION weiter oben definiert haben). Der bestehende Kernel wird dabei nicht angerührt, also keine Sorge! Sollte der neue Kernel wider erwarten nicht booten, hat man den alten zur Sicherheit noch da | Code: | cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.11.7-realtime cp System.map /boot/System.map-2.6.11.7-realtime | Eine initrd brauchen wir auch noch: | Code: | cd /boot mkinitrd -k vmlinuz-2.6.11.7-realtime -i initrd-2.6.11.7-realtime | 5. Anpassen des Bootloaders Zuletzt passen unseren Bootloader an: | Code: | | vi /boot/grub/menu.lst | Hier kopieren wir den Eintrag des alten Kernels und editieren diesen , sodass er auf den neuen Kernel passt. (kernel und initrd) 6. Beten und Booten Zu realtime-lsm: das modul muss man extra laden, mit der option "gid=<id der audio gruppe>" zB: | Code: | | modprobe realtime gid=18 | (richtige gid nummer verwenden!) Greets! gimpel
|