web-dev-qa-db-fra.com

Comment puis-je installer un noyau temps réel?

J'ai lu beaucoup de discussions avec des questions similaires, mais après avoir lu les réponses, je suis très confus. J'y ai trouvé beaucoup d'URL avec des référentiels, mais les gens discutent des référentiels créés pour une ou deux versions d'ubuntu, mais je n'ai rien trouvé sur la version 11.10. Est-ce trop tôt pour demander cela? Dois-je déclasser mon ubuntu pour avoir un noyau temps réel?

26
George

L'objectif à long terme du projet de noyau RT est de disposer de toutes les fonctionnalités RT du noyau standard, et cela progresse bien . Le correctif RT a eu des versions irrégulières dans le passé et le piratage de kernel.org en août 2011 a rendu la version 3.0 inaccessible pendant des mois, mais la situation semble bonne: il existe un correctif pour 3.0, un autre pour 3.2 (coïncidant avec les versions du noyau dans Ubuntu 11.10 et 12.04), et une autre pour 3.4, voir ici .

Si vous utilisez Precise, vous pouvez utiliser Realtime PPA d’Alessio Bogani , qui a gentiment empaqueté le noyau Vanilla avec le correctif RT et le maintient synchronisé avec les numéros de version de Précis.

Si vous préférez construire le noyau RT à la main, commencez par installer les packages logiciels requis:

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

Puis récupérez les noyau Vanilla et correctif RT (les numéros de version sont un peu anciens, modifiez si nécessaire):

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)

Puis configurez le noyau en utilisant:

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

où vous devez sélectionner "préemption totale" (option 5) lorsque vous y êtes invité et laissez tout le reste à sa valeur par défaut en appuyant sur entrée à chaque invite. La configuration du noyau -lowlatency peut constituer un meilleur point de départ que celle du noyau -generic.

Ensuite, construisez le noyau avec:

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

Et enfin, installez votre nouveau noyau avec:

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

Vous devriez pouvoir redémarrer dans votre noyau RT à ce stade. Si votre noyau ne parvient pas à démarrer, vérifiez bien les paramètres de démarrage et modifiez-les en conséquence dans votre chargeur de démarrage. Par exemple, les fonctions ACPI peuvent affecter votre système temps réel (comme indiqué sur rt.wiki.kernel.org). Ajouter acpi = off peut être une solution dans ce cas.

Notez cependant que le correctif RT est incompatible avec le pilote binaire Nvidia (mais consultez le message de l'utilisateur "rt-kernel" ci-dessous, et cette question pour une solution de contournement), et que les correctifs du noyau Ubuntu ne seront pas présents, vous risquez donc d'avoir des problèmes matériels que vous n'aviez pas auparavant. Ceci est vrai à la fois pour les packages PPA et le noyau compilé. Vous pouvez toujours démarrer dans votre noyau générique et désinstaller les paquetages du noyau en temps réel s'ils vous posent problème, bien sûr.

27
pablomme

Une autre option consiste à installer le RTKernel à partir du dépôt de KXStudio. Il conserve un ensemble de packages destinés aux productions audio et musicales et dispose de packages à temps réel et à faible latence.

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

3
Rafael Vega

Autant que je sache, le développement du noyau temps réel n'a pas suivi le cycle de publication d'Ubuntu. Si vous devez exécuter un noyau temps réel, vous devrez probablement exécuter une version plus ancienne.

Pour plus d'informations, voir https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .

Notez qu'il semble y avoir au moins quelques travaux en cours sur le noyau à faible latence: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .

2
belacqua

Si vous comptez utiliser le pilote binaire nvidia, vous pouvez corriger le pilote d'origine avec ce correctif (pour les noyaux 3.4+ avec les correctifs rt uniquement). Ce correctif n'est pas garanti ni garanti! Utilisez-le à vos risques et périls .->

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

Enregistrez le correctif sous "nv295.33_for 3.3 + _rt.patch". Appliquer le patch->

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

Cela construira un nouveau programme d'installation binaire nvidia appelé "NVIDIA-Linux-x86_64-295.33-custom.run".

Exécutez le programme d'installation avec

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

Ce patch est livré avec aucune garantie ou garantie! Utilisez-le à vos risques et périls.

Redémarrez et amusez-vous.

Vous trouverez plus d'informations sur le forum nv. Vous y trouverez également une solution pour la série 295.40.

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

2
rt-kernel