如何安装实时内核?


26

我已经阅读了很多有类似问题的主题,但是在阅读了答案之后,我感到非常困惑。我在其中发现了很多带有存储库的url,但是人们讨论了为一两个版本的ubuntu创建的存储库,但是对于11.10版本却一无所获。现在还为时过早吗?我应该将Ubuntu降级为具有实时内核吗?


3
您确定要使用实时内核还是低延迟内核?你有什么要求
belacqua 2011年

Answers:


27

RT内核项目的长期目标是最终在标准内核中拥有所有RT功能,并且进展良好。RT修补程序过去曾有不定期的发行版本,2011年8月对kernel.org的黑客攻击使几个月都无法访问3.0版本,但现在情况看起来不错:有一个3.0补丁,另一个是3.2补丁(与内核一致) Ubuntu 11.10和12.04中的版本),以及用于3.4的其他版本,请参见此处

如果您使用的是Precise,则可以使用Alessio Bogani的Realtime PPA,后者已将应用了RT补丁的香草内核打包在一起,并使其与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内核并卸载实时内核软件包。


1
很好的指示!我建议在跟随它们之前安装3.4主线内核,以获取最匹配的配置文件。此外,AMD64的非官方预编译3.4.29二进制文件也可作为DEB软件包在此处获得(按照这封信的说明
cmc 2013年

我无法按照以下说明运行已编译的内核。因此kernel.org,我linux-source使用而不是的原始内核,使用下载了Ubuntu的软件包apt,然后该软件包成功运行。
Melebius



2

如果您依赖使用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二进制安装程序,名为“ NVIDIA-Linux-x86_64-295.33-custom.run”。

使用以下命令运行安装程序

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

此补丁不附带任何保证或担保!自行承担使用风险。

重新启动,玩得开心。

您可以在nv论坛中找到更多信息。在那里您也可以找到295.40系列的解决方案。

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


整齐。修补的nvidia驱动程序也可以与-generic一起使用吗?知道如何生成.deb而不是使用安装程序会很有用。
pablomme 2012年

1
你的补丁缺少在该行的开头四个空格elif [ "$ARCH" = "ARMv7" ]; then和一前一后-如果这是不固定的,将不适用。另外,您可能要提到的是,可以从nvidia.com/object/linux-display-amd64-295.33-driver.html下载nvidia驱动程序版本295.33 (不再是最新版本,而是根据phoronix的报告来判断。 org,今天最好不使用295.40)。
pablomme 2012年

sudo安装命令中缺少,并且指示您需要切换到VT并sudo killall Xorg && sudo stop lightdm在执行它之前执行操作,因为它坚持认为X不能在运行。除此之外,一切都运行良好-现在,我可以避免出现bug bugs.launchpad.net/bugs/920120并运行双屏Ardor \ o /感谢您提供补丁!
pablomme 2012年

这与问题无关,我错了吗?
布鲁诺·佩雷拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.