Як я можу встановити ядро ​​в реальному часі?


26

Я прочитав багато тем з подібними питаннями, але прочитавши відповіді, я сильно розгубився. Я знайшов у них багато URL-адрес із сховищами, але люди обговорюють, які репозиторії створені для однієї або двох версій ubuntu, але я не знайшов нічого про версію 11.10. Занадто рано просити цього? Чи варто знижувати ubuntu, щоб мати ядро ​​в реальному часі?


3
Ви впевнені, що хочете ядро ​​в режимі реального часу порівняно з низькою затримкою? Які ваші вимоги?
belacqua

Відповіді:


27

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

Якщо ви використовуєте Precision , ви можете використовувати PPA в режимі реального часу Alessio Bogani , який люб'язно упакував ядро ​​ванілі із застосованим патчем RT та підтримує його синхронізацію з номерами версій у Precision.

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

Потім побудуйте ядро ​​за допомогою:

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-ядро" нижче, і це питання для вирішення), і що патчі ядра Ubuntu не будуть присутніми, тому у вас може бути апаратні проблеми, яких у вас раніше не було. Це стосується як пакетів PPA, так і компільованого ядра. Ви завжди можете завантажитися у своє загальне ядро ​​та видалити пакунки ядра в реальному часі, якщо вони, звичайно, доставлять вам проблеми.


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 .


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_для 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


Акуратний. Чи працює виправлений драйвер nvidia з -генеральним? Було б корисно знати, як створити .deb, а не використовувати інсталятор.
pablomme

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 не повинен працювати. Крім цього, все працює добре - тепер я можу уникнути помилок bug.launchpad.net/bugs/920120 та запускати Ardor з двома екранами \ o / Дякую за патч!
паблом

Це не має нічого спільного з питанням, я помиляюся?
Бруно Перейра
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.