Come posso installare un kernel in tempo reale?


26

Ho letto molti thread con domande simili, ma dopo aver letto le risposte, sono molto confuso. Ho trovato in loro molti URL con repository, ma la gente discute su quali repository sono realizzati per una o due versioni di Ubuntu, ma non ho trovato nulla sulla versione 11.10. È troppo presto per chiederlo? Dovrei effettuare il downgrade del mio Ubuntu per avere un kernel in tempo reale?


3
Sei sicuro di voler un kernel in tempo reale rispetto a quello a bassa latenza? Quali sono le tue esigenze?
belacqua,

Risposte:


27

L'obiettivo a lungo termine del progetto del kernel RT è quello di finire con tutte le funzionalità RT nel kernel standard, e questo sta procedendo bene . La patch RT ha avuto versioni irregolari in passato e l'hacking di kernel.org nell'agosto 2011 ha reso inaccessibile la versione 3.0 per mesi, ma ora le cose stanno andando bene: c'è una patch per 3.0, un'altra per 3.2 (coincidente con il kernel versioni in Ubuntu 11.10 e 12.04) e un'altra per 3.4, vedi qui .

Se stai usando Precise, puoi usare Realtime PPA di Alessio Bogani , che ha gentilmente impacchettato il kernel vanilla con la patch RT applicata e lo mantiene sincronizzato con i numeri di versione in Precise.

Se si preferisce compilare manualmente il kernel RT, installare prima i pacchetti software richiesti:

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

Quindi recupera il kernel vanilla e la patch RT (i numeri di versione sono alquanto vecchi, modifica se necessario):

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)

Quindi configurare il kernel usando:

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

dove è necessario selezionare "Preemption completa" (opzione 5) quando richiesto e lasciare tutto il resto al valore predefinito premendo Invio a ogni prompt. La configurazione dal kernel -llowlatency potrebbe essere un punto di partenza migliore di quella del kernel -generic.

Quindi compilare il kernel con:

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

E infine installa il tuo nuovo kernel con:

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

A questo punto dovresti essere in grado di riavviare il kernel RT. Se il kernel non si avvia, assicurarsi di ricontrollare i parametri di avvio e modificarli di conseguenza nel proprio bootloader. Ad esempio, le funzioni ACPI possono influire sul sistema in tempo reale (come indicato su rt.wiki.kernel.org). L'aggiunta di acpi = off può essere una soluzione in tal caso.

Si noti tuttavia che la patch RT non è compatibile con il driver binario Nvidia (ma vedere il post dell'utente "rt-kernel" di seguito, e questa domanda per una soluzione alternativa), e che le patch del kernel Ubuntu non saranno presenti, quindi si potrebbe avere problemi hardware che non hai avuto prima. Questo vale sia per i pacchetti PPA che per il kernel compilato. Puoi sempre avviare il tuo kernel -generic e disinstallare i pacchetti del kernel in tempo reale se ti danno problemi, ovviamente.


1
Ottime istruzioni! Consiglio di installare un kernel mainline 3.4 prima di seguirli, per ottenere un file di configurazione che corrisponda meglio. Inoltre, i binari 3.4.29 precompilati non ufficiali per AMD64 sono disponibili qui come pacchetti DEB (seguendo queste istruzioni alla lettera
cmc

Non ho potuto eseguire il kernel compilato seguendo queste istruzioni. Quindi, invece del kernel vanilla kernel.org, ho scaricato il linux-sourcepacchetto di Ubuntu usando apte poi ha funzionato con successo.
Melebio

3

Un'altra opzione è installare RTKernel dai repository di KXStudio. Tiene una serie di pacchetti destinati alle produzioni audio e musicali e ha pacchetti in tempo reale e a bassa latenza.

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



2

Se dipendi dall'uso del driver binario nvidia puoi patchare il driver originale con questa patch (solo per kernel 3.4+ con patch rt) Questa patch non è coperta da garanzia o garanzia! Usalo a tuo rischio .->

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

Salvare la patch come "nv295.33_for 3.3 + _rt.patch". Applica la patch->

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

Questo costruirà un nuovo installer binario nvidia chiamato "NVIDIA-Linux-x86_64-295.33-custom.run".

Esegui il programma di installazione con

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

Questa patch non è coperta da garanzia o garanzia! Usalo a tuo rischio.

Riavvia e divertiti.

Troverai maggiori informazioni nel forum nv. Qui puoi trovare una soluzione anche per la serie 295.40.

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


Neat. Il driver nvidia con patch funziona anche con -generic? Sarebbe utile sapere come produrre un .deb invece di usare il programma di installazione.
pablomme,

1
Alla tua patch mancano quattro spazi all'inizio della riga elif [ "$ARCH" = "ARMv7" ]; thene uno dopo - non si applicherà se non è stato risolto. Inoltre, potresti voler menzionare che il driver nvidia versione 295.33 può essere scaricato da nvidia.com/object/linux-display-amd64-295.33-driver.html (non è più l'ultimo, ma a giudicare da un rapporto su phoronix. org da oggi, potrebbe essere meglio non usare 295.40 per il momento).
pablomme,

sudomanca dal comando di installazione, oltre all'indicazione che è necessario passare a un VT e farlo sudo killall Xorg && sudo stop lightdmprima di eseguirlo perché insiste sul fatto che X non deve essere in esecuzione. A parte questo, tutto funziona bene - ora posso evitare bug bugs.launchpad.net/bugs/920120 ed eseguire Ardor a doppio schermo \ o / Grazie per la patch!
pablomme,

Questo non ha nulla a che fare con la domanda, sbaglio?
Bruno Pereira,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.