Как я могу установить ядро ​​реального времени?

26

Я прочитал много тем с похожими вопросами, но после прочтения ответов я очень растерялся. Я нашел в них много ссылок с репозиториями, но люди обсуждают, какие репозитории созданы для одной или двух версий ubuntu, но я ничего не нашел в версии 11.10. Слишком рано просить об этом? Должен ли я понижать версию своего Ubuntu, чтобы иметь ядро ​​реального времени?

Джордж
источник
3
Вы уверены, что хотите использовать ядро ​​в реальном времени или с малой задержкой? Каковы ваши требования?
Белаква

Ответы:

27

Долгосрочная цель проекта ядра RT состоит в том, чтобы в конечном итоге иметь все функции RT в стандартном ядре, и это хорошо продвигается . В прошлом в патче RT были нерегулярные выпуски, а взлом kernel.org в августе 2011 года сделал версию 3.0 недоступной в течение нескольких месяцев, но сейчас все выглядит хорошо: есть патч для 3.0, другой для 3.2 (совпадающий с ядром). версии в Ubuntu 11.10 и 12.04), а другую для 3.4 смотрите здесь .

Если вы используете Precise, вы можете использовать Realtime PPA Алессио Богани (Alessio Bogani) , который любезно упаковал ванильное ядро ​​с примененным исправлением RT и поддерживает его синхронизацию с номерами версий в Precise.

Если вы предпочитаете собирать ядро ​​RT вручную, сначала установите необходимые программные пакеты:

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

Затем загрузите ванильное ядро и исправление RT (номера версий несколько старые, при необходимости измените):

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) при появлении запроса и оставить все остальное в его значении по умолчанию, нажимая клавишу ввода при каждом запросе. Конфигурация из ядра -lowlatency может быть лучшей отправной точкой, чем конфигурация ядра -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

На этом этапе вы сможете перезагрузиться в ядро ​​RT. Если ваше ядро ​​не загружается, убедитесь, что вы дважды проверили параметры загрузки и изменили их соответствующим образом в загрузчике. Например, функции ACPI могут влиять на вашу систему реального времени (как указано на rt.wiki.kernel.org). Добавление acpi = off может быть решением в таком случае.

Однако обратите внимание, что исправление RT несовместимо с двоичным драйвером Nvidia (но см. Пост пользователя «rt-kernel» ниже и этот вопрос для обходного пути), и что исправления ядра Ubuntu не будут присутствовать, так что вы можете иметь аппаратные проблемы, которых у вас не было раньше. Это верно как для пакетов PPA, так и для скомпилированного ядра. Вы всегда можете загрузиться в ваше -generic ядро ​​и удалить пакеты ядра реального времени, если они, конечно, доставят вам неприятности.

пабломм
источник
1
Великолепные инструкции! Я рекомендую установить основное ядро ​​3.4, прежде чем следовать им, чтобы получить файл конфигурации, который лучше всего подходит. Кроме того, неофициальные предварительно скомпилированные двоичные файлы 3.4.29 для AMD64 доступны здесь как пакеты DEB (следуя этим инструкциям к письму
cmc
Я не смог запустить скомпилированное ядро, следуя этим инструкциям. Поэтому вместо ванильного ядра kernel.orgя загрузил linux-sourceпакет Ubuntu, aptи тогда он работал успешно.
Мелебиус
3

Другой вариант - установить RTKernel из репозиториев KXStudio. Он хранит набор пакетов, предназначенных для производства аудио и музыки, и у него есть пакеты в режиме реального времени и с низкой задержкой.

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

Рафаэль Вега
источник
2

Насколько я знаю, разработка ядра реального времени не поспевает за циклом выпуска Ubuntu. Если вам нужно запустить ядро ​​реального времени, вам, вероятно, придется запустить более старую версию.

Для получения дополнительной информации см. Https://help.ubuntu.com/community/UbuntuStudio/RealTimeKernel .

Обратите внимание, что в ядре с малой задержкой, по-видимому, есть какая-то текущая работа: https://launchpad.net/~abogani/+archive/ppa?field.series_filter=oneiric .

belacqua
источник
2

Если вы зависите от использования бинарного драйвера nvidia, вы можете патчить оригинальный драйвер этим патчем (только для ядер 3.4+ с 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

RT-ядро
источник
Ухоженная. Работает ли исправленный драйвер nvidia с -generic? Было бы полезно знать, как создать .deb вместо использования установщика.
Паблом
1
В вашем патче пропущены четыре пробела в начале строки elif [ "$ARCH" = "ARMv7" ]; thenи один после - он не будет применяться, если это не исправлено. Кроме того, вы можете упомянуть, что версию драйвера nvidia 295.33 можно загрузить с nvidia.com/object/linux-display-amd64-295.33-driver.html (это больше не последняя версия , но, судя по отчету в phoronix). org с сегодняшнего дня, может быть, лучше пока не использовать 295.40).
Паблом
sudoотсутствует в команде установки, а также указывает на то, что вам нужно переключиться на VT и сделать это sudo killall Xorg && sudo stop lightdmперед выполнением, потому что он настаивает на том, что X не должен быть запущен. Кроме этого, все работает хорошо - теперь я могу избежать ошибки bugs.launchpad.net/bugs/920120 и запустить двухэкранный Ardor \ o / Спасибо за патч!
Паблом
Это не имеет ничего общего с вопросом, я не прав?
Бруно Перейра