私のディストリビューションが提供するカーネル以外のカーネルを使用してみたいと思います—どこか別の場所から、または私がカスタマイズしたカーネルを使用してみてください。これは難しいですか、それとも危険ですか?
どこから始めればいいですか?
承認された回答:
カスタムカーネルの構築には時間がかかる場合があります—最近のコンピューターは数分で構築できるため、ほとんどの場合構成で—しかし、特に危険ではありません 現在の動作中のカーネルを維持し、ブートローダーを介してオプションとして残しておくようにしてください(以下のステップ#6を参照)。このようにして、新しいものが機能しない場合は、古いものを再起動するだけです。
次の手順では、ソースツリー内のパスは [src] / whatever
の形式を取ります。 、ここで [src]
ソースをインストールしたディレクトリです。例: /usr/src/linux-3.13.3コード> 。あなたはおそらくこのようなことをしたいと思うでしょう
suroot
ソースツリーは書き込み権限の観点から安全である必要があるため(rootが所有する必要があります)。
一部の手順はオプションですが、残りのプロセスを理解するために必要な情報が含まれているため、とにかく読む必要があります。
-
ソースtarballをダウンロードして解凍します。
これらはkernel.orgから入手できます。最新のものはフロントページにリストされていますが、
/ pub /
の中を見ると ディレクトリには、バージョン1.0までさかのぼるアーカイブがあります。特に特別な理由がない限り、「最新の安定版」を選択することをお勧めします。この記事の執筆時点では、これは74MBのtar.xz
です。 ファイル。tarballをダウンロードしたら、どこかで解凍する必要があります。通常の場所は
/usr / src
です。 。そこにファイルを置き、:tar -xJf linux-X.X.X.tar.xz
個々のディストリビューションでは通常、バニラツリーの代わりにソースパッケージの1つを使用することをお勧めします。 これには、ディストロ固有のパッチが含まれていますが、これは重要な場合と重要でない場合があります。また、一部のユーザースペースツールのコンパイルに使用されるカーネルインクルードヘッダーとも一致しますが、いずれにしても同じである可能性があります。
カスタムカーネル(主にFedora / Debian / Ubuntu)を構築して15年以上経ちましたが、バニラソースの使用に問題があったことは一度もありません。それを行ってもそれほど大きな違いはありませんが、最新のカーネルが必要な場合は、ディストリビューションがまだパッケージ化していない可能性があります。 したがって、最も安全な方法は、
/ usr / src
にインストールする必要があるディストリビューションパッケージを使用することです。 。 最新の安定版が好きなので、ディストリビューションに展開される前にモルモットとして機能できます🙂 -
基本構成から始めます[オプション]。
これを行う必要はありません。すぐに飛び込んで、最初から構成を作成できます。ただし、これまでにこれを行ったことがない場合は、多くのを期待してください。 試行錯誤のこれは、ほとんどのオプション(数百あります)を読み通さなければならないことも意味します。可能な場合は、既存の構成を使用することをお勧めします。ディストリビューションソースパッケージを使用した場合は、おそらくすでに
[src]/。config
が含まれています ファイルなので、それを使用できます。それ以外の場合は、/proc/config.gz
を確認してください 。これは、2.6カーネルで追加されたオプション機能です。存在する場合は、それをソースツリーのトップレベルにコピーし、gunzip -c config.gz> .config
。
存在しない場合は、このオプションがモジュールとして構成されている可能性があります。 sudo modprobe configs
を試してください 、次に / proc
を確認します config.gz
のディレクトリ もう一度。
distro構成は、ほとんどすべての可能なハードウェアドライバーが含まれているという意味で、あまり理想的ではありません。これらはモジュールであり、ほとんどが使用されることはないため、これはカーネルの機能にはあまり関係ありませんが、ビルドに必要な時間が大幅に増加します。また、特定のコアモジュールを含めるためにinitramfsが必要になるという点でも厄介です(以下の手順4を参照)。ただし、これはおそらくデフォルトよりも良い出発点です。
構成オプションは、あるカーネルバージョンから次のバージョンにシフトおよび変更され、 make config
のいずれかを実行すると変更されることに注意してください。 .config
の下にあるプログラム 最初に解析され、新しいバージョンに一致するように更新されます。構成が非常に古いバージョンのものである場合、これは奇妙な結果につながる可能性があるため、構成を行うときは注意してください。 AFAIKは、他の方法ではまったく機能しません(新しいバージョンの構成を使用)。
-
.config
を作成します uration。[src]/。config
カーネルの構成に使用されるテキストファイルです。 このファイルを直接編集しないでください 。オプションの変更は、多くの場合、Y
を置き換えるだけの簡単な問題ではありません。N
を使用 、など;通常、一連の相互依存性と分岐の可能性があります。代わりに、カーネルmakefileの構成ターゲットの1つを使用します(つまり、make _____
と入力します。 トップレベルのソースディレクトリからのコマンドラインで):-
make config
最も基本的ですが、おそらくほとんどの人の好みではありません。それは一連の質問です—たくさん 質問の数—そして気が変わったら、最初からやり直す必要があります。 -
make oldconfig
make config
のようなものです ただし、すでに.config
がある場合は除きます。 以前のバージョンから、新しいオプションに関連するものを除いて質問をスキップします。それらはまだたくさんある可能性があり、それらのほとんどはあなたとは無関係になるので、もう一度、私はそれをお勧めしません。 -
make menuconfig
私の(そして他のほとんどの人の)好ましい方法です。 TUIインターフェイス(端末で機能する色付きのメニュー)を構築して実行します。これには、-dev
が必要です。 ncursesのパッケージがインストールされています。/
からアクセスできる検索を除いて、それはかなり自明です。; F1の「ヘルプ」は、現在のオプションの説明を提供します。別のバージョン、make nconfig
があります 、いくつかの追加機能があり、F2の「syminfo」はmenuconfigのF1と同等です。 -
make xconfig
完全なGUIインターフェースです。これにはqmake
が必要です および-dev
Qtのパッケージをインストールします。これも、コンパイルおよびビルドされるプログラムです。以前にこれらを使用していなかった場合は、かなりのダウンロードになる可能性があります。menuconfig
を好む理由 GUIバージョンでは、オプション階層は前者では連続した画面を使用して表示されますが、後者ではアコーディオンのように開きます。
最初に行う必要がある(ただし、行う必要はない)ことの1つは、「ローカルバージョン」文字列を追加することです(一般設定の下) )。この理由は、以下の#5に記載されています。
「迷路」はオプション階層を説明するための良い方法であり、それを詳細に説明することは、このようなQ&Aの範囲をはるかに超えています。座ってすべてを確認したい場合は、時間を取っておきます。 。 Greg Kroah-Hartman(Linuxカーネルの長年のリード開発者)は、カーネルに関する無料のオンラインブック(下記のリファレンスを参照)を持っています。これには、2006年に書かれたものですが、構成に関する章が含まれています。私のアドバイスは、合理的なベースから始めることです。現在のDistroカーネルから(#2に従って)、それを調べて、不要であることがわかっているすべてのチェックを外します。また、「モジュール」オプションの一部を「組み込み」に変更することもできます。これにより、次のポイントに進みます…
-
-
initramfs
について [オプション]「initramfs」は、カーネルに組み込まれている、および/または起動時にロードされる圧縮ファイルシステムです。その主な目的は、カーネルが
/ lib / modules
内のモジュールにアクセスする前に必要となるモジュールを含めることです。 ルートファイルシステム上—たとえば、そのファイルシステムを含むデバイスのドライバー。ドライバーは相互に互換性がなく、すべてをカーネルに組み込むことはできないため、ディストリビューションは常にこれらを部分的に使用します。代わりに、現在のシステムに適したものがinitramfs
内から選択されます。 。これはうまく機能し、どんな種類の不利な点も表しませんが、独自のカーネルを構築する場合はおそらく不必要な複雑さです。問題は、initramfsを使用しない場合、ルートファイルシステム(およびその上にあるデバイス)のドライバーがカーネルに組み込まれていることを確認する必要があることです。
menuconfig
で 、これはM
の違いです (=モジュール)オプションと*
(=組み込み)オプション。これを正しく行わないと、システムは起動プロセスの早い段階で失敗します。したがって、たとえば、SATAハードディスクとext4ルートファイルシステムがある場合は、それらのビルトイン用のドライバーが必要です。 [他に必要なものがあれば、コメントを残してください。ここに組み込みます]。initramfs
を使用したい場合 、一般設定で適切なオプションを選択する必要があります 。 カーネルに組み込まれたを作成するためのスケルトンガイドがあります[src] /Documentation/filesystems/ramfs-rootfs-initramfs.txt
にあります 、ただし、ディストリビューションはこれを行わないことに注意してください。外部のgzip圧縮されたcpioファイルを使用します。ただし、そのドキュメントには、initramfs
に何を入れるべきかについての説明が含まれています。 (「initramfsの内容」を参照してください。) -
カーネルを構築してインストールします。
次のステップは簡単です。カーネルを作成するには、
make
を実行するだけです。[src]
で ディレクトリ。マルチコアシステムを使用している場合は、-j N
を追加できます。 物事をスピードアップするために、ここでN
専用にしたいコアの数+1です。テスト
はありません またはcheck
。それが完了したら、モジュールを作成
できます 。高速ボックスでは、これにはすべて10分未満かかります。すべてがうまくいけば、
make INSTALL_MOD_STRIP =1 modules_install
。これにより、/ lib / modules
にディレクトリが作成されます カーネルのバージョン番号と、ステップ3で説明した「ローカルバージョン」の文字列(存在する場合)を一致させます。 「ローカルバージョン」の文字列を使用しなかった場合、依存しているのと同じバージョンのカーネルがすでにある場合は注意してください 、これらのモジュールがそれらを置き換えるためです。INSTALL_MOD_STRIP =1
はオプションです。重要性については、こちらをご覧ください。その後、
make install
を実行できます カーネルをデフォルトの場所にインストールします。ただし、既存のファイルが上書きされないように、自分で行うことをお勧めします。[src] / arch / [ARCH] / boot
を見てくださいbzImage
という名前のファイルの場合 、ここで[ARCH]
x86
です x86またはx86-64マシンを使用している場合(および他のマシンを使用している場合)。それを/boot
にコピーします 名前をより具体的で有益なものに変更します(何でも構いません)。[src] /System.map
でも同じことを行います 、ただし、次のスキームに従って名前を変更します。System.map-[VERSION]
ここでは、
[VERSION]
正確に/ lib / modules
内のディレクトリの名前と同じですmake modules_install
によって作成されました 、「ローカルバージョン」の文字列が含まれます(例:System.map-3.13.3-mykernel
) 。 -
GRUB2ブートローダーを構成します。
grub
を使用していない場合 (Linuxデスクトップユーザーの大多数はそうです)、これは明らかにあなたには当てはまりません。/etc/grub.d/40_custom
が必要です あまり含まれていないファイル。そうでない場合は、rootとchmod 755
が所有するものを作成します (実行可能である必要があります)。これに追加:menuentry 'My new kernel, or whatever' { set root='hd0,1' linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options] }
initramfsを使用している場合は、最後の行
initrd / path / to / initramfs
も必要です。 。set root =
に注意してください ライン。この例では、grubが最初のハードドライブ(hd0,1)の最初のパーティションにインストールされていることを前提としています。複数のドライブがある場合は、代わりにパーティションUUIDを使用して、その行を次のように置き換えることをお勧めします。search --no-floppy --fs-uuid --set=root [the UUID of the partition]
grubがルートファイルシステムにない場合を除き、これは
root =
にも対応している必要があります。linux
のディレクティブ 行。ルートファイルシステム(/ sbin / init
のあるファイルシステム)を示します。 および/lib / modules
)。そのUUIDバージョンはroot=UUID =[UUID]
です。 。既存の
/boot/grub2/grub.cfg
を確認できます デバイス名についての手がかりを求めて。 grub 2でのそのような簡単なガイドは次のとおりです。満足したら、grub2-mkconfig -o /boot/grub2/grub.cfg
を実行します。 (ただし、現在のgrub.cfg
をバックアップします 最初)。次に、そのファイルを編集して、エントリを一番上に移動します。古い(実行中の)カーネルのリストがまだ含まれているはずです。ディストリビューションには、新しいカーネルのエントリを自動的に複製するメカニズムが含まれている可能性があります(/ boot
で見つかったため); Fedoraはこれを行うため、menuentry
で別個のタイトルを使用します 良い考えです)。すべてがうまくいけば、後でそれを削除できます。menuentry
を挿入することもできますgrub.cfg
に 直接ですが、一部のディストリビューションは、カーネルが更新されたときにこれを上書きします(/etc/grub.d/
を使用している場合) 組み込まれ続けます。それでおしまい。あなたが今する必要があるのは再起動することだけです。うまくいかない場合は、画面出力から問題を推測し、古いカーネルを選択して再起動し、手順3に戻ります(
.config
を使用する場合を除く)。 あなたはすでに持っていて、それを微調整します)。きれいにする
ことをお勧めします (またはmake mrproper
)試行の合間にただし、必ず[src]/。config
をコピーしてください 消去されるため、最初にバックアップを作成します。 これは、ビルドプロセスで使用されるオブジェクトが古くなっていないことを確認するのに役立ちます。 -
カーネルヘッダーなどについて。 al。
おそらく行うべきことの1つは、シンボリックリンク(
ln -s -i
)/lib/modules/X.X.X/source
および/lib/modules/X.X.X/build
/ usr / src
に ソースツリーがあるディレクトリ(それを保持します)。これは、一部のユーザースペースツール(およびサードパーティのドライバーインストーラー)が実行中のカーネルのソースにアクセスできるようにするために必要です。これに関連する問題は
.h
です。/ usr / include
内のファイル 、など。これらは非常に徐々に変化し、下位互換性があります。 2つの選択肢があります:-
ディストリビューションで使用されているものはそのままにしておきます。システム全体を定期的に更新する場合、ディストリビューションはとにかく定期的に新しいシステムをインストールするため、これは「最も手間のかからない」オプションです。
-
make headers_install
を使用します 。
これらは下位互換性があるため(「古いカーネルヘッダーを使用してCライブラリに対して構築されたプログラムは、新しいカーネルで実行する必要がある」ことを意味します)、これについてあまり煩わしくなる必要はありません。唯一の潜在的な問題は、カスタムカーネルを構築してしばらく保持する場合です。その間、ディストロは「kernel-headers」パッケージを新しいに更新します。 カーネルの構築に使用されるバージョン、および いくつかの非互換性があることが判明しました(これは、後でソースからコンパイルされたソフトウェアにのみ適用されます)。
-
参照
ここにいくつかのリソースがあります:
-
[src] / README
構築とインストールの簡単なガイドが含まれています。 -
[src] / Documentation
ディレクトリには、構成に役立つ可能性のある多くの情報が含まれています。 -
GregK-Hの著書「LinuxKernelina Nutshell」(一連のPDFとして無料で入手可能)の多くは、カーネルの構築を中心に展開しています。
-
Grub2にはオンラインマニュアルがあります。