Linuxカーネルのコンパイル: スタンドアロンOS

Linuxカーネルのコンパイル: スタンドアロンOS

こんにちは、私は Linux カーネルのコンパイルが初めてなので、いくつか質問があります。Linux カーネルをコンパイルすると、Linux ディストリビューションに依存しない完全にスタンドアロンの OS が構築されるのでしょうか?

もしそうなら... initramfs コマンドを使用して initrd ファイルを作成したいときに、実行中の Linux の破壊に関する情報が追加されるのはなぜですか (Ubuntu 10.4 を実行しています)?

コンパイルした Linux にモジュールをコンパイルして追加するにはどうすればよいでしょうか。また、それらをどこに配置すればよいでしょうか。

これは私がやってきたことの要約です:

1.カーネルソース(3.4.1)を取得し、「make all」コマンドを使用してコンパイルします(現在のLinux .configを使用します)

  1. メモリースティックにGRUBをインストールする

  2. コンパイルしたbzImageをメモリスティックの/bootディレクトリに置く

  3. 「initramfs」コマンドを使用して initrd ファイルを作成し、それを /boot にも配置します。

  4. メモリスティックを使用してPCを起動し、grub>ターミナルに入る

  5. 「root (hd0,0)」; 「kernel /boot/bzImage」; 「initrd /boot/initrd.img」、そして「boot」コマンドを使用して起動します。

  6. 「/lib/modules/3.4.1/modules.dep」ファイルが見つからないというエラーが表示された後、(initramfs) ターミナルに入ります。

何が間違っているのでしょうか?

答え1

Linux カーネルをコンパイルすることで、Linux ディストリビューションに依存しない完全にスタンドアロンの OS を構築することになりますか?

いいえ。Linux自体はオペレーティングシステムではありません。単なるカーネルです。ユーザーランドは、システム ライブラリと基本ソフトウェアのコレクションで構成されており、コンピュータとのやり取りを容易にするために必要です。私たちが一般的に「Linux」と呼んでいるものは、GNU プロジェクトと呼ばれる別のプロジェクトによって提供されています。技術的には、これを「GNU/Linux」と呼ぶべきです (実際にそう呼ぶ人もいます)。

さて、initramfs コマンドを使用して initrd ファイルを作成したい場合、実行中の Linux の破壊に関する情報が追加されるのはなぜですか (Ubuntu 10.4 を実行しています)?

initrd には、起動時にシステムを初期設定し、必要なドライバーとデーモンをロードし、ハード ドライブ上の必要なパーティションを見つけてマウントするなどの一連のプログラムが含まれているためです。これは実際には、ディストリビューションだけでなく、特定のインストール、構成、およびコンピューターに合わせてカスタマイズされています。一般に、他のユーザーの initrd と互換性はありません。そのため、システムによって生成される必要があります。

コンパイルした Linux にモジュールをコンパイルして追加するにはどうすればよいでしょうか。また、それらをどこに配置すればよいでしょうか。

独自のカーネルをコンパイルする場合は、おそらくmake menuconfigコンパイル前にカーネル ソース ディレクトリで作業することになります。これにより、コンパイルする機能と、それらをカーネル バイナリに統合するか、モジュールとして利用できるようにするかを選択できます。

これは私がやってきたことの要約です:

これが期待通りに機能しない理由はいくつかあります。

カーネルソース (3.4.1) を取得し、「make all」コマンドを使用してコンパイルします (現在の Linux .config を使用します)

Ubuntu 10.04 を実行している場合、これは Linux カーネルの 3.x ブランチよりもかなり古く、3.4 よりもかなり古いものです。少なくとも、膨大な追加作業を行わない限り、正しく動作しない可能性が高くなります。構成ファイルもかなり変更されており、(おそらく Linux 2.6 用の) 構成ファイルの内容が 3.4 での処理方法と一致していないというエラーが次から次へと表示されないことに、正直驚いています。また、Ubuntu はカーネルに必要な機能を追加し、システム内の他のすべてとうまく連携するようにパッチを当てているため、kernel.org からプレーンなバニラ カーネル ソースではなく、Ubuntu のカーネル ソース パッケージをダウンロードすることをお勧めします。最後に、いくつかの手順が抜けていますが、これについては後で説明します。

コンパイルしたbzImageをメモリスティックの/bootディレクトリに置く

何を意図しているのかわかりませんが、メモリ スティックに Linux の完全起動インストールをインストールするのであれば、それだけではありません。たとえば、そのメモリ スティックにはユーザーランドのものは何も入っていません。これが実際に行うことは、適切に設定されていれば、メモリ スティック上のカーネルを使用してハード ドライブ上の Ubuntu インストールを実行する (試みる) ことです。これは機能するはずですが、ハード ドライブにカーネルをインストールするのではなく、なぜそうするのでしょうか。既存のカーネルと並行してインストールできるので、自由に切り替えられます。

「/lib/modules/3.4.1/modules.dep」ファイルが見つからないというエラーが表示された後、(initramfs) ターミナルに入ります。

これは、先ほど述べた、見落としていた手順に戻ります。make modules_install新しいカーネルのモジュールを に配置する必要があります/lib/modules

しかし...

これらはどれも実際には重要ではありません。なぜなら、非常に特別な必要性がない限り、理想的にはカーネルを「従来の」方法でコンパイルすべきではないからです。今日では、実際に独自のカーネルをコンパイルする必要がある場合、ほとんどのディストリビューションには、カスタム カーネル バージョン (該当する場合) を使用し、ビルド プロセスを自動化し、必要に応じてクリーンにインストールおよび削除できるようにカーネルをパッケージとしてインストールし、新しいカーネルまたは古いカーネルを選択できるようにブートローダーを構成する方法があります。Ubuntu では、次の手順に従ってください。カーネル/コンパイル - Ubuntu Wiki

これは、単に楽しみのためや教育目的で「昔ながらの」方法でカーネルをコンパイルできないという意味ではありません。私は最初のカーネルをその方法でコンパイルしましたが、これはもっと良い方法が存在する前のことでした。システムが壊れないことが重要な場合は、ディストリビューションの推奨方法を使用し、そのソースとパッケージ管理を使用してください。

答え2

Linux カーネルを再コンパイルまたはコンパイルしても、新しいディストリビューションは作成されません。カーネルの新しいバージョンまたは異なるバージョンを作成するだけです。カーネルは、PC が POST プロセスを完了した後にブートローダーによって読み込まれ、実行される単一のファイルです。

ディストリビューションは、標準の UNIX ユーティリティ、通常はパッケージ マネージャーなど、非常に多くのファイルで構成されています。独自のカーネルを (再) コンパイルする場合、これらのファイルは一切変更されません。

独自のカーネルをコンパイルしてからしばらく経ちましたが、コマンドdepmod -aの後に実行する必要があると思いますmake

関連情報