我读过很多有类似问题的帖子,但读完答案后,我感到非常困惑。我在其中发现了很多带有存储库的 URL,但人们讨论了哪些存储库是为一个或两个版本的 ubuntu 制作的,但我没有找到有关 11.10 版本的任何信息。问这个还太早吗?我应该降级我的 ubuntu 以拥有实时内核吗?
答案1
RT 内核项目的长期目标是最终在标准内核中实现所有 RT 功能,并且进展顺利RT 补丁过去曾不定期发布,2011 年 8 月 kernel.org 遭到黑客攻击导致 3.0 版本数月无法访问,但现在情况正在好转:有一个针对 3.0 的补丁,另一个针对 3.2(与 Ubuntu 11.10 和 12.04 中的内核版本一致),还有一个针对 3.4 的补丁,请参阅这里。
如果你正在使用 Precise,你可以使用Alessio Bogani 的实时 PPA他好心地将应用了 RT 补丁的 vanilla 内核打包起来,并使其与 Precise 中的版本号保持同步。
如果您希望手动构建 RT 内核,请首先安装所需的软件包:
sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev
然后获取香草仁和RT 补丁(版本号有些旧,请根据需要进行调整):
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)
然后使用以下命令配置内核:
cp /boot/config-$(uname -r) .config && make oldconfig
出现提示时,您应该选择“完全抢占”(选项 5),并在每次出现提示时按 Enter 键,将其他所有内容保留为默认值。 -lowlatency 内核的配置可能比 -generic 内核的配置更适合作为起点。
然后使用以下命令构建内核:
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
最后使用以下命令安装新内核:
sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb
此时您应该能够重新启动进入 RT 内核。如果您的内核无法启动,请确保仔细检查启动参数,并在引导加载程序中对其进行相应编辑。例如,ACPI 功能可能会影响您的实时系统(如 rt.wiki.kernel.org 上所述)。在这种情况下,添加 acpi=off 可能是一种解决方案。
但请注意,RT 补丁与 Nvidia 二进制驱动程序不兼容(但请参阅下面用户“rt-kernel”的帖子,这个问题(作为解决方法),并且 Ubuntu 内核补丁将不存在,因此您可能会遇到以前没有遇到过的硬件问题。 PPA 软件包和编译后的内核都是如此。 当然,如果实时内核软件包给您带来麻烦,您可以随时启动 -generic 内核并卸载它们。
答案2
另一个选择是从 KXStudio 的存储库安装 RTKernel。他保留了一组针对音频和音乐制作的软件包,并且拥有实时和低延迟软件包。
http://kxstudio.sourceforge.net/Main_Page https://launchpad.net/~kxstudio-team/+archive/kernel
答案3
据我所知,实时内核的开发没有跟上 Ubuntu 发布周期。如果你必须运行实时内核,那么你可能不得不运行旧版本。
有关详细信息,请参阅https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel。
请注意,目前至少有一些关于低延迟内核的工作: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric。
答案4
如果您依赖于使用 nvidia 二进制驱动程序,则可以使用此补丁修补原始驱动程序(仅适用于带有 rt-patches 的 3.4+ 内核)此补丁不附带任何保证或担保!使用它需要您自担风险。->
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
将补丁另存为“nv295.33_for 3.3+_rt.patch”。应用补丁->
sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch
这将构建一个名为“NVIDIA-Linux-x86_64-295.33-custom.run”的新 nvidia 二进制安装程序。
使用以下命令运行安装程序
sh NVIDIA-Linux-x86_64-295.33-custom.run
此补丁不提供任何担保或保证!使用时请自担风险。
重新启动并享受乐趣。
您可以在 nv 论坛中找到更多信息。您也可以在那里找到 295.40 系列的解决方案。