ฉันจะติดตั้งเคอร์เนลเรียลไทม์ได้อย่างไร


26

ฉันได้อ่านหัวข้อมากมายพร้อมคำถามที่คล้ายกัน แต่หลังจากอ่านคำตอบแล้วฉันก็สับสนมาก ฉันพบว่ามี URL จำนวนมากที่มีคลังเก็บ แต่ผู้คนพูดถึงที่เก็บซึ่งสร้างขึ้นสำหรับอูบุนตูหนึ่งหรือสองรุ่น แต่ฉันไม่พบอะไรเกี่ยวกับรุ่น 11.10 เร็วเกินไปที่จะขอสิ่งนั้นหรือ ฉันควรจะลดระดับอูบุนตูให้มีเคอร์เนลเรียลไทม์หรือไม่?


3
คุณแน่ใจหรือว่าต้องการเคอร์เนลเรียลไทม์เทียบกับความหน่วงต่ำ คุณต้องการอะไรบ้าง?
belacqua

คำตอบ:


27

เป้าหมายระยะยาวของโครงการ RT เคอร์เนลที่จะสิ้นสุดมีทุกฟังก์ชั่น RT ในเคอร์เนลมาตรฐานและนี้มีความคืบหน้าเป็นอย่างดี RT patch มีการเปิดตัวที่ผิดปกติในอดีตและการแฮ็คของ kernel.org ในเดือนสิงหาคม 2011 ทำให้รุ่น 3.0 ไม่สามารถเข้าถึงได้เป็นเวลาหลายเดือน แต่ตอนนี้ทุกอย่างดูดี: มี patch สำหรับ 3.0 และอีก 3.2 สำหรับประจวบกับเคอร์เนล รุ่นในอูบุนตู 11.10 และ 12.04) และอีก 3.4 โปรดดูที่นี่

หากคุณใช้ Precise คุณสามารถใช้PPA แบบเรียลไทม์ของ Alessio Boganiซึ่งได้ทำการบรรจุเคอร์เนลวานิลลาด้วย RT patch ที่ใช้และทำการซิงค์กับหมายเลขเวอร์ชั่นใน 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 ของคุณได้ในตอนนี้ หากเคอร์เนลของคุณไม่สามารถบู๊ตได้ตรวจสอบให้แน่ใจว่าคุณได้ตรวจสอบพารามิเตอร์การบู๊ตอีกครั้งและแก้ไขให้เหมาะสมใน bootloader ของคุณ ตัวอย่างเช่นฟังก์ชั่น ACPI อาจส่งผลกระทบต่อระบบเรียลไทม์ของคุณ (ตามที่ระบุไว้ใน rt.wiki.kernel.org) การเพิ่ม acpi = off อาจเป็นวิธีแก้ปัญหาในกรณีเช่นนี้

โปรดสังเกตว่าแพตช์ RT ไม่สามารถใช้ร่วมกับไดร์เวอร์ไบนารีของ Nvidia (แต่โปรดดูโพสต์โดยผู้ใช้ "rt-kernel" ด้านล่างและคำถามนี้สำหรับวิธีแก้ปัญหา) และว่าเบราว์เซอร์ Ubuntu จะไม่ปรากฏดังนั้น ปัญหาฮาร์ดแวร์ที่คุณไม่เคยมีมาก่อน สิ่งนี้เป็นจริงทั้งในแพ็คเกจ PPA และเคอร์เนลที่คอมไพล์ คุณสามารถบูตเข้าสู่เคอร์เนล -generic ของคุณและถอนการติดตั้งแพ็กเกจเคอร์เนลเรียลไทม์หากพวกเขาทำให้คุณมีปัญหาแน่นอน


1
สุดยอดคำแนะนำ! ฉันแนะนำให้ติดตั้งเคอร์เนล 3.4 mainline ก่อนติดตามพวกเขาเพื่อรับไฟล์ config ที่ตรงกับที่ดีที่สุด นอกจากนี้ยังมีการคอมไพล์ล่วงหน้าอย่างไม่เป็นทางการ 3.4.29 ไบนารีสำหรับ AMD64 มีให้ที่นี่เป็นแพ็คเกจ DEB (ทำตามคำแนะนำเหล่านี้ต่อจดหมาย
cmc

ฉันไม่สามารถรันเคอร์เนลที่คอมไพล์ได้ตามคำแนะนำเหล่านี้ ดังนั้นแทนที่จะใช้เคอร์เนลวานิลลาkernel.orgฉันจึงดาวน์โหลดlinux-sourceแพ็คเกจของ Ubuntu aptและใช้งานได้สำเร็จแล้ว
Melebius

3

อีกทางเลือกหนึ่งคือการติดตั้ง RTKernel จาก repos ของ KXStudio เขาเก็บชุดของแพคเกจที่มุ่งเน้นการผลิตเสียงและเพลงและเขามีเวลาจริงและแพคเกจเวลาแฝงต่ำ

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


2

เท่าที่ฉันรู้การพัฒนาของเคอร์เนลเรียลไทม์ไม่ได้ทันกับวัฏจักรการปล่อย Ubuntu หากคุณต้องใช้เคอร์เนลเรียลไทม์คุณอาจต้องเรียกใช้รุ่นที่เก่ากว่า

สำหรับข้อมูลเพิ่มเติมโปรดดูที่https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel

โปรดทราบว่ามีปรากฏเป็นอย่างน้อยบางส่วนการทำงานในปัจจุบันบน latency ต่ำเคอร์เนล: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric


2

หากคุณขึ้นอยู่กับการใช้ไดรเวอร์ไบนารี nvidia คุณสามารถแก้ไขไดรเวอร์เดิมด้วยโปรแกรมแก้ไขนี้ (สำหรับ 3.4 + เมล็ดที่มี rt-patches เท่านั้น) โปรแกรมแก้ไขนี้มาพร้อมกับการรับประกันหรือการรับประกัน! ใช้กับความเสี่ยงของคุณเอง. ->

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

1
แพทช์ของคุณหายไปสี่ช่องว่างที่จุดเริ่มต้นของบรรทัดelif [ "$ARCH" = "ARMv7" ]; thenและอีกหลัง - มันจะไม่ใช้ถ้ายังไม่ได้รับการแก้ไข นอกจากนี้คุณอาจต้องการพูดถึงว่าไดรเวอร์ nvidia รุ่น 295.33 สามารถดาวน์โหลดได้จากnvidia.com/object/linux-display-amd64-295.33-driver.html (ไม่ใช่รุ่นล่าสุดอีกแล้ว แต่ตัดสินจากรายงานที่ phoronix org จากก่อนหน้าวันนี้มันอาจจะดีกว่าถ้าไม่ใช้ 295.40 ในขณะนั้น
pablomme

sudoหายไปจากคำสั่งการติดตั้งเช่นเดียวกับการบ่งชี้ว่าคุณต้องเปลี่ยนเป็น VT และทำsudo killall Xorg && sudo stop lightdmก่อนที่จะดำเนินการเพราะมันยืนยันว่า X จะต้องไม่ทำงาน นอกเหนือจากนั้นทุกอย่างทำงานได้ดี - ตอนนี้ฉันสามารถหลีกเลี่ยงข้อผิดพลาดbug.launchpad.net/bugs/920120และเรียกใช้ Ardor สองหน้าจอ / ขอบคุณสำหรับการแก้ไข!
pablomme

สิ่งนี้ไม่เกี่ยวกับคำถามฉันผิดหรือเปล่า
Bruno Pereira
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.