मैं रियलटाइम कर्नेल कैसे स्थापित कर सकता हूं?


26

मैंने इसी तरह के सवालों के साथ बहुत सारे सूत्र पढ़े हैं, लेकिन उत्तर पढ़ने के बाद, मैं बहुत उलझन में हूं। मैंने उन्हें बहुत सारे यूआरएल के रिपॉजिटरी के साथ पाया है, लेकिन लोग इस बारे में चर्चा करते हैं कि रिपॉजिटरी को ubuntu के एक या दो संस्करणों के लिए बनाया गया है, लेकिन मुझे 11.10 संस्करण के बारे में कुछ नहीं मिला है। क्या उसके लिए भी जल्द ही पूछना होगा? क्या मुझे रियल टाइम कर्नेल रखने के लिए अपने ubuntu को डाउनग्रेड करना चाहिए?


3
क्या आप वाकई एक वास्तविक समय बनाम कम विलंबता कर्नेल चाहते हैं? आपकी क्या आवश्यकताएं हैं?
बेलाक्वा

जवाबों:


27

आरटी कर्नेल परियोजना का दीर्घकालिक लक्ष्य मानक कर्नेल में सभी आरटी कार्यक्षमता को समाप्त करना है, और यह अच्छी तरह से प्रगति कर रहा है । आरटी पैच की अतीत में अनियमित रिलीज हुई है, और अगस्त 2011 में kernel.org की हैकिंग ने महीनों के लिए 3.0 संस्करण को दुर्गम बना दिया था, लेकिन अब चीजें अच्छी दिख रही हैं: 3.0 के लिए एक पैच है, 3.2 के लिए दूसरा (कर्नेल के साथ मेल खाता है) Ubuntu 11.10 और 12.04 में संस्करण), और 3.4 के लिए एक और, यहां देखें ।

यदि आप Precise का उपयोग कर रहे हैं, तो आप Alessio Bogani के Realtime PPA का उपयोग कर सकते हैं , जिन्होंने कृपया लागू RT पैच के साथ वेनिला कर्नेल पैक किया है और इसे Precise में संस्करण संख्याओं के साथ सिंक कर रहे हैं।

यदि आप हाथ से आरटी कर्नेल बनाना पसंद करते हैं, तो पहले आवश्यक सॉफ्टवेयर पैकेज स्थापित करें:

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

फिर वेनिला कर्नेल और आरटी पैच लाएं (संस्करण संख्या कुछ पुरानी है, आवश्यकतानुसार घुमाएँ):

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) का चयन करना चाहिए, और हर प्रॉम्प्ट पर एंटर दबाकर अपने डिफ़ॉल्ट मूल्य पर बाकी सब कुछ छोड़ देना चाहिए। -Lolatency कर्नेल से विन्यास एक बेहतर प्रारंभिक बिंदु से -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

आपको इस बिंदु पर अपने आरटी कर्नेल में रिबूट करने में सक्षम होना चाहिए। यदि आपका कर्नेल बूट करने में विफल रहता है, तो सुनिश्चित करें कि आप बूट पैरामीटर की दोबारा जांच करते हैं, और उन्हें अपने बूटलोडर के अनुसार संपादित करते हैं। उदाहरण के लिए, ACPI फ़ंक्शन आपके वास्तविक समय प्रणाली (जैसा कि rt.wiki.kernel.org पर बताया गया है) को प्रभावित कर सकता है। एसपीआई को बंद करना = ऐसे मामले में एक समाधान हो सकता है।

ध्यान दें कि आरटी पैच एनवीडिया बाइनरी ड्राइवर के साथ असंगत है (लेकिन नीचे "आरटी-कर्नेल" उपयोगकर्ता द्वारा पोस्ट देखें, और यह सवाल वर्कअराउंड के लिए है), और यह कि उबंटू कर्नेल पैच मौजूद नहीं होंगे, इसलिए आपके पास हो सकता है हार्डवेयर समस्याएं जो आपके पास पहले नहीं थीं। यह पीपीए पैकेज और संकलित कर्नेल दोनों का सच है। आप हमेशा अपने -generic कर्नेल में बूट कर सकते हैं और अगर वे आपको परेशानी देते हैं, तो रियलटाइम कर्नेल संकुल की स्थापना रद्द करें।


1
महान निर्देश! मैं उन्हें कॉन्फ़िगर करने के लिए 3.4 मेनलाइन कर्नेल स्थापित करने की सलाह देता हूं, जो कि सबसे अच्छी तरह से मेल खाने वाली एक कॉन्फ़िगर फ़ाइल प्राप्त करने के लिए। इसके अलावा, AMD64 के लिए अनौपचारिक प्री-कॉम्प्लेस्ड 3.4.29 बायनेरीज़ DEB पैकेज के रूप में यहां उपलब्ध हैं (पत्र के इन निर्देशों के बाद
cm '

मैं इन निर्देशों का पालन करते हुए संकलित कर्नेल नहीं चला सकता। इसलिए वेनिला कर्नेल के बजाय kernel.org, मैंने उबंटू के linux-sourceपैकेज का उपयोग करके डाउनलोड aptकिया और तब यह सफलतापूर्वक काम किया।
मेलेबियस

3

एक अन्य विकल्प KXStudio के रिपॉज से RTK कर्नेल को स्थापित करना है। वह ऑडियो और संगीत प्रस्तुतियों के लिए बनाए गए पैकेज का एक सेट रखता है और उसके पास वास्तविक समय और कम विलंबता पैकेज है।

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 बाइनरी ड्राइवर का उपयोग करने पर निर्भर करते हैं, तो आप इस पैच के साथ मूल ड्राइवर को पैच कर सकते हैं (केवल 3.4-kernels के लिए rt-पैच के साथ) यह पैच बिना किसी गांरटी या वारंटी के आता है! अपने जोखिम पर इसका इस्तेमाल करें ।->

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


साफ। क्या पैचेड एनवीडिया ड्राइवर -सर्जेनिक के साथ भी काम करता है? यह जानना उपयोगी होगा कि इंस्टॉलर का उपयोग करने के बजाय एक .deb का उत्पादन कैसे करें।
पालमोमे

1
आपका पैच लाइन की शुरुआत में चार जगह से गायब है elif [ "$ARCH" = "ARMv7" ]; thenऔर एक के बाद एक - यह लागू नहीं होगा अगर यह तय नहीं है। इसके अलावा, आप कि NVIDIA ड्राइवर को संस्करण 295.33 से डाउनलोड किया जा सकता का उल्लेख करना चाह सकते हैं nvidia.com/object/linux-display-amd64-295.33-driver.html (यह किसी भी अधिक नवीनतम नहीं है, लेकिन Phoronix पर एक रिपोर्ट से पहचानने। आज से पहले के org से 295.40 का उपयोग न करना बेहतर होगा।)
pablomme

sudoइंस्टॉलेशन कमांड से गायब है, साथ ही संकेत है कि आपको वीटी पर स्विच करने और sudo killall Xorg && sudo stop lightdmइसे निष्पादित करने से पहले करना होगा क्योंकि यह जोर देता है कि एक्स को चालू नहीं होना चाहिए। इसके अलावा, सब कुछ अच्छी तरह से काम करता है - अब मैं बग bugs.launchpad.net/bugs/920120 से बच सकता हूं और पैच के लिए डुअल-स्क्रीन अर्दोर \ o / धन्यवाद चला सकता हूं !
pablomme

इस सवाल से कोई लेना-देना नहीं है, क्या मैं गलत हूं?
ब्रूनो परेरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.