GNU/Linux >> Linux の 問題 >  >> Linux

21世紀のLinuxカーネルをコンパイルする方法

コンピューティングでは、カーネルは、ハードウェアとの通信と一般的なシステム調整を処理する低レベルのソフトウェアです。コンピュータのマザーボードに組み込まれている初期ファームウェアを除いて、コンピュータを起動すると、カーネルは、ハードドライブと画面、キーボードとネットワークカードがあることを認識できるようになります。グラフィックス、オーディオ、ファイルシステム、およびネットワークが同時に実行されている場合でも、すべてがスムーズに実行されるように、各コンポーネントに(多かれ少なかれ)等しい時間が与えられるようにすることもカーネルの仕事です。

ただし、ハードウェアサポートの探求は進行中です。リリースされるハードウェアが多いほど、ハードウェアを期待どおりに機能させるためにカーネルがコードに採用する必要のあるものが増えるためです。正確な数値を取得することは困難ですが、Linuxカーネルは確かにハードウェア互換性のトップカーネルの1つです。 Linuxは、無数のコンピューターや携帯電話、愛好家や産業用の組み込みシステムオンチップ(SoC)ボード、RAIDカード、ミシンなどを運用しています。

関連コンテンツ

20世紀に戻って(そして21世紀の初めにさえ)、Linuxユーザーが非常に新しいハードウェアを購入したときに、最新のカーネルソースコードをダウンロードする必要があると予想するのは不合理ではありませんでした。デバイスのサポートを受けることができるように、コンパイルしてインストールします。しかし、最近では、高度に専門化されたカスタムハードウェアによる楽しみや利益を除いて、独自のカーネルをコンパイルするLinuxユーザーを見つけるのは難しいでしょう。最近では、Linuxカーネルを自分でコンパイルする必要はほとんどありません。

その理由に加えて、必要なときにカーネルをコンパイルする方法についての簡単なチュートリアルがあります。

既存のカーネルを更新する

おしゃれな新しいグラフィックカードやWiFiチップセットを搭載した新しいラップトップを持っている場合でも、新しいプリンターを持ち帰ったばかりの場合でも、オペレーティングシステム(GNU + Linuxまたは単にLinuxと呼ばれます。これはカーネルの名前でもあります) )その新しいコンポーネント(グラフィックカード、WiFiチップ、プリンターなど)への通信チャネルを開くためのドライバーが必要です。新しいデバイスを接続してコンピュータが表示される場合、誤解を招く可能性があります。 それを認める。しかし、それであなたを騙してはいけません。時々それは 必要なものはすべてありますが、OSが一般的なプロトコルを使用して接続されているデバイスをプローブしている場合もあります。

たとえば、コンピュータが新しいネットワークプリンタを識別できる場合がありますが、これは、プリンタのネットワークカードがネットワークに対して自身を識別するようにプログラムされているため、DHCPアドレスを取得できる場合があります。これは、印刷されたテキストのページを作成するためにコンピュータがプリンタに送信する命令を知っていることを必ずしも意味するわけではありません。実際、コンピュータはデバイスがプリンタであることを実際には「認識」していないと主張するかもしれません。ネットワーク上の特定のアドレスにデバイスがあり、デバイスが一連の文字で自分自身を識別することだけが表示される場合があります p-r-i-n-t-e-r 。人間の言語の慣習は、コンピューターにとって無意味です。必要なのはドライバーです。

カーネル開発者、ハードウェアメーカー、サポート技術者、および愛好家はすべて、新しいハードウェアが絶えずリリースされていることを知っています。それらの多くはドライバーを提供し、Linuxに含めるためにカーネル開発チームに直接提出されます。たとえば、NvidiaグラフィックカードドライバはNouveauカーネルモジュールに書き込まれることが多く、Nvidiaカードは一般的であるため、コードは通常、一般的な使用のために配布されるカーネル(FedoraまたはUbuntuをダウンロードしたときに取得するカーネルなど)に含まれます。 Nvidiaはあまり一般的ではありません。たとえば、組み込みシステムでは、Nouveauモジュールは通常除外されます。同様のモジュールは、他の多くのデバイスにも存在します。プリンターにはFoomaticとCUPSのメリットがあり、ワイヤレスカードにはb43、ath9k、wlモジュールなどがあります。

>

ディストリビューションは、ドライバーのインストールを必要とせずに、デバイスを接続してすぐに使用できるようにするため、Linuxカーネルビルドに合理的に可能な限り多く含まれる傾向があります。ほとんどの場合、それが起こります。特に、多くのデバイスベンダーが、販売するハードウェアのLinuxドライバー開発に資金を提供し、それらのドライバーをカーネルチームに直接提出して一般に配布しているためです。

ただし、6か月前にインストールしたカーネルを、1週間前に店頭に並ぶエキサイティングな新しいデバイスで実行している場合もあります。その場合、カーネルにそのデバイス用のドライバーがない可能性があります。幸いなことに、そのデバイスのドライバーはカーネルのごく最近のエディションに存在することがよくあります。つまり、実行しているものを更新するだけです。

通常、これはパッケージマネージャーを介して行われます。たとえば、RHEL、CentOS、Fedoraの場合:

$ sudo dnf update kernel

DebianとUbuntuでは、最初に現在のカーネルバージョンを取得します:

$ uname -r
4.4.186

新しいバージョンを検索する:

$ sudo apt update
$ sudo apt search linux-image

見つけた最新バージョンをインストールします。この例では、利用可能な最新のものは5.2.4です:

$ sudo apt install linux-image-5.2.4

カーネルのアップグレード後、再起動する必要があります(kpatchまたはkgraftを使用している場合を除く)。次に、必要なデバイスドライバーが最新のカーネルに含まれている場合、ハードウェアは期待どおりに機能します。

カーネルモジュールをインストールする

ディストリビューションは、ユーザーがデバイスを頻繁に使用することを期待していない場合があります(または、少なくともデバイスドライバーがLinuxカーネルに含まれている必要があるほど十分ではありません)。 Linuxはドライバーに対してモジュラーアプローチを採用しているため、ディストリビューションは、ドライバーがカーネル自体にコンパイルされていなくても、カーネルによってロードできる個別のドライバーパッケージを出荷できます。これは便利ですが、ドライバーがカーネルに含まれていないが起動時に必要な場合、またはカーネルがモジュラードライバーの下から更新される場合は、複雑になる可能性があります。最初の問題はinitrdで解決されます (初期RAMディスク)そしてこの記事の範囲外であり、2番目は kmodと呼ばれるシステムによって解決されます 。

kmodシステムは、カーネルが更新されるときに、カーネルと一緒にインストールされているすべてのモジュラードライバーも更新されることを保証します。ドライバーを手動でインストールすると、kmodが提供する自動化を見逃してしまうため、kmodパッケージが利用可能な場合はいつでもそれを選択する必要があります。たとえば、NvidiaドライバーはNouveauドライバーとしてカーネルに組み込まれていますが、公式のNvidiaドライバーはNvidiaによってのみ配布されます。 Webサイトにアクセスし、 .run をダウンロードすることにより、Nvidiaブランドのドライバーを手動でインストールできます。 ファイルを作成し、それが提供するシェルスクリプトを実行しますが、新しいカーネルをインストールした後は、同じプロセスを繰り返す必要があります。これは、パッケージマネージャーにカーネルドライバーを手動でインストールしたことを通知するものがないためです。 Nvidiaはグラフィックスを駆動するため、Nvidiaドライバーを手動で更新するということは、機能するグラフィックスドライバーがないとグラフィックスがないため、通常は端末から更新を実行する必要があることを意味します。

ただし、Nvidiaドライバーをkmodパッケージとしてインストールする場合、カーネルを更新するとNvidiaドライバーも更新されます。 Fedoraおよび関連について:

$ sudo dnf install kmod-nvidia

Debianおよび関連:

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

これは単なる例ですが、実際にNvidiaドライバーをインストールする場合は、Nouveauドライバーもブラックリストに登録する必要があります。最良の手順については、ディストリビューションのドキュメントを参照してください。

ドライバーをダウンロードしてインストールします

すべてがカーネルに含まれているわけではなく、すべてがその他であるとは限りません。 カーネルモジュールとして利用可能です。場合によっては、ハードウェアベンダーによって作成およびバンドルされた特別なドライバーをダウンロードする必要があります。また、ドライバーはありますが、ドライバーオプションを構成するためのフロントエンドはありません。

2つの一般的な例は、HPプリンターとWacomイラストレーションタブレットです。 HPプリンターを入手した場合は、プリンターと通信できる汎用ドライバーを使用している可能性があります。あなたも印刷できるかもしれません。ただし、汎用ドライバーでは、両面印刷、丁合い、用紙トレイの選択など、モデルに固有の特殊なオプションを提供できない場合があります。 HPLIP(HP Linux Imaging and Printingシステム)は、ジョブの管理、印刷オプションの調整、該当する場合は用紙トレイの選択などのオプションを提供します。

HPLIPは通常、パッケージマネージャーにバンドルされています。 「hplip」を検索するだけです。

同様に、デジタルアーティスト向けの主要なイラストタブレットであるWacomタブレットのドライバーは通常、カーネルに含まれていますが、圧力感度やボタン機能などの設定を微調整するオプションには、デフォルトで含まれているグラフィカルコントロールパネルからのみアクセスできます。 GNOMEですが、追加パッケージとしてインストール可能 kde-config-tablet KDEで。

カーネルにドライバーがないが、パッケージマネージャーからダウンロードしてインストールできるRPMまたはDEBファイルとしてドライバーモジュールのkmodバージョンを提供するエッジケースがいくつかある可能性があります。

独自のカーネルのパッチとコンパイル

21世紀の未来的なユートピアでも、インストール可能なドライバーを提供するのに十分なオープンソースを理解していないベンダーがあります。このような企業は、ドライバーのソースコードを提供している場合がありますが、コードのダウンロード、カーネルへのパッチ適用、コンパイル、および手動でのインストールを期待しています。

この種の配布モデルには、kmodシステムの外部にパッケージ化されたドライバーをインストールする場合と同じ欠点があります。カーネルを新しいものに交換するたびにカーネルに手動で再統合する必要があるため、カーネルを更新するとドライバーが壊れます。

Linuxカーネルチームが企業とのコミュニケーションを大声で懇願するという素晴らしい仕事をしてくれたため、そして企業がついにオープンソースがすぐになくなることはないことを受け入れたため、これはまれになりました。しかし、カーネルパッチのみを提供するノベルティまたはハイパースペシャライズドデバイスはまだ存在します。

公式には、システムのこのような重要な部分のアップグレードにパッケージマネージャーを関与させ続けるために、カーネルをコンパイルする方法について、ディストリビューション固有の設定があります。パッケージマネージャーが多すぎて、それぞれをカバーできません。例として、 rpmdevなどのツールを使用すると舞台裏で何が起こるかを次に示します。 Fedoraまたはビルドエッセンシャル およびdevscripts Debianで。

まず、いつものように、実行しているカーネルのバージョンを確認します。

$ uname -r

ほとんどの場合、カーネルをまだアップグレードしていない場合は、アップグレードしても安全です。結局のところ、問題は最新のリリースで解決される可能性があります。それを試しても機能しなかった場合は、実行しているカーネルのソースコードをダウンロードする必要があります。ほとんどのディストリビューションにはそのための特別なコマンドが用意されていますが、手動で行うには、kernel.orgでソースコードを見つけることができます。

また、カーネルに必要なパッチをダウンロードする必要があります。これらのパッチはカーネルリリースに固有のものである場合があるため、慎重に選択してください。

ソースコードとパッチを/usr / src / linux に配置するのは伝統的であるか、少なくとも人々が定期的に独自のカーネルをコンパイルしたときのことです。 。

必要に応じて、カーネルソースとパッチファイルをアーカイブ解除します。

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d ../patch*bz2

パッチファイルには、パッチの実行方法に関する説明が含まれている場合がありますが、多くの場合、ツリーの最上位から実行されるように設計されています。

$ patch -p1 < patch*example.patch

カーネルコードにパッチが適用されると、古い構成を使用して、パッチが適用されたカーネル構成を準備できます。

$ make oldconfig

古い設定を作成 コマンドには2つの目的があります。現在のカーネルの構成を継承することと、パッチによって導入された新しいオプションを構成できることです。

make menuconfigを実行する必要がある場合があります コマンド。これは、新しいカーネルで可能なオプションのncursesベースのメニュー方式のリストを起動します。メニューは圧倒される可能性がありますが、古い構成を基盤として開始されるため、メニューを調べて、持っていないことがわかっていて必要になるとは思わないハードウェアのモジュールを無効にすることができます。または、ハードウェアの一部があり、それが現在の構成に含まれていないことがわかっている場合は、モジュールとして、またはカーネルに直接ビルドすることを選択できます。理論的には、これは必要ありません。おそらく、現在のカーネルはあなたをうまく処理していたのですが、パッチが不足しているためです。おそらく、適用したパッチによって、最初にカーネルにパッチを適用するように促されたデバイスに必要なすべてのオプションがアクティブになります。 。

次に、カーネルとそのモジュールをコンパイルします。

$ make bzImage
$ make modules

これにより、 vmlinuzという名前のファイルが残ります。 、これは起動可能なカーネルの圧縮バージョンです。古いバージョンを保存し、新しいバージョンを / bootに配置します ディレクトリ:

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

これまで、カーネルとそのモジュールにパッチを適用してビルドし、カーネルをインストールしましたが、モジュールはインストールしていません。これが最後のビルドステップです:

$ sudo make modules_install

新しいカーネルが配置され、そのモジュールがインストールされます。

最後のステップは、ブートローダーを更新して、カーネルの前にロードされるコンピューターの部分がLinuxの場所を認識できるようにすることです。 GRUBブートローダーを使用すると、このプロセスが比較的簡単になります。

$ sudo grub2-mkconfig
実際のコンパイル

もちろん、現在、これらの手動コマンドを実行する人は誰もいません。代わりに、ディストリビューションのメンテナが使用する開発者ツールセットを使用してカーネルを変更する手順については、ディストリビューションを参照してください。このツールセットは、おそらくすべてのパッチが組み込まれた新しいインストール可能なパッケージを作成し、パッケージマネージャーにアップグレードを警告し、ブートローダーを更新します。

カーネル

オペレーティングシステムとカーネルは不思議なものですが、それらがどのコンポーネント上に構築されているかを理解するのにそれほど時間はかかりません。次回、Linuxで機能しないように見える技術を入手したときは、深呼吸をして、ドライバーの可用性を調査し、抵抗が最も少ない方法を選択してください。 Linuxはこれまでになく簡単になり、カーネルも含まれています。


Linux
  1. Linux でハードウェア クロックをプログラムで設定するにはどうすればよいですか?

  2. Linux カーネルが使用するキャッシュを消去する方法

  3. Linux でハードウェア モデルを見つけるにはどうすればよいですか?

  1. Linuxがメインフレームに登場した経緯

  2. Linuxカーネルテストのライフサイクル

  3. Linuxデスクトップでカーネルをアップグレードする方法

  1. Linux – Linuxカーネルシステムコールの実装を見つける方法は?

  2. Linux –どのモジュールがカーネルを汚染しているかを判断する方法は?

  3. Linux カーネルは __init 呼び出しの順序をどのように決定しますか?