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?
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.
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
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 .
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.