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

26

J'ai lu beaucoup de discussions avec des questions similaires, mais après avoir lu les réponses, je suis très confus. J'ai trouvé en eux beaucoup d'url avec des référentiels mais les gens discutent des référentiels qui sont faits 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 ça? Dois-je rétrograder mon Ubuntu pour avoir un noyau en temps réel?

George
la source
3
Êtes-vous sûr de vouloir un noyau en temps réel vs à faible latence? Quelles sont vos exigences?
belacqua

Réponses:

27

L'objectif à long terme du projet de noyau RT est de disposer de toutes les fonctionnalités RT dans le noyau standard, et cela progresse bien . Le patch 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 maintenant les choses vont bien: il y a un patch pour 3.0, un autre pour 3.2 (coïncidant avec le noyau versions dans Ubuntu 11.10 et 12.04), et une autre pour 3.4, voir ici .

Si vous utilisez Precise, vous pouvez utiliser le PPA en temps réel d'Alessio Bogani , qui a aimablement empaqueté le noyau vanilla avec le patch RT appliqué et le maintient synchronisé avec les numéros de version dans Precise.

Si vous préférez construire le noyau RT à la main, installez d'abord les packages logiciels requis:

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

Ensuite, récupérez le noyau vanilla et le patch RT (les numéros de version sont un peu anciens, ajustez 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)

Configurez ensuite le noyau en utilisant:

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

où vous devez sélectionner "préemption complète" (option 5) lorsque vous y êtes invité, et laisser tout le reste à sa valeur par défaut en appuyant sur Entrée à chaque invite. La configuration du noyau -lowlatency pourrait être un meilleur point de départ que celle du noyau -generic.

Construisez ensuite 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 démarre pas, 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 en 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 voir 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 pouvez donc avoir problèmes matériels que vous n'aviez pas auparavant. Cela est vrai des packages PPA et du noyau compilé. Vous pouvez toujours démarrer dans votre noyau générique et désinstaller les packages du noyau en temps réel s'ils vous posent des problèmes, bien sûr.

pablomme
la source
1
Bonnes instructions! Je recommande d'installer un noyau 3.4 principal avant de les suivre, pour obtenir un fichier de configuration qui correspond le mieux. De plus, les binaires non officiels précompilés 3.4.29 pour AMD64 sont disponibles ici en tant que packages DEB (en suivant ces instructions à la lettre
cmc
Je n'ai pas pu exécuter le noyau compilé en suivant ces instructions. Donc, au lieu du noyau vanilla kernel.org, j'ai téléchargé le linux-sourcepackage d'Ubuntu en utilisant aptet cela a fonctionné avec succès.
Melebius
3

Une autre option consiste à installer le RTKernel à partir des dépôts de KXStudio. Il conserve un ensemble de packages destinés aux productions audio et musicale et il dispose d'un package temps réel et à faible latence.

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

Rafael Vega
la source
2

Si vous dépendez de l'utilisation du pilote binaire nvidia, vous pouvez patcher le pilote d'origine avec ce patch (uniquement pour les noyaux 3.4+ avec des patchs rt) Ce patch est fourni sans garantie ni garantie! 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 patch 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 va construire 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é sans garantie ni 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

rt-kernel
la source
Soigné. Le pilote nvidia patché fonctionne-t-il également avec -generic? Il serait utile de savoir comment produire un .deb au lieu d'utiliser le programme d'installation.
pablomme
1
Votre patch manque quatre espaces au début de la ligne elif [ "$ARCH" = "ARMv7" ]; thenet un après - il ne s'appliquera pas s'il n'est pas corrigé. En outre, vous voudrez peut-être mentionner que la version 295.33 du pilote nvidia peut être téléchargée à partir de nvidia.com/object/linux-display-amd64-295.33-driver.html (ce n'est plus la dernière, mais à en juger par un rapport de phoronix. org plus tôt dans la journée, il est préférable de ne pas utiliser 295.40 pour le moment).
pablomme
sudoest absent de la commande d'installation, ainsi que l'indication que vous devez basculer vers un VT et le faire sudo killall Xorg && sudo stop lightdmavant de l'exécuter car il insiste sur le fait que X ne doit pas être en cours d'exécution. En dehors de cela, tout fonctionne bien - maintenant je peux éviter les bugs bugs.launchpad.net/bugs/920120 et exécuter Ardor double écran \ o / Merci pour le patch!
pablomme
Cela n'a rien à voir avec la question, je me trompe?
Bruno Pereira