Jak mogę zainstalować jądro w czasie rzeczywistym?


26

Przeczytałem wiele wątków z podobnymi pytaniami, ale po przeczytaniu odpowiedzi jestem bardzo zdezorientowany. Znalazłem w nich wiele adresów URL z repozytoriami, ale ludzie dyskutują o tym, które repozytoria są tworzone dla jednej lub dwóch wersji ubuntu, ale nie znalazłem nic o wersji 11.10. Czy jest za wcześnie, aby o to poprosić? Czy powinienem obniżyć wersję mojego Ubuntu, aby mieć jądro czasu rzeczywistego?


3
Czy na pewno chcesz jądro w czasie rzeczywistym vs. jądro o niskim opóźnieniu? Jakie są twoje wymagania
belacqua

Odpowiedzi:


27

Długofalowym celem projektu jądra RT jest posiadanie wszystkich funkcji RT w standardowym jądrze, a to idzie dobrze . W przeszłości łatka RT miała nieregularne wydania, a włamanie do kernel.org w sierpniu 2011 roku uniemożliwiało dostęp do wersji 3.0 od miesięcy, ale teraz wszystko wygląda dobrze: jest łatka dla 3.0, inna dla 3.2 (zbieżna z jądrem) wersje w Ubuntu 11.10 i 12.04) i kolejna dla 3.4, patrz tutaj .

Jeśli używasz Precise, możesz skorzystać z Alessio Bogani's Realtime PPA , który uprzejmie spakował jądro wanilii z zastosowaną łatką RT i utrzymuje synchronizację z numerami wersji w Precise.

Jeśli wolisz ręcznie budować jądro RT, najpierw zainstaluj wymagane pakiety oprogramowania:

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

Następnie pobierz jądro wanilii i łatkę RT (numery wersji są nieco stare, popraw w razie potrzeby):

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)

Następnie skonfiguruj jądro za pomocą:

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

gdzie powinieneś wybrać „pełne zapobieganie” (opcja 5) po wyświetleniu monitu i pozostaw wszystko inne na wartości domyślnej, naciskając enter przy każdym monicie. Konfiguracja z jądra -lowlatency może być lepszym punktem wyjścia niż jądro -generic.

Następnie zbuduj jądro z:

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

I wreszcie zainstaluj nowe jądro z:

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

W tym momencie powinieneś być w stanie ponownie uruchomić jądro RT. Jeśli jądro się nie uruchomi, sprawdź dokładnie parametry rozruchowe i odpowiednio je edytuj w bootloaderze. Na przykład funkcje ACPI mogą wpływać na twój system czasu rzeczywistego (jak podano na rt.wiki.kernel.org). W takim przypadku rozwiązaniem może być dodanie acpi = off.

Zauważ jednak, że łatka RT jest niezgodna ze sterownikiem binarnym Nvidia (ale zobacz post użytkownika „rt-kernel” poniżej i to pytanie w celu obejścia tego problemu) oraz że łatki jądra Ubuntu nie będą obecne, więc możesz mieć problemy sprzętowe, których wcześniej nie miałeś. Dotyczy to zarówno pakietów PPA, jak i skompilowanego jądra. Zawsze możesz uruchomić się z jądrem -generic i odinstalować pakiety jądra w czasie rzeczywistym, jeśli oczywiście przysparzają ci one problemów.


1
Świetne instrukcje! Zalecam zainstalowanie jądra głównego linii 3.4 przed ich wykonaniem, aby uzyskać plik konfiguracyjny, który najlepiej pasuje. Ponadto, nieoficjalne, wstępnie skompilowane pliki binarne 3.4.29 dla AMD64 są dostępne tutaj jako pakiety DEB (postępując zgodnie z tymi instrukcjami do listu
cmc

Nie mogłem uruchomić skompilowanego jądra zgodnie z tymi instrukcjami. Więc zamiast jądra wanilii z kernel.org, pobrałem linux-sourcepakiet Ubuntu za pomocą apti wtedy działał z powodzeniem.
Melebius

3

Inną opcją jest instalacja RTKernel z repozytoriów KXStudio. Trzyma zestaw pakietów przeznaczonych do produkcji audio i muzycznych oraz ma pakiety czasu rzeczywistego i małe opóźnienia.

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


2

O ile mi wiadomo, rozwój jądra czasu rzeczywistego nie nadąża za cyklem wydawniczym Ubuntu. Jeśli musisz uruchomić jądro w czasie rzeczywistym, prawdopodobnie będziesz musiał uruchomić starszą wersję.

Aby uzyskać więcej informacji, zobacz https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .

Zauważ, że wydaje się, że jest co najmniej trochę pracy nad jądrem o niskim opóźnieniu: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .


2

Jeśli zależy Ci na użyciu binarnego sterownika nvidia, możesz załatać oryginalny sterownik za pomocą tej łatki (tylko dla jąder 3.4+ z łatkami rt) Ta łatka nie jest objęta gwarancją ani gwarancją! Używaj go na własne ryzyko. ->

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

Zapisz łatkę jako „nv295.33_for 3.3 + _rt.patch”. Zastosuj łatkę->

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

Spowoduje to zbudowanie nowego instalatora binarnego nvidia o nazwie „NVIDIA-Linux-x86_64-295.33-custom.run”.

Uruchom instalator za pomocą

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

Ta łatka nie jest objęta gwarancją ani gwarancją! Używaj go na własne ryzyko.

Uruchom ponownie i baw się dobrze.

Więcej informacji znajdziesz na forum NV. Tam również możesz znaleźć rozwiązanie dla serii 295.40.

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


Schludny. Czy załatany sterownik nvidia działa również z opcją -generic? Przydałoby się wiedzieć, jak utworzyć plik .deb zamiast instalatora.
pablomme

1
W twojej łatce brakuje czterech spacji na początku linii elif [ "$ARCH" = "ARMv7" ]; theni następnej - nie będzie obowiązywać, jeśli nie zostanie to naprawione. Warto również wspomnieć, że wersję 295.33 sterownika NVIDIA można pobrać ze strony nvidia.com/object/linux-display-amd64-295.33-driver.html (nie jest to już najnowsza wersja , ale sądząc po raporcie z phoronix. org z dzisiejszego dnia może być na razie lepiej nie używać 295,40).
pablomme

sudobrakuje w poleceniu instalacji, a także wskazanie, że musisz przejść do VT i zrobić to sudo killall Xorg && sudo stop lightdmprzed jego wykonaniem, ponieważ nalega, aby X nie mógł być uruchomiony. Poza tym wszystko działa ładnie - teraz mogę uniknąć błędów bugs.launchpad.net/bugs/920120 i uruchomić Ardor na dwa ekrany. Dziękuję za łatkę!
pablomme

To nie ma nic wspólnego z pytaniem, czy się mylę?
Bruno Pereira
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.