そこで、「カスタムカーネルのコンパイル」と呼ばれる、他の人が話しているのを聞いたこのことを試してみることにしました。これを趣味として試している場合、または新しいスキルを学びたいという理由で、よく読んでください。
ただし、始める前に、この必要が生じた場合の状況とその対処方法について説明します。これは、ここで提供するよりもはるかに多くのスペースを必要とする広範な主題であることに注意してください。基本、必要なこと、何をすべきか、何を達成するかを学びます。
詳細については、いつものように、Googleはあなたの友達です。また、カーネルソースツリーにあるドキュメントは多くの質問に答えます。それでは、最初から最後のメモから始めましょう。必要に応じて、他のディストリビューションに関連するカーネルコンパイルに関連する記事をさらに公開します。
独自のカーネルをコンパイルする必要がある場合
最初の状況は、ディストリビューションが提供するよりも新しいカーネルが必要な場合です。特に、安定したディストリビューション(Debian安定版、CentOSなど)を実行している場合、カーネルが必要な機能/ドライバーをサポートしていないため、または単に感じているためです。最新かつ最高のものを試してみたい。
ただし、警告: 最先端のカーネルを実行したい場合は、システムの他の主要コンポーネント(glibcなど)と互換性があることを確認してください。最近の方がテストが少なく、(おそらく)不安定になることを忘れないでください。ディストリビューションのカーネルメンテナは通常、いくつかの新機能を古い、より安定したカーネルにバックポートするのに適しているので、本当に最先端のものが必要であることを確認してください。私たちのアドバイスは、これらのカーネルを本番システムで使用しないことです(長期カーネルはここでは例外となります)。前述のように、ディストリビューションのメンテナを信頼してください。
2番目の状況は、多くのコンポーネントが不要な、肥大化したカーネルを実行していると感じることです。カーネルは既存のハードウェアに一致するモジュールのみをロードしますが、カーネルのメモリフットプリントが小さいほど、通常は速度と起動時間が長くなります。
# lspci -vv # lsusb # hwinfo # cat /proc/cpuinfo
上記のコマンドは、ハードウェアをよりよく理解するのに役立ちます。追加情報については、見つけたものを書き留め、上記のls*コマンドをrootとして実行していることを確認してください。
もう1つの状況は、システムで最新のものを実行することにより、カーネルのテストを支援したい場合です。上記と同じ警告が適用されます:テストシステムでそれを行い、バグを見つけた場合に備えてアップストリームと連絡を取り合い(lkml.orgがメインのカーネルメーリングリスト–トラフィックが多い)、情報を求められたときにできるだけ役立つようにしてください。これは十分に強調することはできません。厄介な状況に陥った、バグを報告したい、または単に質問があるなどの理由で、ドキュメントを読んでください。
次に、あなたはブロックのかっこいい子供になり、最新かつ最高のものを実行したいと思うかもしれません。おそらくソースを一瞥し(これに興味があり、CとASMの知識がある場合)、パッチを送信することもできます。ディストリビューションがまだ新しいカーネルパッケージを提供していない場合は、最初に確認することをお勧めします。たとえば、sources.listを適宜変更すれば、Debian実験的なカーネルをテストシステムにインストールできます。繰り返しになりますが、バグに遭遇した場合は、メンテナと協力してください。
用語
このやや難解な主題についてさらに掘り下げる前に、いくつかの基本的な用語を明確にする必要があります。これは、カーネルのテストとコンパイルの重要な部分を理解するために不可欠です。
- カーネル– オペレーティングシステムのコアであり、ハードウェアリソース(I / O、ネットワーク、CPU、メモリなど)の管理を担当します。基本的に、それはすべての汚い仕事に責任があるOSの本質的な部分です。ユーザープログラムはカーネルと通信し、ユーザーランド(以下を参照)とカーネル/ハードウェアの間の仲介役として機能するシステムライブラリによってCPU時間またはその他のリソースを要求します。カーネルはモノリシックおよびマイクロカーネルにすることができます(詳細については、Wikipedia.orgのカーネル全体の設計アプローチを参照してください。マイクロカーネル(Minixなど)は、コアをカーネルの残りの部分から分割する設計スキームを使用します。残りはコンポーネントに分割され、それぞれが特定のことを実行します:I / O、ネットワーキングなど。モノリシックカーネル(Linux、BSD、Solaris)は、その名前が示すように、カーネルの大部分を1つのユニットで構成し、追加の機能(ドライバーなど)を備えています。 )モジュールによって提供されます。ハイブリッドカーネルもあり、2つのカーネルが組み合わされており、その良い例がWindowsカーネルです。
- ユーザーランド– カーネルの一部ではないOS内のすべて(ライブラリ、アプリケーション)は、ユーザーランドの一部であると言われます。名前は明らかです。
- モジュール– 前に示したように、カーネルモジュールは、基本的に、ハードウェアと「通信」する方法や、いくつかの機能(nfsなど)を提供する方法をカーネルに「教える」バイナリソフトウェアです。
- コンパイラ– コンパイラは、基本的に、kernel.orgからダウンロードしたコードを取得し、それをバイナリに変換するアプリケーションです。 Linuxディストリビューションにあるコンパイラは「gcc」と呼ばれ、GNUコンパイラコレクションの略で、ソフトウェアの構築に不可欠なコンポーネントも必要です。アセンブラ(as)やライブラリアーカイバ(ar)などのbinutilsにあるユーティリティ。Debianシステムでは、またはUbuntuの場合、apt-fileをインストールして実行することにより、ファイルが属するパッケージを見つけることができます。そういえば、カーネルビルドを成功させるためにインストールする必要のあるパッケージを見てみましょう。
- バニラカーネル– これは、kernel.orgにあるアップストリームカーネルに使用される名前であるため、ディストリビューション固有のパッチはありません。
このドキュメントでプロンプト‘$’で始まるコマンドが表示される場合は常に注意してください。 つまり、コマンドは通常の日常のユーザーとして実行する必要があります。 「#」が表示されたときはいつでも プロンプト。これは、コマンドがrootとして実行されることを意味します(sudoを使用しますが、これは必須ではありません)。現在のディレクトリは、特に指定がない限り、ソースツリー(この場合はlinux-2.6)を保持しているディレクトリです。
インストールする必要があるもの
- gcc –もちろん、コンパイラは不可欠です
- binutils –このパッケージには、Cで記述されたプログラムのコンパイルに不可欠なリンカー、アセンブラー、およびその他のユーティリティが含まれています。
- gcc-doc –gccのマニュアルページと情報ページ。汚れてコンパイルフラグを変更したい場合に便利です。とにかく、Cパッケージを作成またはコンパイルしたい場合に便利です。
- gdb –GNUデバッガー。必須ではありませんが、問題が発生した場合に役立ちます。 Gdb-docも役立ちます。
- libreadline5-dev –カーネル構成のncursesベースのインターフェースを使用するため。他のインターフェースを使用できます(以下を参照)。
- make –依存関係としてインストールされますが、いくつかの単語が順番に並んでいます。このような短いスペースでは簡単に説明することはできませんので、マニュアルや本を参照してください。 Makeは、C / C ++プログラムをコンパイルするときに使用されるユーティリティであり、Makefileを調べて、ビルドの実行方法と順序に関するルールを含み、それらのディレクティブを実行しようとします。ソースツリーのMakefileを読んで、垣間見ることができます。
- git – GitはVCS(バージョン管理システム)であり、cvsまたはsubversionが行うことを実行します。つまり、最新のカーネルツリーを最新の状態に保ちます。
カーネルソースの取得
ディストリビューションからソースをインストールする場合は、
を使用します。# apt-get install linux-source-<version>
ここで、<バージョン>は発行から収集できます:
uname -r
既存のカーネルを変更する場合(ドライバーの追加、トリミングなど)にこれを使用します。それ以外の場合は、バニラカーネルが必要です。 www.kernel.orgから入手できます(ダウンロードマネージャーとしてここでwgetまたはcurlをお勧めします)。最新のものが必要な場合は、gitを使用します。ソースをユーザーのホームディレクトリに保存することをお勧めします。最新のメインラインツリーを取得するコマンドは次のとおりです(man gitを参照):
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6
過去には、http://linux.yyz.us/git-howto.htmlのミニハウツーが便利であることがわかりました。 kernelnewbies.orgもチェックしてください。上記のコマンドは、現在のディレクトリにlinux-2.6という名前のフォルダを作成します。このフォルダは、後でcdして、単純な
を発行することで更新できます。make clean; git pull
ここで、ソースを取得したら、カーネルを構成する必要があります。
構成と構築
既存の.configファイル(カーネル構築のオプションを保持するファイル–何が入り、何が入らないか)がある場合は、それをlinux-2.6にコピーします(/ boot /config-
$ make oldconfig
それ以外の場合は、読み進めてください。既存の構成を変更する場合は、発行
$ make menuconfig
(推奨:カーネルのオプションに関する多くの質問にmake configを使用するか、qtライブラリを必要とするxconfigをより適切なグラフィカルメニューに使用できます)、[代替構成ファイルのロード]を選択し、.configにEnterキーを押します。 、構成ファイルのデフォルト名、またはlinux-2.6にすでに保存されている代替ファイル名を入力します。
その後、メニューを調べて必要な変更を加えます。ここでの経験則は、少なくともある程度の経験を積むまでは、「それが何をするのかわからない場合は、それを台無しにしないでください」です。最後に、トップメニューから[代替構成ファイルの保存]を選択し、Enterキーを押してデフォルト名(.config –推奨)を選択し、下から[終了]を押します。最初からやり直したい場合は、「代替構成ファイルのロード」の手順を忘れて続行してください。次のカーネルコンパイルで、ツリーをクリーンアップして更新した後、上記のように「makeoldconfig」を使用して古い構成を使用します。これで、ビルドを待つだけのニーズに合わせた構成ができました。カーネルの構築は、それを構成するのと同じくらい簡単です(!)。 makeと入力するだけで、出力は次のようになります。
$ make HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf CHK include/linux/version.h UPD include/linux/version.h CHK include/generated/utsrelease.h UPD include/generated/utsrelease.h CC kernel/bounds.s GEN include/generated/bounds.h CC arch/x86/kernel/asm-offsets.s ...
そして、しばらくすると、マシンとカーネルの構成に応じて、それが実行されます。少しスピードアップしたい場合は、-jnフラグを使用して作成します。ここで、nはプロセッサ/コアの数+1です。ただし、カーネルまたはビルドインフラストラクチャのバグが発生する可能性があるため、問題が発生した場合は注意してください。フラグなしでmakeを使用して再試行してください。 gccマニュアルを読んだ後(そしてまだ正気である場合)、冒険心があり、ハードウェア固有のフラグを変更したい場合、またはコードを最適化したい場合は、makeマニュアルページを使用して方法を確認してください(主にCOPTSとCFLAGS )。ただし、-O2より大きい最適化にはリスクが伴います。
注意して破損が予想されます。カーネルは問題なくコンパイルされる可能性がありますが、動作がおかしくなる可能性があります。通常のユーザーとしてすべてのコマンドを入力することを忘れないでください。ルートとしてビルドする必要はなく、カーネル開発者はそのアイデアに眉をひそめます。
インストール
次に、モジュールをインストールしましょう。モジュールは/ libにインストールされており、通常のユーザーには書き込みアクセス権がないため、これはrootとして実行する必要があります。だから、
# make modules_install
モジュールとインストールされたカーネルが同期するように、カーネルをインストールする前にこれを行う必要があります。使用
# make install
カーネルを/bootにインストールしてから、
# depmod
起動の初期段階でRAMにロードされる一時ファイルシステムであるinitramfs(初期RAMファイルシステム)を作成する準備をします。これは、ルートファイルシステムをマウントするための基本的なドライバーやその他の機能を提供するために使用されます。詳細については、ウィキペディアのInitrdページを参照してください。タスクに必要なコマンドはupdate-initramfs(これは、新しいカーネルがインストールされるたびに呼び出され、パッケージマネージャーによってトリガーされます)です。これにより、initramfs(-c)を作成したり、既存のカーネル(-u)を更新したりできます。完全なコマンドは
です# update-initramfs -c -k
バージョンは、「make modules_install」が終了した後に表示されるバージョンです(出力の最後の行は「DEPMOD」になります)。正確で長いバージョン番号が必要な場合は、開発者に「gitmoment」を伝えることができます。使用した場合は、menuconfigを発行した後、「一般設定」→「バージョン情報をバージョン文字列に自動的に追加する」を選択します。私のUbuntuシステムでの出力は次のようになります:
update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+ ...
Grubを更新して、新しいカーネルに気付くようにします
# update-grub
私のDebianテストマシンでは、出力は次のようになります:
Generating grub.cfg ... Found background image: /usr/share/images/desktop-base/desktop-grub.png Found linux image: /boot/vmlinuz-3.0.0-1-amd64 Found initrd image: /boot/initrd.img-3.0.0-1-amd64 Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 Found linux image: /boot/vmlinuz-2.6.39-2-amd64 Found initrd image: /boot/initrd.img-2.6.39-2-amd64 Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 Found linux image: /boot/vmlinuz-2.6.38.5 Found initrd image: /boot/initrd.img-2.6.38.5 Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 Found linux image: /boot/vmlinuz-2.6.38.4 Found initrd image: /boot/initrd.img-2.6.38.4 Found linux image: /boot/vmlinuz-2.6.38-2-amd64 Found initrd image: /boot/initrd.img-2.6.38-2-amd64 Found linux image: /boot/vmlinuz-2.6.32-5-amd64 Found initrd image: /boot/initrd.img-2.6.32-5-amd64 Found memtest86+ image: /memtest86+.bin Found memtest86+ multiboot image: /memtest86+_multiboot.bin done
もちろん、出力は完全に同じようには見えませんが、アウトラインは同じである必要があります。最後に、覚えておいてください。必要に応じて、/ etc / default / grubを編集して、update-grubの前にいくつかのオプションを変更し、指を交差させて、マシンを再起動して新しいカーネルをテストします。
問題が発生した場合
新しいカーネルが使用できない場合の最も一般的な状況は、そもそもカーネルを起動できないか、起動していて必須のドライバ(ネットワークドライバなど)がないことです。通常、update-grubはgrubメニューファイルの作成に適していますが、とにかくチェックしたいと思うかもしれません。 grubに合格すると、熱心になりすぎて、ディスク関連のパーツ(ATA、SATA、SCSIなど)や、NFSがマウントされたルートがある場合はNFSなど、システムに不可欠なドライバーがなくなる可能性があります。動作中のカーネルを起動し、GoogleおよびIRCなどの他のソースを使用して再構成します。
過去にあなたの問題にすでに遭遇した人がいる可能性があり、あなたは答えを見つけるチャンスがあります。問題がより深刻で、ネチケットとカーネルメーリングリストへの投稿方法について自信を持って読んでいる場合は、きちんと質問してください。世の中には親切で親切な人がたくさんいますが、宿題をしたり、時間を無駄にしたりしていないと、彼らはあまり親切ではない傾向があります。別の/bootがある場合は、通常はそれほど大きくなく、カーネルがすぐにいっぱいになる可能性があることに注意してください。また、/ lib / modulesは/に多くのスペースを蓄積する傾向があるため、時々クリーンアップを行うようにしてください。カーネルは複雑なソフトウェアであり、多くの原因が問題の根本にある可能性があることを忘れないでください。このガイドに従って問題がなければ、より高度なLinuxカーネル構成の準備ができています。