• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[HowTo] Audio Special: Realtime Kernel unter SuSE (u.a.)

Gimpel

Guru
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/jacklab/ ) 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:
Code:
vi Makefile
..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:
Code:
make menuconfig
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:
zunächst muss das modul commoncap geladen werden:
Code:
modprobe commoncap
dann realtime, mit der option "gid=<id der audio gruppe>"
zB:
Code:
modprobe realtime gid=18
(richtige gid nummer verwenden! id <username hilft)


Greets!
gimpel
 

oc2pus

Ultimate Guru
Geschichte wird gemacht .. es geht voran ....

suuper HowTo wie immer, kurz knapp und präzise ...
... und funzt ;)

P.S. vergess den }-Tux-{ nicht, er baut alle RPMs für SuSE-9.1 und stellt sie in seinem apt-Repository zur Verfügung (suser-tux)
 
OP
Gimpel

Gimpel

Guru
oc2pus schrieb:
Geschichte wird gemacht .. es geht voran ....

suuper HowTo wie immer, kurz knapp und präzise ...
... und funzt ;)

P.S. vergess den }-Tux-{ nicht, er baut alle RPMs für SuSE-9.1 und stellt sie in seinem apt-Repository zur Verfügung (suser-tux)

ewps, kommt gleich dazu ;)

bin grad am rumfrickeln wie man daraus ein rpm samt initrd & co baut. also is das howto eher für "early adopters" und bastler gedacht :)
 
A

Anonymous

Gast
Ahh geil.. Ihr seid die grössten :) Die besten, die schlausten.

Gimpel, wie unglaublich schnell du das gebacken gekriegt hast, wenn ich an deine "a ****** business" Allergie denke.

Die Einführung ist 1a geschrieben, den Rest spar ich mir erstmal.
Weil ich ja den fertigen Kernel teste ;)

Absolut erfreut :lol:

Michael APL
 
A

Anonymous

Gast
Hi Gimpel,
Drumfix hat uns/dir im audio4linux-Forum folgenden Tipp gegeben:

Kleiner Nachtrag für euer Tutorial:

1. xconfig statt menuconfig nehmen, weils besser aussieht Smilie
2. Wenn man ein Motherboard mit Intelchipsatz hat:
ACPI aktivieren, aber alle Optionen drunter (wie Lüfterkontrolle etc.)
abschalten. Ebenso die Unterstützung für USB HID Devices
(USB Maus/Keyboard).
Ansonsten wird die CPU periodisch für ne volle halbe Millisekunde
angehalten, was dann zu Aussetzern führen kann.

Dann gehen selbst Latenzen von 16 Samples@44,1KHz, also rund
ner 1/4 Milisekunde, falls die Soundkarte das kann.

Gruss Drumfix

Vielleicht kannst du damit ja was anfangen... aber 16 Samples, das waren die 0,7ms... ;)

gruss
Michael APL
 
OP
Gimpel

Gimpel

Guru
oha! ok, wird gemacht, was acpi und usb hid angeht :) THX drumfix, jegliche weitere tips sind willkommen!

ob xconfig oder menuconfig bleibt jedem selbst überlassen, ich bevorzuge menuconfig, schon wegen der easy suchfunktion /rtc zB.

Heute erwartet dich ja noch der alsa-cvs und possible c-port midi fix Test, hehe ;)
 

oc2pus

Ultimate Guru
Code:
--- linux/Makefile.orig
+++ linux/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 11
-EXTRAVERSION =
+EXTRAVERSION = -RT-V0.7.40-04
 NAME=Woozy Numbat

an dieser Stelle musst du
SUBLEVEL = 11.7 oder
SUBLEVEL = 11
EXTRAVERSION = 7
setzen.
Dann könnte der Patch fehlerfrei durchlaufen ...
... das ist wichtig für ein SPEC File um ein RPM zu bauen, da der %patch Tag FEHLERFREI durchlaufen muss ...

könntest du das mal probieren ? Evtl erstellen wir dann einen Patch gegen den preempt-patch *fg*
 
OP
Gimpel

Gimpel

Guru
ich werde den gesamten patch gegen 2.6.11.7 re-diffen, damit keinerlei hunks/fails auftauchen, sollte dann kein problem sein, oder? ;)

haben gestern noch alsa-cvs und einen patch von der alsa-dev liste und den bootsplash (wir brauchen ein logo ;)) "reinmassiert", also ist denke ich ein großer patch gegen 2.6.11.7 das beste oder?!

alsa-cvs sollte aber ausgiebig getestet werden, das ist dünnes eis unter umständen! aber wenn damit diese c-port midi sache funzt, isses das wert :)
 

oc2pus

Ultimate Guru
Gimpel schrieb:
ich werde den gesamten patch gegen 2.6.11.7 re-diffen, damit keinerlei hunks/fails auftauchen, sollte dann kein problem sein, oder? ;)
jaaaa, so will ich das ;)

Gimpel schrieb:
haben gestern noch alsa-cvs und einen patch von der alsa-dev liste und den bootsplash (wir brauchen ein logo ;)) "reinmassiert"
da muss Audio Pro Linux ran *fg*

Gimpel schrieb:
also ist denke ich ein großer patch gegen 2.6.11.7 das beste oder?!
yepp,
kiss-Prinzip ==> keep it so simple ... not gimpel ;)

Gimpel schrieb:
alsa-cvs sollte aber ausgiebig getestet werden, das ist dünnes eis unter umständen! aber wenn damit diese c-port midi sache funzt, isses das wert :)
wow, staun ...
 
OP
Gimpel

Gimpel

Guru
oc2pus schrieb:
Gimpel schrieb:
also ist denke ich ein großer patch gegen 2.6.11.7 das beste oder?!
yepp,
kiss-Prinzip ==> keep it so simple ... not gimpel ;)

ROFL!!

[edit]patches off again ;)[/edit]

P.S.

btw, was haltet ihr davon noch etwas zu optimieren, sprich jeweils eine config für athlon, pentium4, smp und x86_64? damit könnte man noch ein bisschen was "rauskitzeln" an gesamt-performance...
das würde halt 4 rpm's bedeuten *duck*
 

oc2pus

Ultimate Guru
Gimpel schrieb:
btw, was haltet ihr davon noch etwas zu optimieren, sprich jeweils eine config für athlon, pentium4, smp und x86_64? damit könnte man noch ein bisschen was "rauskitzeln" an gesamt-performance...
das würde halt 4 rpm's bedeuten *duck*
öhm, dafür gibt es doch die nosrc.rpm ;)

also nur patches und Bauanleitung (spec-file);
den vanilla-kernel-source-tar.gz downloaden kann sich jeder selber ... spart Platz und wie aus einem nosrc.rpm ein rpm wird ist schnell erklärt.
 
OP
Gimpel

Gimpel

Guru
alles klar! fein fein!

alsa-cvs macht mich grad nieder, compile errors ohne ende...
wenn du also vorhin den patch gezogen haben solltest.. einfach löschen *gg*

bin mal weg bis montag, dienstag. cya! :)
 
A

Anonymous

Gast
ich hab mal so erste sehr rohe ideen für bootscreens gemacht -

Unten der Spruch müsste vielleicht heissen: "still based on SuSE (A Novell Business) Linux"

boot-green-sm.jpg


boot-modular_sm.jpg



gimpel hat folgendes genervt gesagt:
alsa-cvs macht mich grad nieder, compile errors ohne ende...

gimpel, klar, wahrscheinlich ist das alsa cvs nicht geeignet, in den stabil laufenden kernel zu kommen. Es geht ja erstmal nur um eine Midischnittstelle. Darum: Dann müssen die Anwender des dsp2000 c-port halt weiter in die Röhre gucken. Dafür gibt es jede Menge preiswerte gutlaufende usb-midi Geräte als alternative und ansonsten, mit rcalsasound restart lässt es sich auf der audioebene (10 I/0) immer initialisieren und funktioniert tadelos. es ist nur eine kleine jämmerliche Midischnittstelle.
Es ist zwar nicht toll, aber verschmerzbar.
Der kernel läuft so schon ganz geil. Dann ist halt "ALSA schuld".Der bug ist jetzt schon 3 jahre bekannt und vielleicht ist es eines der unlösbaren Geheimnisse des Universums.

Zum Wochenende mache ich einen Finalen Test mit Doku, so zum "Schwänzevergleichen" wer hat den schnellsten... ;)
Code:
booting the kernel...

gruss
Michael APL
 
OP
Gimpel

Gimpel

Guru
YEAH! sieht gut aus! vor das novell müsste noch ein "godamn" :p :)

bedenke man braucht 2 images, eines für den silent mode, und eines für verbose, wenn man beim booten f2 drückt.

mit alsa-cvs is ja nich wild, hehe, wenn ich nur das drin lasse was ich auf meiner kiste brauch, null probs. abr egal, fliegt raus!

Zum Wochenende mache ich einen Finalen Test mit Doku, so zum "Schwänzevergleichen" wer hat den schnellsten... Wink
Code:
booting the kernel...
ROFL!! ok, fein fein!
denn mal bis montag!
 
A

Anonymous

Gast
Gimpel schrieb:
# und noch den realtime-lsm patch, um als user mit realtime prio arbeiten zu können (aus -mm broken-out)
.6.11-mm4/broken-out/rt-lsm.patch

Leider geht aus dem ansonsten vorbildlich geschriebenen Tutorial nicht hervor wie man den Realtime LSM im Kernel aktiviert und dann als User zB mittels "qjackctl" jackd erfolgreich starte.

Gehe ich nach anleitung sagt jackd:
JACK: unable to mlock() port buffers: Cannot allocate memory

Was nichts anderes bedeutet das realtime-lsm nicht aktiviert ist.

Jetzt haben wir den schnellsten kernel aber kein User kann ihn benutzen....

Ich habe allerdings eine Vermutung nach studieren das Quelltextes von rt-lsm: es wird etwas im Bereich "Security options" angelegt -> dort gibt es eine Option "Realtime Capabilities".
Ich vermute schwer das wenn man die anschaltet könnte es das gewesen sein, möglicherweise vielleicht.

Aber dann muss man noch realtime-lsm vielleicht irgendwie laden nach installation des kernels bevor man es benutzt mit einem geheimen Befehl damit ein User jackd starten darf. Weiss ich aber nicht.

Gruss
APL
 
A

Anonymous

Gast
Gimpel schrieb:

Na dann war ich ja schon auf der richtigen Spur: hab grad den Kernel so installiert und versuche jetzt realtime zu aktivieren.

Also versuch ich die gid von der gruppe audio rauszukriegen:
Code:
id
uid=1000(metasymbol) gid=100(users) Gruppen=16(dialout),17(audio),33(video),100(users)

dann wahrscheinlich:
Code:
su
(passwort)

und dann

Code:
metalab:/home/metasymbol # modprobe realtime gid=17
FATAL: Module realtime not found.
:shock: :shock: :shock: :shock: :shock: :shock: :shock: :shock:

Ich mach immer alles falsch...
 

admine

Ultimate Guru
ja ja ... ich weiß
HoTow's "zerschreibt" man nicht.
Aber das will ich los werden ;)

@gimpel
Klasse HoTow ... funzt wunderbar :)
 
A

Anonymous

Gast
aus irgendeinen seltsamen Grund passiert folgendes:

Code:
jade:/home/jade # modprobe commoncap
jade:/home/jade # modprobe realtime gid=17
FATAL: Error inserting realtime (/lib/modules/2.6.11.12-jad2-default/kernel/security/realtime.ko): Invalid argument

Ja - die Realtime Capabilities habe ich als [M] Modul eingebaut beim Kernel. Reatime ist auch aktiv...
 
OP
Gimpel

Gimpel

Guru
beim 2.6.11.11er?

hmmm... wie gesagt, realtime-lsm wird nichtmehr supportet :(
dann musste wohl bei 2.6.11.7 bleiben, da gings ja wunderbar

den fehler hatte ich eigentlich erst mit 2.6.13-rcX
 
Oben