Gerçek zamanlı bir çekirdeği nasıl kurabilirim?


26

Benzer soruları olan birçok konu okudum, ancak cevapları okuduktan sonra kafam çok karıştı. Onlarda depoları olan çok sayıda url buldum, ancak insanlar bir veya iki ubuntu sürümü için hangi depoların yapıldığı hakkında tartışıyorlar, ancak 11.10 sürümüyle ilgili hiçbir şey bulamadım. Bunu istemek için çok mu erken? Gerçek zamanlı bir çekirdeğe sahip olmak için ubuntu'umu düşürmeli miyim?


3
Gerçek zamanlı ve düşük gecikmeli bir çekirdek istediğinizden emin misiniz? İhtiyaçların neler?
belacqua

Yanıtlar:


27

RT çekirdeği projesinin uzun vadeli hedefi, standart çekirdekte tüm RT işlevlerine sahip olmaktır ve bu güzel bir şekilde ilerlemektedir . RT yaması geçmişte düzensiz bültenlere sahipti ve Ağustos 2011'de kernel.org'un hacklenmesi 3.0 sürümünü aylarca erişilemez hale getirdi, ancak şimdi işler iyi görünüyor: 3.0 için bir düzeltme eki var, 3.2 için (çekirdeğe denk geliyor) Ubuntu 11.10 ve 12.04) sürümlerinde ve 3.4 için başka sürümlerde, buraya bakın .

Precise kullanıyorsanız, Alessio Bogani'nin vanilya çekirdeğini RT düzeltme eki uygulanmış olan ve paket sürümündeki Precise sürüm numaralarıyla senkronize tutan nazikçe paketleyen Realtime PPA'yı kullanabilirsiniz .

RT çekirdeğini elle oluşturmayı tercih ediyorsanız, önce gerekli yazılım paketlerini yükleyin:

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

Sonra vanilya çekirdeği ve RT yamasını alın (sürüm numaraları biraz eski, gerektiğinde ayarlamalar yapın):

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)

Ardından çekirdeği aşağıdakileri kullanarak yapılandırın:

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

istendiğinde "tam preemption" (seçenek 5) seçmeli ve her istemde enter tuşuna basarak her şeyi varsayılan değerinde bırakın. Düşük çekirdekli çekirdekten gelen yapılandırma, genel çekirdekten daha iyi bir başlangıç ​​noktası olabilir.

Sonra çekirdeği şununla oluşturun:

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

Ve sonunda yeni çekirdeğinizi şu şekilde yükleyin:

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

Bu noktada RT çekirdeğinize yeniden başlayabiliyor olmalısınız. Çekirdeğiniz önyükleme işleminde başarısız olursa, önyükleme parametrelerini iki kez kontrol ettiğinizden emin olun ve önyükleyicinizde buna göre düzenleyin. Örneğin, ACPI işlevleri gerçek zamanlı sisteminizi etkileyebilir (rt.wiki.kernel.org sitesinde belirtildiği gibi). Acpi = off eklemek bu durumda bir çözüm olabilir.

RT düzeltme ekinin Nvidia ikili sürücüsü ile uyumlu olmadığına dikkat edin (ancak aşağıdaki "rt-çekirdek" adlı kullanıcının gönderisine ve bu geçici çözüm için bu soruya bakın) ve Ubuntu çekirdek düzeltme eklerinin mevcut olmayacağına dikkat edin, bu nedenle daha önce sahip olmadığınız donanım sorunları. Bu, hem PPA paketlerini hem de derlenmiş çekirdeği için geçerlidir. Genel çekirdeğinize her zaman önyükleme yapabilir ve tabii ki sorun çıkarırlarsa gerçek zamanlı çekirdek paketlerini kaldırabilirsiniz.


1
Harika talimatlar! En iyi eşleşen bir yapılandırma dosyası edinmek için, bunları izlemeden önce bir 3.4 ana hat çekirdeği yüklemenizi öneririm. Ayrıca, AMD64 için gayri resmi precompiled 3.4.29 ikili DEB paketler olarak burada mevcuttur harfine bu talimatları izleyerek (
CMC

Bu talimatları izleyerek derlenmiş çekirdeği çalıştıramadım. Böylece vanilya çekirdeği yerine, kernel.orgUbuntu linux-sourcepaketini kullanarak indirdim aptve başarılı bir şekilde çalıştı.
Melebius

3

Başka bir seçenek de RTKernel'i KXStudio depolarından yüklemek. Ses ve müzik prodüksiyonlarını hedefleyen bir paket seti tutuyor ve gerçek zamanlı ve düşük gecikmeli paketlere sahip.

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


2

Bildiğim kadarıyla, gerçek zamanlı çekirdeğin gelişimi Ubuntu sürüm döngüsüne ayak uyduramadı. Gerçek zamanlı bir çekirdek çalıştırmanız gerekiyorsa, muhtemelen daha eski bir sürümü çalıştırmanız gerekir.

Daha fazla bilgi için bkz. Https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .

Düşük gecikmeli çekirdekte en azından bazı güncel çalışmalar olduğuna dikkat edin : https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .


2

Eğer nvidia binary sürücüsünü kullanmaya bağlıysanız, orijinal sürücüyü bu yama ile yama yapabilirsiniz (sadece 3.4 ya da çekirdekli çekirdekler için) Bu yamanın garantisi ya da garantisi yoktur! Kendi sorumluluğunuzdadır kullanı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

Yamayı "nv295.33_ for 3.3 + _rt.patch" olarak kaydedin. Yamayı uygula->

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

Bu, "NVIDIA-Linux-x86_64-295.33-custom.run" adında yeni bir nvidia ikili yükleyicisi oluşturacak.

Yükleyiciyi ile çalıştırın

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

Bu yamanın garantisi ya da garantisi yok! Kendi sorumluluğunuzdadır kullanın.

Yeniden başlatın ve eğlenin.

Nv forumunda daha fazla bilgi bulacaksınız. Orada 295.40 serisi için de bir çözüm bulabilirsiniz.

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


Temiz. Yamalı nvidia sürücüsü -generic ile de çalışıyor mu? Yükleyiciyi kullanmak yerine bir .deb dosyasının nasıl üretileceğini bilmek faydalı olacaktır.
pablomme

1
Düzeltme ekinizde satırın başında dört satır eksik elif [ "$ARCH" = "ARMv7" ]; thenve bir sonraki - bu sabit değilse uygulanmaz. Ayrıca, nvidia sürücü sürüm 295.33'ün nvidia.com/object/linux-display-amd64-295.33-driver.html adresinden indirilebileceğini belirtmek isteyebilirsiniz (artık en son değil, ancak phoronix'teki bir rapora göre. Bugünün erken saatlerinden itibaren org 295.40'ın şu an için kullanılmaması daha iyi olabilir).
pablomme

sudokuruluş komutundan eksik, ayrıca bir VT'ye geçmeniz ve sudo killall Xorg && sudo stop lightdmyürütmeden önce yapmanız gerektiğine dair belirtilerin yanı sıra , X'in çalışmaması gerektiği konusunda ısrar ediyor. Bunun dışında, her şey iyi çalışıyor - şimdi hata bugs.launchpad.net/bugs/920120 çalıştırmak ve çift ekran Ardor \ o / yama çalıştırabilirsiniz / Yama için teşekkürler!
pablomme

Bunun soru ile ilgisi yok, yanlış mıyım?
Bruno Pereira,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.