Wie kann ich einen Echtzeitkern installieren?


26

Ich habe viele Themen mit ähnlichen Fragen gelesen, aber nachdem ich die Antworten gelesen habe, bin ich sehr verwirrt. Ich habe in ihnen viele URLs mit Repositorys gefunden, aber die Leute diskutieren, welche Repositorys für eine oder zwei Versionen von Ubuntu erstellt wurden, aber ich habe nichts über die 11.10-Version gefunden. Ist es zu früh danach zu fragen? Sollte ich mein Ubuntu downgraden, um einen Echtzeit-Kernel zu haben?


3
Sind Sie sicher, dass Sie einen Echtzeit- oder einen Kernel mit geringer Latenz benötigen? Was sind Ihre Anforderungen?
Belacqua

Antworten:


27

Das langfristige Ziel des RT-Kernel-Projekts ist es, die gesamte RT-Funktionalität im Standardkernel zu haben, und dies macht gute Fortschritte . Der RT-Patch hatte in der Vergangenheit unregelmäßige Veröffentlichungen und das Hacken von kernel.org im August 2011 machte die 3.0-Version monatelang unzugänglich, aber jetzt sieht es gut aus: Es gibt einen Patch für 3.0, einen anderen für 3.2 (der mit dem Kernel übereinstimmt) Versionen in Ubuntu 11.10 und 12.04) und eine andere für 3.4 finden Sie hier .

Wenn Sie Precise verwenden, können Sie Alessio Boganis Realtime PPA verwenden , der den Vanillekern mit dem angewendeten RT-Patch freundlicherweise gepackt hat und ihn mit den Versionsnummern in Precise synchronisiert.

Wenn Sie den RT-Kernel lieber von Hand erstellen möchten, installieren Sie zuerst die erforderlichen Softwarepakete:

sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

Holen Sie sich dann den Vanillekern und den RT-Patch (die Versionsnummern sind etwas alt, passen Sie sie nach Bedarf an):

mkdir -p ~/tmp/linux-rt
cd ~/tmp/linux-rt
wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.bz2
# Alternatively, try http://mirror.be.gbxs.net/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
# if the following is not available:
wget http://www.kernel.org/pub/linux/kernel/projects/rt/3.4/patch-3.4-rt7.patch.bz2
tar xjvf linux-3.4.tar.bz2
cd linux-3.4
patch -p1 < <(bunzip2 -c ../patch-3.4-rt7.patch.bz2)

Dann konfigurieren Sie den Kernel mit:

cp /boot/config-$(uname -r) .config && make oldconfig

Wenn Sie dazu aufgefordert werden, wählen Sie "Vollständige Vorbelegung" (Option 5) und belassen Sie den Standardwert für alle anderen Optionen, indem Sie bei jeder Aufforderung die Eingabetaste drücken. Die Konfiguration des Kernels -lowlatency ist möglicherweise ein besserer Ausgangspunkt als die des Kernels -generic.

Dann bauen Sie den Kernel mit:

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

Und schließlich installieren Sie Ihren neuen Kernel mit:

sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb

Sie sollten jetzt in der Lage sein, Ihren RT-Kernel neu zu starten. Wenn Ihr Kernel nicht bootet, überprüfen Sie die Boot-Parameter und bearbeiten Sie sie entsprechend in Ihrem Bootloader. Beispielsweise können sich ACPI-Funktionen auf Ihr Echtzeitsystem auswirken (wie auf rt.wiki.kernel.org angegeben). In diesem Fall kann das Hinzufügen von acpi = off eine Lösung sein.

Beachten Sie jedoch, dass der RT-Patch nicht mit dem Nvidia-Binärtreiber kompatibel ist (siehe jedoch den Beitrag des Benutzers "rt-kernel" weiter unten und diese Frage zur Umgehung) und dass die Ubuntu-Kernel-Patches möglicherweise nicht vorhanden sind Hardwareprobleme, die Sie vorher nicht hatten. Dies gilt sowohl für die PPA-Pakete als auch für den kompilierten Kernel. Sie können jederzeit in Ihren -generic-Kernel booten und die Echtzeit-Kernel-Pakete deinstallieren, wenn diese Ihnen Probleme bereiten.


1
Tolle Anweisungen! Ich empfehle, einen 3.4-Mainline-Kernel zu installieren, bevor ich ihnen folge, um eine Konfigurationsdatei zu erhalten, die am besten zu ihnen passt. Außerdem sind inoffizielle vorkompilierte 3.4.29-Binärdateien für AMD64 hier als DEB-Pakete verfügbar (
gemäß

Ich konnte den kompilierten Kernel nach diesen Anweisungen nicht ausführen. Anstelle des Vanilla-Kernels von habe kernel.orgich Ubuntus linux-sourcePaket mit heruntergeladen aptund es hat dann erfolgreich funktioniert.
Melebius

3

Eine andere Möglichkeit ist, den RTKernel von den Repos von KXStudio zu installieren. Er hält eine Reihe von Paketen für Audio- und Musikproduktionen bereit und verfügt über Echtzeit- und Pakete mit geringer Latenz.

http://kxstudio.sourceforge.net/Main_Page https://launchpad.net/~kxstudio-team/+archive/kernel


2

Soweit mir bekannt ist, hat die Entwicklung des Echtzeit-Kernels nicht mit dem Ubuntu-Release-Zyklus Schritt gehalten. Wenn Sie einen Echtzeitkernel ausführen müssen, müssen Sie wahrscheinlich eine ältere Version ausführen.

Weitere Informationen finden Sie unter https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .

Beachten Sie, dass der Kernel mit niedriger Latenz offenbar zumindest teilweise aktuell ist: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .


2

Wenn Sie auf die Verwendung des binären Treibers von nvidia angewiesen sind, können Sie den Original-Treiber mit diesem Patch patchen (für Kernel ab 3.4 mit RT-Patches). Für diesen Patch wird keine Garantie oder Gewährleistung übernommen! Benutzung auf eigenes Risiko .->

Index: kernel/conftest.sh
===================================================================
--- kernel/conftest.sh.orig
+++ kernel/conftest.sh
@@ -95,7 +95,7 @@
         fi
     fi

-    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"
+    CFLAGS="$CFLAGS $OUTPUT_CFLAGS -I$HEADERS -I$OUTPUT/arch/x86/include/generated $AUTOCONF_CFLAGS"

     test_xen

@@ -126,7 +126,7 @@
     CFLAGS="$BASE_CFLAGS $MACH_CFLAGS $OUTPUT_CFLAGS -I$HEADERS $AUTOCONF_CFLAGS"

     if [ "$ARCH" = "i386" -o "$ARCH" = "x86_64" ]; then
-        CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$SOURCES/arch/x86/include/generated"
+        CFLAGS="$CFLAGS -I$SOURCES/arch/x86/include -I$OUTPUT/arch/x86/include/generated"
 elif [ "$ARCH" = "ARMv7" ]; then
     CFLAGS="$CFLAGS -I$SOURCES/arch/arm/include -I$SOURCES/arch/arm/include/generated"
     fi
@@ -512,7 +512,12 @@
             # and if it as an 'event' member.
             #
             echo "$CONFTEST_PREAMBLE
-            #include <asm/system.h>
+            #include <linux/version.h>
+       #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+         #include <asm/switch_to.h>
+       #else
+         #include <asm/system.h>
+       #endif
             #include <linux/pm.h>
             void conftest_pm_message_t(pm_message_t state) {
                 pm_message_t *p = &state;
@@ -965,11 +970,12 @@
             #
             echo "$CONFTEST_PREAMBLE
             #include <linux/acpi.h>
+            #include <acpi/acpixf.h>
             void conftest_acpi_walk_namespace(void) {
                 acpi_walk_namespace();
             }" > conftest$$.c

-            $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+            #CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
             rm -f conftest$$.c

             if [ -f conftest$$.o ]; then
@@ -980,6 +986,7 @@

             echo "$CONFTEST_PREAMBLE
             #include <linux/acpi.h>
+       #include <acpi/acpixf.h>
             void conftest_acpi_walk_namespace(void) {
                 acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL, NULL);
             }" > conftest$$.c
@@ -996,6 +1003,7 @@

             echo "$CONFTEST_PREAMBLE
             #include <linux/acpi.h>
+            #include <acpi/acpixf.h>
             void conftest_acpi_walk_namespace(void) {
                 acpi_walk_namespace(0, NULL, 0, NULL, NULL, NULL);
             }" > conftest$$.c
@@ -1603,6 +1611,9 @@
                 fi
             fi
         fi
+
+   RET=0
+   SELECTED_MAKEFILE=Makefile.kbuild

         if [ "$RET" = "0" ]; then
             ln -s $SELECTED_MAKEFILE Makefile
Index: kernel/nv-linux.h
===================================================================
--- kernel/nv-linux.h.orig
+++ kernel/nv-linux.h
@@ -111,7 +111,11 @@
 #include <linux/timer.h>

 #include <asm/div64.h>              /* do_div()                         */
+#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
+#include <asm/switch_to.h>
+#else
 #include <asm/system.h>             /* cli, sli, save_flags             */
+#endif
 #include <asm/io.h>                 /* ioremap, virt_to_phys            */
 #include <asm/uaccess.h>            /* access_ok                        */
 #include <asm/page.h>               /* PAGE_OFFSET                      */
@@ -291,17 +295,17 @@
 #endif
 #endif

-#if defined(CONFIG_PREEMPT_RT)
-typedef atomic_spinlock_t         nv_spinlock_t;
-#define NV_SPIN_LOCK_INIT(lock)   atomic_spin_lock_init(lock)
-#define NV_SPIN_LOCK_IRQ(lock)    atomic_spin_lock_irq(lock)
-#define NV_SPIN_UNLOCK_IRQ(lock)  atomic_spin_unlock_irq(lock)
-#define NV_SPIN_LOCK_IRQSAVE(lock,flags) atomic_spin_lock_irqsave(lock,flags)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+typedef raw_spinlock_t            nv_spinlock_t;
+#define NV_SPIN_LOCK_INIT(lock)   raw_spin_lock_init(lock)
+#define NV_SPIN_LOCK_IRQ(lock)    raw_spin_lock_irq(lock)
+#define NV_SPIN_UNLOCK_IRQ(lock)  raw_spin_unlock_irq(lock)
+#define NV_SPIN_LOCK_IRQSAVE(lock,flags) raw_spin_lock_irqsave(lock,flags)
 #define NV_SPIN_UNLOCK_IRQRESTORE(lock,flags) \
-  atomic_spin_unlock_irqrestore(lock,flags)
-#define NV_SPIN_LOCK(lock)        atomic_spin_lock(lock)
-#define NV_SPIN_UNLOCK(lock)      atomic_spin_unlock(lock)
-#define NV_SPIN_UNLOCK_WAIT(lock) atomic_spin_unlock_wait(lock)
+  raw_spin_unlock_irqrestore(lock,flags)
+#define NV_SPIN_LOCK(lock)        raw_spin_lock(lock)
+#define NV_SPIN_UNLOCK(lock)      raw_spin_unlock(lock)
+#define NV_SPIN_UNLOCK_WAIT(lock) raw_spin_unlock_wait(lock)
 #else
 typedef spinlock_t                nv_spinlock_t;
 #define NV_SPIN_LOCK_INIT(lock)   spin_lock_init(lock)
@@ -956,8 +960,8 @@
     return ret;
 }

-#if defined(CONFIG_PREEMPT_RT)
-#define NV_INIT_MUTEX(mutex) semaphore_init(mutex)
+#if defined(CONFIG_PREEMPT_RT_FULL)
+#define NV_INIT_MUTEX(mutex) sema_init(mutex,1)
 #else
 #if !defined(__SEMAPHORE_INITIALIZER) && defined(__COMPAT_SEMAPHORE_INITIALIZER)
 #define __SEMAPHORE_INITIALIZER __COMPAT_SEMAPHORE_INITIALIZER

Speichern Sie den Patch als "nv295.33_for 3.3 + _rt.patch". Wenden Sie den Patch-> an

sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch

Dadurch wird ein neues NVIDIA-Binärinstallationsprogramm mit dem Namen "NVIDIA-Linux-x86_64-295.33-custom.run" erstellt.

Starten Sie das Installationsprogramm mit

sh NVIDIA-Linux-x86_64-295.33-custom.run

Dieser Patch hat keine Garantie oder Gewährleistung! Verwenden Sie es auf eigenes Risiko.

Neustart und viel Spaß.

Weitere Informationen finden Sie im nv-Forum. Dort finden Sie auch eine Lösung für die Serie 295.40.

http://www.nvnews.net/vbulletin/showthread.php?p=2546508


Ordentlich. Funktioniert der gepatchte nvidia-Treiber auch mit -generic? Es wäre hilfreich zu wissen, wie man eine .deb-Datei erstellt, anstatt das Installationsprogramm zu verwenden.
Pablomme

1
In Ihrem Patch fehlen vier Leerzeichen am Anfang der Zeile elif [ "$ARCH" = "ARMv7" ]; thenund das nachher - es wird nicht angewendet, wenn dies nicht behoben ist. Vielleicht möchten Sie auch erwähnen, dass der nvidia-Treiber, Version 295.33, von nvidia.com/object/linux-display-amd64-295.33-driver.html heruntergeladen werden kann . org von früher heute ist es vielleicht besser, vorerst nicht 295.40 zu verwenden).
Pablomme

sudofehlt im Installationsbefehl und zeigt an, dass Sie zu einem VT wechseln müssen, sudo killall Xorg && sudo stop lightdmbevor Sie es ausführen, da X nicht ausgeführt werden darf. Davon abgesehen funktioniert alles gut - jetzt kann ich den Fehler bugs.launchpad.net/bugs/920120 vermeiden und Dual-Screen Ardour \ o / ausführen. Danke für den Patch!
Pablomme

Das hat nichts mit der Frage zu tun, irre ich mich?
Bruno Pereira
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.