カスタムLinuxカーネルの構成、コンパイル、インストール


38

私のディストリビューションが提供しているカーネル以外のカーネルを使用してみてください。他の場所から、または私がカスタマイズしたカーネルを使用します。これは難しいですか、危険ですか?

どこから始めますか?

回答:


51

現代のコンピュータは、ほんの数分でビルドを行うことができるので、ほとんどの構成に- -カスタムカーネルを構築するには時間がかかることがありますが、それは特に危険ではない場合、あなたがカーネルの作業、あなたの最新の状態に保つこと、および残すことを確認してくださいブートローダー経由のオプションとして(下記のステップ6を参照)。このように、新しいものが機能しない場合は、古いものを再起動できます。

次の手順では、ソースツリー内のパスはの形式を取ります。[src]/whateverここで[src]、ソースをインストールしたディレクトリ(例:)/usr/src/linux-3.13.3です。su rootソースツリーは書き込み権限に関して安全である必要があるため(ルートが所有している必要があるため)、おそらくこれを行う必要があります。

一部の手順はオプションですが、残りのプロセスを理解するために必要な情報が含まれているため、いずれにしても読む必要があります。

  1. ソースtarballをダウンロードして解凍します。

    これらはkernel.orgから入手できます。最新のものはフロントページにリストされていますが、/pub/ディレクトリ内を見ると、バージョン1.0に戻っているアーカイブが見つかります。特別な理由がない限り、「最新の安定版」を選択するのが最善です。これを書いている時点では、これは74 MBのtar.xzファイルです。

    tarballをダウンロードしたら、どこかで展開する必要があります。通常の場所はです/usr/src。ファイルをそこに配置し、以下を実行します。

    tar -xJf linux-X.X.X.tar.xz
    

    通常、個々のディストリビューションでは、バニラツリーの代わりにソースパッケージの1つを使用することをお勧めします。 これにはディストリビューション固有のパッチが含まれていますが、これはあなたにとって重要な場合も重要でない場合もあります。また、いくつかのユーザースペースツールのコンパイルに使用されるカーネルインクルードヘッダーにも一致しますが、いずれにしてもほとんど同じです。

    15年以上のカスタムカーネル(主にFedora / Debian / Ubuntu上)の構築で、バニラ1ソースの使用に問題はありませんでした。ただし、絶対に最新のカーネルが必要な場合は、ディストリビューションがまだパッケージ化していない可能性が高いことを除けば、実際にはそれほど大きな違いはありません。 したがって、最も安全な方法は、まだにインストールする必要があるディストリビューションパッケージを使用すること/usr/srcです。 私は最新の安定版を好むので、それがディストリビューションに展開される前にモルモットとして振る舞うことができます:)

  2. 基本構成から開始します(オプション)。

    これを行う必要はありません-すぐに飛び込んで、ゼロから構成を作成できます。ただし、以前にこれを行ったことがない場合は、多くの試行錯誤が予想されます。これは、ほとんどのオプション(数百ものオプション)を読む必要があることも意味します。可能であれば、既存の構成を使用することをお勧めします。ディストリビューションソースパッケージを使用した場合、おそらく既に[src]/.configファイルが含まれているので、それを使用できます。それ以外の場合は、を確認してください/proc/config.gz。これは、2.6カーネルに追加されたオプション機能です。存在する場合は、それをソースツリーの最上位にコピーしgunzip -c config.gz > .configます。

存在しない場合は、おそらくこのオプションがモジュールとして構成されているためです。を試してからsudo modprobe configs、再度/procディレクトリを確認してくださいconfig.gz

distro configは、考えられるほぼすべてのハードウェアドライバーが含まれているという意味であまり理想的ではありません。これらはモジュールであり、ほとんどが使用されることはないため、これはカーネルの機能にはあまり関係ありませんが、ビルドに必要な時間を大幅に増加させます。また、特定のコアモジュールを含めるためにinitramfsを必要とするという点でも厄介です(以下の手順4を参照)。ただし、おそらくデフォルトよりも良い出発点です。

構成オプションは、あるカーネルバージョンから次のカーネルバージョンにシフトおよび変更され、make config以下のプログラムのいずれかを実行する.configと、まず新しいバージョンに合わせて解析および更新されます。構成が非常に古いバージョンのものである場合、これは奇妙な結果につながる可能性があるため、構成を行うときは注意してください。私の知る限り、それは他の方法では動作しません(新しいバージョンの設定を使用)。

  1. .config排尿を作成します。

    [src]/.configカーネルの構成に使用されるテキストファイルです。 このファイルを直接編集しないでください。オプションを変更すると、多くの場合、交換するだけの簡単な作業ではありませんYN、など。通常、相互依存関係と分岐の可能性があります。代わりに、カーネルメイクファイルの構成ターゲットの1つを使用します(つまり、make _____トップレベルのソースディレクトリからコマンドラインに入力します)。

    • make configは最も基本的ですが、おそらくほとんどの人の好みではありません。それは一連の質問、つまり多くの質問であり、気が変わったらもう一度やり直さなければなりません。

    • make oldconfigは、以前のバージョンのmake configを既に持っている場合を除いて、.config新しいオプションに関連する質問以外の質問をスキップします。それらの多くはまだ存在する可能性があり、それらのほとんどはあなたとは無関係ですので、再びお勧めしません。

    • make menuconfig私の(そして他のほとんどの人の)好みの方法です。TUIインターフェイス(ターミナルで動作する色付きのメニュー)を構築して実行します。これには-dev、ncurses のパッケージがインストールされている必要があります。を介してアクセスできる検索を除き、それはかなり自明/です。F1「ヘルプ」は、現在のオプションの説明を提供します。make nconfigF2「syminfo」がmenuconfigのF1と同等である、いくつかの追加機能を備えた代替バージョンがあります。

    • make xconfig完全なGUIインターフェースです。これにはqmake-devQt のパッケージをインストールする必要があります。これも、コンパイルおよびビルドされるプログラムです。これらを以前に使用していなかった場合、かなりのダウンロードになる可能性があります。私menuconfigがGUIバージョンを好む理由は、前者では連続した画面を使用してオプション階層が表示されますが、後者ではアコーディオンのように開いているためです。

    最初にすべきことの1つは(そうする必要はありません)、「ローカルバージョン」文字列を追加することです([一般的なセットアップ]の下)。この理由は、以下の#5に記載されています。

    「Labyrinthine」は、オプションの階層を説明する良い方法であり、詳細についてはこのようなQ&Aの範囲をはるかに超えています。座ってすべてを通り抜けたい場合は、時間を確保してください。Greg Kroah-Hartman(Linuxカーネルの長年のリード開発者)には、構成に関する章を含むカーネルに関する無料のオンラインブック(下記の参考文献を参照)がありますが 2006年に書かれました。現在のディストリビューションカーネルから(#2に従って)、それを調べて、不要なことがわかっているすべての項目のチェックを外します。また、「モジュール」オプションの一部を「組み込み」に変更することもできます。これにより、次のポイントがわかります...

  2. initramfs[オプション] について

    「initramfs」は、カーネルに組み込まれた、および/またはブート時にロードされる圧縮ファイルシステムです。その主な目的は、カーネルが/lib/modulesルートファイルシステム上のモジュールにアクセスする前に必要なモジュールを含めることです。たとえば、そのファイルシステムを含むデバイス用のドライバーです。ドライバーは相互に互換性がないため、ディストリビューションは常にこれらを部分的に使用します。そのため、すべてをカーネルに組み込むことはできません。代わりに、現在のシステムに適したものがの中から選択されinitramfsます。

    これはうまく機能し、いかなるデメリットもありませんが、独自のカーネルを構築する際にはおそらく不必要な複雑さです。2問題 は、initramfsを使用しない場合、ルートファイルシステム(およびそのデバイス)のドライバーがカーネルに組み込まれていることを確認する必要があることです。 ではmenuconfig、これはM(=モジュール)オプションと*(=組み込み)オプションの違いです。これが正しくない場合、システムは起動プロセスの早い段階で失敗します。したがって、たとえば、SATAハードディスクとext4ルートファイルシステムがある場合、それらの組み込み用のドライバーが必要です。[他に必需品と思われるものがある場合は、コメントを残してください。これをここに組み込みます]。

    を使用するinitramfs場合は、一般設定で適切なオプションを選択する必要がありますにはカーネル組み込まれたスケルトンガイドがあり[src]/Documentation/filesystems/ramfs-rootfs-initramfs.txtますが、ディストリビューションはこれを行わないことに注意してください。外部のgzip圧縮されたcpioファイルを使用します。ただし、そのドキュメントには、何をすべきかについての議論が含まれていますinitramfs(「initramfsの内容」を参照)。

  3. カーネルをビルドしてインストールします。

    次のステップは簡単です。カーネルを作成するにmakeは、[src]ディレクトリで実行するだけです。マルチコアシステムを使用している場合-j N、速度を上げるために追加できNます。専用コアの数+ 1です。testまたははありませんcheck。それが完了したら、できますmake modules。高速ボックスでは、これには10分未満しかかかりません。

    すべてうまくいけば、make INSTALL_MOD_STRIP=1 modules_install。これ/lib/modulesにより、カーネルのバージョン番号に加えて、手順3で説明した「ローカルバージョン」文字列と一致するディレクトリが作成されます。「ローカルバージョン」の文字列を使用しなかった場合、依存しているバージョンと同じバージョンのカーネルが既にある場合は、これらのモジュールがそれらを置き換えるため、注意してください3 INSTALL_MOD_STRIP=1はオプションです。意味については、こちらを参照してください

    その後make install、カーネルをデフォルトの場所にインストールできます。ただし、既存のファイルが上書きされないように自分で行うことをお勧めします。探す場所[src]/arch/[ARCH]/bootという名前のファイルをbzImage4[ARCH]x86あなたはx86またはx86-64のマシン上にある場合(そして何か他のものあなたが何か他のものである場合)。それをコピーして/boot、より具体的で有益な名前に変更します(何でも構いません)。で同じこと[src]/System.mapを行いますが、次のスキームに従って名前を変更します。

    System.map-[VERSION]
    

    ここで、[VERSION]によって作成されたディレクトリの名前まったく同じです。これには、などの「ローカルバージョン」文字列が含まれます。/lib/modulesmake modules_installSystem.map-3.13.3-mykernel

  4. GRUB 2ブートローダーを設定します。

    使用していない場合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ます。そのUUIDバージョンはです。 /sbin/init/lib/modulesroot=UUID=[the UUID]

    /boot/grub2/grub.cfgデバイス名に関する手がかりについては、既存のものをご覧ください。以下は grub 2の下での簡単なガイドです。満足したら、実行しますgrub2-mkconfig -o /boot/grub2/grub.cfg(ただし、現在のバックアップをgrub.cfg最初にバックアップします)。次に、そのファイルを編集して、エントリを一番上に移動します。古い(実行中の)カーネルのリストがまだ含まれている必要があり、ディストリビューションには新しいカーネルのエントリを自動的に複製するメカニズムがあります(/bootFedoraで見つかったため、Fedoraはこれを行うため、異なるタイトルを使用しmenuentryて良いアイデア)。すべてうまくいけば、後で削除できます。

    menuentrygrub.cfg直接挿入することもできますが、一部のディストリビューションでは、カーネルが更新されると上書きされます(使用/etc/grub.d/すると、組み込まれたままになります)。

    それでおしまい。あとは、再起動するだけです。うまくいかない場合は、画面出力から問題を推測して推測し、古いカーネルを選択して再起動し、手順3に戻り.configます(既に使用しているものを使用して微調整します)。試行と試行の間にmake clean(またはmake mrproperすることをお勧めします[src]/.configが、最初にバックアップにコピーするようにしてください。バックアップは消去されるためです。 これにより、ビルドプロセスで使用されるオブジェクトが古くなっていないことを確認できます。

  5. カーネルヘッダーについて 等

    おそらく行うべきことの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ライブラリに対してビルドされたプログラムは、新しいカーネルで実行する必要がある」という意味)、これについてあまり気にする必要はありません。カスタムカーネルを構築し、ディストリビューションが「カーネルヘッダ」パッケージ更新、その間しばらく、それを維持する場合にのみ潜在的な問題は次のようになり、新しいカーネルを構築するために使用されるよりもバージョンを、そしていくつかのことが判明します非互換性(その後ソースからコンパイルされたソフトウェアにのみ適用されます)。

参照資料

以下にリソースを示します。

  • [src]/README ビルドとインストールの簡単なガイドが含まれています。

  • [src]/Documentationディレクトリには、コンフィギュレーションに役立つかもしれ多くの情報が含まれています。

  • Greg KHの著書Linux Kernel in a Nutshell(一連のPDFとして無料で入手可能)の多くは、カーネルの構築を中心に展開しています。

  • Grub 2にはオンラインマニュアルがあります


1.「バニラ」とは、kernel.orgで見つかった、元の純粋な公式ソースを指します。ほとんどのディストリビューションはこのバニラソースを使用して、いくつかのマイナーなカスタマイズを追加します。

2.暗号化されている場合や複雑なRAIDアレイに分散している場合など、ルートファイルシステムをマウントするためにユーザー空間が必要になるため、initramfsを必要とする状況があることに注意してください。

3.ただし、ビルドしていない場合、既に存在するモジュールは削除されません。つまり、構成を変更してmake modules_install再度実行するだけで、後でモジュールを追加できます。一部のモジュールをビルドするには、カーネル自体を変更する必要がある場合があります。その場合は、カーネルも交換する必要があります。あなたがmodprobeモジュールを挿入するために使用しようとするときに伝えることができます。

4.非標準の圧縮オプションを使用した場合、このファイルには別の名前が付けられます。すべての可能性が何であるかはわかりません。


3
賛成。スクリプトのlocalmodconfigようなツールとツールの言及を追加することもできstreamline_config.plます。既存のセットアップから仕事に役立つアプローチ...
jasonwryan

1
これはおそらく、@ terdonのイニシアチブによる標準的なタイプの質問になるほど詳細です。メタに関する彼の質問への回答を提供することを検討してください。または、必要に応じて私もできます。とにかく質問したので、これが意図であったようです。ディストリビューション固有のバイナリパッケージを構築する方法も含めると便利だと思います。
Faheem Mitha

1
参考:initramfsほとんどの場合に使用することになっています。たとえば、LVM + RAIDでrootfsを設定するには、多くの場合1つが必要です。暗号化されたルートは間違いなくそうです。かなり複雑なRAIDセットアップでもできます。では、カーネルアセンブリも、些細な配列の自動実際に廃止されました...
derobert

2
@derobert:それは、エンタープライズサーバーを実行するために「ほぼ常に」Linuxが使用されているという疑問を招きます。私のポイントinitramfsは、使用する必要がない場合、使用する必要がないため、プロセスが簡素化されることです。とにかく、暗号化されたルートfsなどに関する脚注を追加しました。
goldilocks 14

EFIとlinuxのefi-stub機能の詳細を含めてください。
IW16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.