실시간 커널을 어떻게 설치합니까? 대해 어떤 리포지토리가 만들어지는 지에 대해 이야기하지만

비슷한 질문으로 많은 스레드를 읽었지만 답변을 읽은 후에는 매우 혼란스러워합니다. 나는 그들에게 리포지토리가있는 많은 URL을 발견했지만 사람들은 하나 또는 두 개의 우분투 버전에 대해 어떤 리포지토리가 만들어지는 지에 대해 이야기하지만 11.10 버전에 대해서는 아무것도 찾지 못했습니다. 너무 빨리 요청하지 않습니까? 실시간 커널을 갖도록 우분투를 다운 그레이드해야합니까?



답변

역전사 커널 프로젝트의 장기적인 목표는 모든에게 표준 커널의 RT 기능을 가진 결국, 그리고 이 잘 진행되고있다 . RT 패치는 과거에 불규칙적으로 릴리스되었으며 2011 년 8 월에 kernel.org를 해킹하면 몇 달 동안 3.0 버전에 액세스 할 수 없었지만 이제는 좋아 보입니다. 3.0 패치, 3.2 패치 (커널 포함) Ubuntu 11.10 및 12.04의 버전) 및 3.4의 다른 버전은 여기를 참조 하십시오 .

Precise를 사용 하는 경우 RT 패치가 적용된 바닐라 커널을 친절하게 패키지하고 Precise의 버전 번호와 동기화 상태를 유지 하는 Alessio Bogani의 실시간 PPA를 사용할 수 있습니다 .

수동으로 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 커널의 구성이 -geneeric 커널의 구성보다 나은 시작점이 될 수 있습니다.

그런 다음 커널을 빌드하십시오 :

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”사용자의 게시물 및 해결 방법에 대한 이 질문 참조 ) 우분투 커널 패치가 존재하지 않을 수 있습니다. 이전에는 없었던 하드웨어 문제. 이것은 PPA 패키지와 컴파일 된 커널 모두에 해당됩니다. 물론 일반적인 커널로 부팅하여 실시간 커널 패키지를 제거 할 수 있습니다.


답변

다른 옵션은 KXStudio의 저장소에서 RTKernel을 설치하는 것입니다. 그는 오디오 및 음악 제작을 목적으로하는 일련의 패키지를 유지하며 실시간 및 낮은 대기 시간 패키지를 가지고 있습니다.

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


답변

내가 아는 한 실시간 커널 개발은 우분투 릴리스주기와 보조를 맞추지 못했습니다. 실시간 커널을 실행해야하는 경우 이전 버전을 실행해야합니다.

자세한 내용은 https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel을 참조 하십시오 .

지연 시간이 짧은 커널에 대해서는 적어도 현재 일부 작업이있는 것 같습니다 :
https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .


답변

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 시리즈에 대한 솔루션을 찾을 수 있습니다.

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