How can I install a realtime kernel?
Solution 1:
The long term goal of the RT kernel project is to end up having all the RT functionality in the standard kernel, and this is progressing nicely. The RT patch has had irregular releases in the past, and the hacking of kernel.org in August 2011 made the 3.0 version inaccessible for months, but now things are looking good: there's a patch for 3.0, another for 3.2 (coinciding with the kernel versions in Ubuntu 11.10 and 12.04), and another for 3.4, see here.
If you are using Precise, you can use Alessio Bogani's Realtime PPA, who has kindly packaged the vanilla kernel with the RT patch applied and is keeping it in sync with the version numbers in Precise.
If you prefer to build the RT kernel by hand, first install the required software packages:
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
Then fetch the vanilla kernel and RT patch (the version numbers are somewhat old, tweak as necessary):
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)
Then configure the kernel using:
cp /boot/config-$(uname -r) .config && make oldconfig
where you should select "full preemption" (option 5) when prompted, and leave everything else at its default value by pressing enter at every prompt. The config from the -lowlatency kernel might be a better starting point than that of the -generic kernel.
Then build the kernel with:
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
And finally install your new kernel with:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
You should be able to reboot into your RT kernel at this point. If your kernel fails to boot make sure you double-check the boot parameters, and edit them accordingly in your bootloader. For example, ACPI functions may affect your real time system (as stated on rt.wiki.kernel.org). Adding acpi=off may be a solution in such case.
Notice though that the RT patch is incompatible with the Nvidia binary driver (but see the post by user "rt-kernel" below, and this question for a workaround), and that the Ubuntu kernel patches will not be present, so you may have hardware problems that you did not have before. This is true of both the PPA packages and the compiled kernel. You can always boot into your -generic kernel and uninstall the realtime kernel packages if they give you trouble, of course.
Solution 2:
Another option is to install the RTKernel from KXStudio's repos. He keeps a set of packages aimed to audio and music productions and he has a real time and a low latency packages.
http://kxstudio.sourceforge.net/Main_Page https://launchpad.net/~kxstudio-team/+archive/kernel
Solution 3:
As far as I know, the development of the realtime kernel has not keep pace with the Ubuntu release cycle. If you must run a realtime kernel, you probably will have to run an older version.
For some more information, see https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel.
Note that there appears to be at least some current work on the low-latency kernel: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .
Solution 4:
If you depend on using the nvidia binary driver you can patch the original driver with this patch (for 3.4+ kernels with rt-patches only) This patch comes with no garantee or warranty! Use it on your own risk.->
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
Save the patch as "nv295.33_for 3.3+_rt.patch". Apply the patch->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
This will build a new nvidia binary installer called "NVIDIA-Linux-x86_64-295.33-custom.run".
Run the installer with
sh NVIDIA-Linux-x86_64-295.33-custom.run
This patch comes with no garantee or warranty! Use it on your own risk.
Reboot and have fun.
You'll find more information in the nv forum. There you can find a solution for the 295.40 series, too.
http://www.nvnews.net/vbulletin/showthread.php?p=2546508