Como posso instalar um kernel em tempo real?

26

Eu li muitos tópicos com perguntas semelhantes, mas depois de ler as respostas, estou muito confuso. Eu encontrei muitos URLs com repositórios, mas as pessoas discutem sobre quais repositórios são feitos para uma ou duas versões do Ubuntu, mas eu não encontrei nada sobre a versão 11.10. É cedo demais para pedir isso? Devo fazer o downgrade do meu Ubuntu para ter um kernel em tempo real?

    
por George 27.10.2011 / 22:48

4 respostas

27

O objetivo de longo prazo do projeto de núcleo RT é acabar com toda a funcionalidade RT no kernel padrão, e isso está progredindo bem . O patch RT teve lançamentos irregulares no passado, e o hackeamento do kernel.org em agosto de 2011 tornou a versão 3.0 inacessível por meses, mas agora as coisas estão bem: há um patch para o 3.0, outro para o 3.2 (coincidindo com o kernel versões no Ubuntu 11.10 e 12.04), e outra para o 3.4, veja aqui .

Se você estiver usando o Precise, você pode usar o PPA em tempo real de Alessio Bogani , que gentilmente empacotou o kernel de baunilha com o patch RT aplicado e mantendo-o em sincronia com os números de versão no Precise.

Se você preferir construir o kernel RT manualmente, primeiro instale os pacotes de software necessários:

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

Em seguida, busque o kernel vanilla e RT patch (os números de versão são um pouco antigos, ajustados conforme necessário):

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)

Em seguida, configure o kernel usando:

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

em que você deve selecionar "preempção total" (opção 5) quando solicitado e deixar todo o resto em seu valor padrão pressionando enter em cada prompt. A configuração do kernel de baixa-potência pode ser um ponto de partida melhor do que o kernel -genérico.

Em seguida, construa o kernel com:

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

E finalmente instale seu novo kernel com:

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

Você deve ser capaz de reinicializar seu kernel RT neste ponto. Se o seu kernel falhar na inicialização, verifique os parâmetros de inicialização e edite-os de acordo com o seu bootloader. Por exemplo, as funções da ACPI podem afetar seu sistema de tempo real (como indicado em rt.wiki.kernel.org). Adicionar acpi = off pode ser uma solução nesse caso.

Observe que o patch RT é incompatível com o driver binário da Nvidia (mas veja o post do usuário "rt-kernel" abaixo, e esta questão para uma solução alternativa), e que os patches do kernel do Ubuntu não estar presente, assim você pode ter problemas de hardware que você não tinha antes. Isso vale tanto para os pacotes PPA quanto para o kernel compilado. Você sempre pode inicializar em seu kernel genérico e desinstalar os pacotes do kernel em tempo real se eles lhe causarem problemas, é claro.

    
por pablomme 13.04.2017 / 14:24
3

Outra opção é instalar o RTKernel dos repositórios do KXStudio. Ele mantém um conjunto de pacotes voltados para produções de áudio e música e tem pacotes em tempo real e com baixa latência.

link https://launchpad.net/~kxstudio-team/+archive/kernel

    
por Rafael Vega 16.06.2012 / 18:53
2

Até onde eu sei, o desenvolvimento do kernel em tempo real não acompanhou o ciclo de lançamento do Ubuntu. Se você precisa executar um kernel em tempo real, provavelmente terá que executar uma versão mais antiga.

Para mais informações, consulte o link .

Note que parece haver pelo menos algum trabalho atual no kernel de baixa latência: link .

    
por belacqua 27.10.2011 / 23:04
2

Se você depender do uso do driver binário da nvidia, poderá corrigir o driver original com esse patch (somente para os kernels com 3.4 + patches rt) Esse patch não oferece nenhuma garantia ou garantia! Use-o por sua conta e risco .- >

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

Salve o patch como "nv295.33_for 3.3 + _rt.patch". Aplique o patch- >

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

Isto irá construir um novo instalador binário da nvidia chamado "NVIDIA-Linux-x86_64-295.33-custom.run".

Execute o instalador com

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

Este patch vem sem garantia ou garantia! Use por sua conta e risco.

Reinicie e divirta-se.

Você encontrará mais informações no fórum nv. Lá você pode encontrar uma solução para a série 295.40 também.

link

    
por rt-kernel 16.04.2012 / 13:43