Làm thế nào tôi có thể cài đặt kernel thời gian thực?


26

Tôi đã đọc rất nhiều chủ đề với các câu hỏi tương tự, nhưng sau khi đọc câu trả lời, tôi rất bối rối. Tôi đã tìm thấy trong đó rất nhiều url có kho lưu trữ nhưng mọi người thảo luận về kho nào được tạo cho một hoặc hai phiên bản ubfox, nhưng tôi không tìm thấy gì về phiên bản 11.10. Là quá sớm để yêu cầu điều đó? Tôi có nên hạ cấp Ubuntu của mình để có kernel thời gian thực không?


3
Bạn có chắc chắn muốn có một hạt nhân thời gian thực so với độ trễ thấp? Yêu cầu của bạn là gì?
belacqua

Câu trả lời:


27

Mục tiêu dài hạn của dự án kernel RT là cuối cùng có tất cả các chức năng RT trong kernel tiêu chuẩn, và điều này đang tiến triển tốt đẹp . Bản vá RT đã có các bản phát hành bất thường trong quá khứ và việc hack kernel.org vào tháng 8 năm 2011 đã khiến phiên bản 3.0 không thể truy cập được trong nhiều tháng, nhưng bây giờ mọi thứ đang rất tốt: có một bản vá cho 3.0, một bản khác cho 3.2 (trùng với kernel các phiên bản trong Ubuntu 11.10 và 12.04) và phiên bản khác cho 3.4, xem tại đây .

Nếu bạn đang sử dụng Chính xác, bạn có thể sử dụng PPA thời gian thực của Alessio Bogani , người đã đóng gói nhân vanilla với bản vá RT được áp dụng và giữ cho nó đồng bộ với số phiên bản trong Chính xác.

Nếu bạn muốn xây dựng hạt nhân RT bằng tay, trước tiên hãy cài đặt các gói phần mềm cần thiết:

sudo apt-get install kernel-package fakeroot build-essential libncurses5-dev

Sau đó lấy hạt nhân vanillabản vá RT (số phiên bản có phần cũ, chỉnh sửa khi cần thiết):

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)

Sau đó cấu hình kernel bằng:

cp /boot/config-$(uname -r) .config && make oldconfig

trong đó bạn nên chọn "toàn quyền" (tùy chọn 5) khi được nhắc và để mọi thứ khác ở giá trị mặc định của nó bằng cách nhấn enter tại mỗi dấu nhắc. Cấu hình từ kernel -lowlatency có thể là điểm khởi đầu tốt hơn so với kernel -generic.

Sau đó, xây dựng kernel với:

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

Và cuối cùng cài đặt kernel mới của bạn với:

sudo dpkg -i ../linux-{headers,image}-3.4.0-rt7_0_*.deb

Bạn sẽ có thể khởi động lại vào nhân RT của bạn tại thời điểm này. Nếu kernel của bạn không khởi động được, hãy đảm bảo bạn kiểm tra kỹ các tham số khởi động và chỉnh sửa chúng cho phù hợp trong bộ tải khởi động của bạn. Ví dụ: các hàm ACPI có thể ảnh hưởng đến hệ thống thời gian thực của bạn (như đã nêu trên rt.wiki.kernel.org). Thêm acpi = off có thể là một giải pháp trong trường hợp đó.

Mặc dù lưu ý rằng bản vá RT không tương thích với trình điều khiển nhị phân Nvidia (nhưng hãy xem bài đăng của người dùng "rt-kernel" bên dưới và câu hỏi này để giải quyết) và bản vá nhân Ubuntu sẽ không xuất hiện, vì vậy bạn có thể có vấn đề phần cứng mà bạn không có trước đây. Điều này đúng với cả gói PPA và kernel đã biên dịch. Tất nhiên, bạn luôn có thể khởi động vào kernel -generic của mình và gỡ cài đặt các gói kernel thời gian thực nếu chúng gây rắc rối cho bạn.


1
Hướng dẫn tuyệt vời! Tôi khuyên bạn nên cài đặt kernel 3,4 chính trước khi theo dõi chúng, để có được tệp cấu hình phù hợp nhất. Ngoài ra, các tệp nhị phân được biên dịch trước không chính thức 3,4,29 cho AMD64 có sẵn ở đây dưới dạng các gói DEB (làm theo các hướng dẫn này trong thư
cmc

Tôi không thể chạy kernel đã biên dịch theo các hướng dẫn này. Vì vậy, thay vì hạt nhân vani từ kernel.org, tôi đã tải xuống linux-sourcegói Ubuntu bằng cách sử dụng aptvà nó đã hoạt động thành công sau đó.
Melebius

3

Một tùy chọn khác là cài đặt RTKernel từ repos của KXStudio. Anh ấy giữ một bộ các gói nhằm mục đích sản xuất âm thanh và âm nhạc và anh ấy có thời gian thực và các gói có độ trễ thấp.

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


2

Theo tôi biết, sự phát triển của nhân thời gian thực không theo kịp chu kỳ phát hành Ubuntu. Nếu bạn phải chạy kernel thời gian thực, có thể bạn sẽ phải chạy phiên bản cũ hơn.

Để biết thêm thông tin, hãy xem https://help.ubfox.com/community/UbfoxStudio / RealTimeKernel .

Lưu ý rằng dường như có ít nhất một số công việc hiện tại trên kernel có độ trễ thấp: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .


2

Nếu bạn phụ thuộc vào việc sử dụng trình điều khiển nhị phân nvidia, bạn có thể vá trình điều khiển gốc bằng bản vá này (chỉ dành cho hơn 3,4 nhân với các bản vá rt) Bản vá này không có bảo hành hoặc bảo hành! Sử dụng nó cho rủi ro của riêng bạn .->

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

Lưu bản vá dưới dạng "nv295.33_for 3.3 + _rt.patch". Áp dụng bản vá->

sh NVIDIA-Linux-x86_64-295.33.run --apply-patch nv295.33_for 3.3+_rt.patch

Điều này sẽ xây dựng một trình cài đặt nhị phân nvidia mới có tên "NVIDIA-Linux-x86_64-295.33-custom.run".

Chạy trình cài đặt với

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

Bản vá này không có bảo hành hoặc bảo hành! Sử dụng nó vào rủi ro riêng của bạn.

Khởi động lại và vui chơi.

Bạn sẽ tìm thấy thêm thông tin trong diễn đàn nv. Ở đó bạn cũng có thể tìm thấy một giải pháp cho loạt 295,40.

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


Khéo léo. Trình điều khiển nvidia đã vá có hoạt động với -generic không? Sẽ rất hữu ích khi biết cách tạo một .deb thay vì sử dụng trình cài đặt.
pottaomme

1
Bản vá của bạn bị thiếu bốn khoảng trống ở đầu dòng elif [ "$ARCH" = "ARMv7" ]; thenvà khoảng trống sau - nó sẽ không áp dụng nếu điều này không được sửa. Ngoài ra, bạn có thể muốn đề cập rằng trình điều khiển nvidia phiên bản 295.33 có thể được tải xuống từ nvidia.com/object/linux-display-amd64-295.33-do.html (đây không phải là phiên bản mới nhất nữa, nhưng được đánh giá bởi một báo cáo tại phoronix. org từ đầu ngày hôm nay có thể tốt hơn là không sử dụng 295,40 trong thời điểm hiện tại).
pottaomme

sudobị thiếu trong lệnh cài đặt, cũng như chỉ ra rằng bạn cần chuyển sang VT và sudo killall Xorg && sudo stop lightdmthực hiện trước khi thực hiện vì nó khẳng định rằng X không được chạy. Ngoài ra, mọi thứ đều hoạt động tốt - bây giờ tôi có thể tránh lỗi bug.launchpad.net/bugs/920120 và chạy Ardor màn hình kép \ o / Cảm ơn bản vá!
pottaomme

Điều này không liên quan gì đến câu hỏi, tôi có sai không?
Bruno Pereira
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.