リアルタイムカーネルをインストールするにはどうすればよいですか?


26

私は同じような質問でたくさんのスレッドを読みましたが、答えを読んだ後、私は非常に混乱しています。私はそれらのリポジトリで多くのURLを見つけましたが、1つまたは2つのバージョンのubuntuのためにどのリポジトリが作られているかについて議論していますが、11.10バージョンについては何も見つかりませんでした。それを求めるには早すぎますか?ubuntuをダウングレードしてリアルタイムカーネルにする必要がありますか?


3
リアルタイムカーネルと低遅延カーネルが必要ですか?あなたの要件は何ですか?
ベラク

回答:


27

RTカーネルプロジェクトの長期目標は、標準カーネルにすべてのRT機能を組み込むことであり、これは順調に進んでいます。RTパッチには過去に不規則なリリースがあり、2011年8月にkernel.orgがハッキングされたため、3.0バージョンは数か月間アクセスできませんでしたが、今は順調です:3.0のパッチ、3.2のパッチ(カーネルと一致) Ubuntu 11.10および12.04のバージョン)、および3.4​​の別のバージョンについては、こちらを参照してください

Preciseを使用している場合、Alessio BoganiのRealtime PPAを使用できます。RTAパッチが適用されたバニラカーネルを親切にパッケージ化し、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)を選択し、プロンプトごとにEnterキーを押して他のすべてをデフォルト値のままにしてください。-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メインラインカーネルをインストールすることをお勧めします。また、AMD64のための非公式なコンパイル済みのバージョン3.4.29のバイナリは、DEBパッケージとして、ここでご利用いただけます(文字にこれらの指示に従う
CMC

これらの指示に従ってコンパイルされたカーネルを実行できませんでした。だから、バニラカーネルの代わりに、を使用してkernel.orgUbuntuのlinux-sourceパッケージをダウンロードし、apt正常に動作しました。
メレビウス14年

3

別のオプションは、KXStudioのリポジトリからRTKernelをインストールすることです。彼は、オーディオおよび音楽の制作を目的とした一連のパッケージを保持しており、リアルタイムで低遅延のパッケージを持っています。

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バイナリドライバーの使用に依存している場合は、このパッチを使用して元のドライバーにパッチを適用できます(rt-patchesを使用する3.4+カーネルのみ)。このパッチには保証も保証もありません。ご自身の責任で使用してください。->

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-Linux-x86_64-295.33-custom.run」という新しいnvidiaバイナリインストーラーが構築されます。

インストーラーを実行します

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

このパッチには保証も保証もありません!自己責任で使用してください。

再起動して楽しんでください。

詳細については、nvフォーラムを参照してください。295.40シリーズのソリューションもあります。

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


きちんとした。パッチを適用したnvidiaドライバーは-genericでも動作しますか?インストーラーを使用する代わりに.debを作成する方法を知っておくと便利です。
パブロム

1
パッチの行頭に4つのスペースがelif [ "$ARCH" = "ARMv7" ]; thenあり、その後に1 つのスペースがありません。これが修正されない場合は適用されません。また、nvidiaドライバーバージョン295.33はnvidia.com/object/linux-display-amd64-295.33-driver.htmlからダウンロードできます(これはもはや最新のものではありませんが、phoronixのレポートで判断できます)。今日以前の組織では、当面は295.40を使用しない方がよい場合があります)
パブロム

sudosudo killall Xorg && sudo stop lightdmXが実行されてはならないと主張しているため、インストールコマンドに、VTに切り替えて実行する前に切り替える必要があることを示すだけでなく、それ以外は、すべてがうまく機能します-バグbugs.launchpad.net/bugs/920120を回避し、デュアルスクリーンArdour \ o /を実行できますパッチをありがとう!
パブロム

これは質問とは何の関係もありません、私は間違っていますか?
ブルーノペレイラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.