실시간 커널을 어떻게 설치합니까?


26

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


3
실시간 대 지연 시간이 짧은 커널을 원하십니까? 당신의 요구 사항은 무엇입니까?
belacqua

답변:


27

역전사 커널 프로젝트의 장기적인 목표는 모든에게 표준 커널의 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 패키지와 컴파일 된 커널 모두에 해당됩니다. 물론 일반적인 커널로 부팅하여 실시간 커널 패키지를 제거 할 수 있습니다.


1
훌륭한 지침! 가장 적합한 구성 파일을 얻으려면 3.4 메인 라인 커널을 설치하기 전에 설치하는 것이 좋습니다. 또한 AMD64 용 비공식 사전 컴파일 된 3.4.29 바이너리는 여기 DEB 패키지로 제공됩니다 (이러한 지침을 따라
cmc

이 지침에 따라 컴파일 된 커널을 실행할 수 없습니다. 에서의 바닐라 커널 대신에 kernel.org우분투 linux-source패키지를 사용하여 다운로드 apt했으며 성공적으로 작동했습니다.
Melebius

3

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

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


2

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

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

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


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


산뜻한. 패치 된 nvidia 드라이버는 -generic에서도 작동합니까? 설치 프로그램을 사용하는 대신 .deb를 생성하는 방법을 아는 것이 유용합니다.
pablomme

1
줄의 시작 부분 elif [ "$ARCH" = "ARMv7" ]; then과 그 이후 의 공간에 패치에 4 개의 공백 이 없습니다. 이것이 수정되지 않은 경우에는 적용되지 않습니다. 또한 nvidia 드라이버 버전 295.33은 nvidia.com/object/linux-display-amd64-295.33-driver.html 에서 다운로드 할 수 있습니다 (최신이 아니지만 phoronix의 보고서에 의해 판단 됨). 오늘 초부터는 당분간 295.40을 사용하지 않는 것이 좋습니다.
pablomme

sudoVT로 전환 sudo killall Xorg && sudo stop lightdm하고 X를 실행하지 않아야하므로 VT로 전환하고 실행하기 전에 수행 해야 함을 나타냅니다 . 그 외에는 모든 것이 잘 작동합니다. 이제 버그 bugs.launchpad.net/bugs/920120을 피하고 듀얼 스크린 Ardor \ o /를 실행할 수 있습니다 . 패치 주셔서 감사합니다!
pablomme

이것은 질문과 관련이 없습니다. 내가 틀렸습니까?
Bruno Pereira
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.