Bagaimana saya bisa menginstal kernel realtime?

26

Saya telah membaca banyak utas dengan pertanyaan serupa, tetapi setelah membaca jawabannya, saya sangat bingung. Saya telah menemukan di dalamnya banyak url dengan repositori tetapi orang mendiskusikan tentang repositori mana yang dibuat untuk satu atau dua versi ubuntu, tetapi saya tidak menemukan apa pun tentang versi 11.10. Apakah terlalu cepat untuk meminta itu? Haruskah saya menurunkan versi ubuntu saya ke kernel realtime?

George
sumber
3
Yakin ingin kernel realtime vs low-latency? Apa kebutuhan anda
belacqua

Jawaban:

27

Tujuan jangka panjang dari proyek kernel RT adalah untuk akhirnya memiliki semua fungsi RT di kernel standar, dan ini berjalan dengan baik . Patch RT telah memiliki rilis tidak teratur di masa lalu, dan peretasan kernel.org pada Agustus 2011 membuat versi 3.0 tidak dapat diakses selama berbulan-bulan, tetapi sekarang segalanya terlihat baik: ada patch untuk 3.0, yang lain untuk 3.2 (bertepatan dengan kernel) versi di Ubuntu 11.10 dan 12.04), dan versi lain untuk 3.4, lihat di sini .

Jika Anda menggunakan Precise, Anda dapat menggunakan Realtime PPA Alessio Bogani , yang telah dengan baik hati mengemas kernel vanilla dengan patch RT yang diterapkan dan tetap menyelaraskannya dengan nomor versi di Precise.

Jika Anda lebih suka membangun kernel RT dengan tangan, instal terlebih dahulu paket perangkat lunak yang diperlukan:

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

Kemudian ambil kernel vanilla dan RT patch (nomor versi agak lama, atur seperlunya):

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)

Kemudian konfigurasikan kernel menggunakan:

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

di mana Anda harus memilih "preemption penuh" (opsi 5) saat diminta, dan biarkan semuanya pada nilai standarnya dengan menekan enter pada setiap prompt. Konfigurasi dari kernel -lowlatency mungkin merupakan titik awal yang lebih baik daripada kernel -generic.

Kemudian bangun kernel dengan:

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

Dan akhirnya instal kernel baru Anda dengan:

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

Anda seharusnya bisa reboot ke kernel RT Anda saat ini. Jika kernel Anda gagal melakukan booting, pastikan Anda memeriksa ulang parameter boot, dan mengeditnya di bootloader Anda. Misalnya, fungsi ACPI dapat memengaruhi sistem waktu nyata Anda (sebagaimana dinyatakan pada rt.wiki.kernel.org). Menambahkan acpi = off mungkin menjadi solusi dalam kasus tersebut.

Perhatikan bahwa patch RT tidak kompatibel dengan driver biner Nvidia (tetapi lihat posting oleh pengguna "rt-kernel" di bawah ini, dan pertanyaan ini untuk solusinya), dan bahwa patch kernel Ubuntu tidak akan ada, jadi Anda mungkin memiliki masalah perangkat keras yang tidak Anda miliki sebelumnya. Ini berlaku untuk paket PPA dan kernel yang dikompilasi. Anda selalu dapat boot ke kernel -generic Anda dan menghapus paket kernel realtime jika mereka memberi Anda masalah, tentu saja.

pablomme
sumber
1
Instruksi luar biasa! Saya merekomendasikan menginstal kernel 3,4 mainline sebelum mengikuti mereka, untuk mendapatkan file konfigurasi yang paling cocok. Juga, binari 3.4.29 pra-kompilasi tidak resmi untuk AMD64 tersedia di sini sebagai paket DEB (mengikuti instruksi ini ke surat
cmc
Saya tidak bisa menjalankan kernel yang dikompilasi dengan mengikuti instruksi ini. Jadi alih-alih dari kernel vanilla kernel.org, saya mengunduh linux-sourcepaket Ubuntu menggunakan aptdan itu berhasil dengan baik.
Melebius
3

Pilihan lain adalah menginstal RTKernel dari repo KXStudio. Dia menyimpan satu set paket yang ditujukan untuk produksi audio dan musik dan dia memiliki paket waktu nyata dan latensi rendah.

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

Rafael Vega
sumber
2

Jika Anda bergantung pada menggunakan driver binary nvidia Anda dapat menambal driver asli dengan tambalan ini (untuk 3.4+ kernel dengan rt-patch saja) Tambalan ini dilengkapi tanpa jaminan atau garansi! Gunakan dengan risiko Anda sendiri .->

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

Simpan tambalan sebagai "nv295.33_for 3.3 + _rt.patch". Terapkan tambalan->

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

Ini akan membangun installer biner nvidia baru yang disebut "NVIDIA-Linux-x86_64-295.33-custom.run".

Jalankan penginstal dengan

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

Tambalan ini tidak disertai jaminan atau garansi! Gunakan dengan risiko Anda sendiri.

Nyalakan kembali dan bersenang-senanglah.

Anda akan menemukan informasi lebih lanjut di forum nv. Di sana Anda dapat menemukan solusi untuk seri 295.40 juga.

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

rt-kernel
sumber
Rapi. Apakah driver nvidia yang di-patch bekerja dengan -generic juga? Akan bermanfaat untuk mengetahui cara membuat .deb bukannya menggunakan installer.
pablomme
1
Tambalan Anda tidak memiliki empat spasi di awal baris elif [ "$ARCH" = "ARMv7" ]; thendan yang berikutnya - tidak akan berlaku jika ini tidak diperbaiki. Juga, Anda mungkin ingin menyebutkan bahwa driver nvidia versi 295.33 dapat diunduh dari nvidia.com/object/linux-display-amd64-295.33-driver.html (ini bukan yang terbaru lagi, tetapi dilihat dari laporan di phoronix. org dari awal hari ini mungkin lebih baik untuk tidak menggunakan 295.40 untuk saat ini).
pablomme
sudohilang dari perintah instalasi, serta indikasi bahwa Anda perlu beralih ke VT dan lakukan sudo killall Xorg && sudo stop lightdmsebelum menjalankannya karena itu menegaskan bahwa X tidak boleh berjalan. Selain itu, semuanya bekerja dengan baik - sekarang saya dapat menghindari bug bug.launchpad.net/bugs/920120 dan menjalankan Ardor layar ganda \ o / Terima kasih untuk tambalannya!
pablomme
Ini tidak ada hubungannya dengan pertanyaan, apakah saya salah?
Bruno Pereira