web-dev-qa-db-ja.com

Linuxカーネルを実行するにはファイルシステムが必要ですか?

私の意見はそうです。外の世界(非特権プロセッサモード)へのすべての有用な露出は、最初に外の世界で実行されているプロセスを必要とするためです。それには、一時的なRAM内のファイルシステムでさえ、ファイルシステムが必要になります。

別のエンジニアが私に反対しますが、私が知らないすべてのケースを超えてこれを証明することはできません。

この質問に対する答えは、「ランニング」の定義に依存しますか?

20
Peter L.

プログラムを実行するようにカーネルを実行しないため、これは奇妙な質問です。カーネルは、プログラムを実行するプラットフォームです。もちろん、セットアップとシャットダウンのコードがありますが、カーネルを単独で実行することはできません。常にメインの「init」プロセスが必要です。そして、カーネルがなければ、パニックになります。 initがカーネルを終了しようとすると、パニックになります。

最近のinitプロセスはsystemdのようなものです。特に指定がない場合、カーネルは/sbin/initで始まる場所のリストからプログラムを実行しようとします。こちらのinit Paramをご覧ください http://man7.org/linux/man-pages/man7/bootparam.7.html 緊急時には、init=/bin/bashを使用してLinuxを起動できます。ただし、実行するファイルシステム上のファイルを常に指定する方法に注意してください。

したがって、カーネルが起動するとファイルシステムがない場合、カーネルはパニックになります。ファイルシステムがないと、initをロードする方法がないためです。

カーネルがドライバをロードしてファイルシステムにアクセスする必要がある、ニワトリと卵の状況が原因で、混乱が生じる場合があります。これを回避するために、重要なドライバとセットアップスクリプトを含むディスク上のイメージから初期RAMディスクがロードされます。これらは、ファイルシステムがロードされる前に実行されます。ただし、最初のRAMディスク自体がファイルシステムであることは間違いありません。最初のramdiskで/initが呼び出されます(これは最初のramdiskに格納されています)。多くのディストリビューションでは、最終的にこれが/sbin/initを呼び出します。これもファイルシステムなしでは不可能です。

28
Philip Couling

答えは、ファイルシステムなしで文字通り意味するのか、それとも質問が実際の記述方法とは少し異なる解釈を意図されているのかによって異なります。質問の解釈方法のわずかな違いに対する答えは次のとおりです。

  • ブロックデバイスなしでLinuxを実行することは、完全に実行可能であり、一部の特殊なユースケースに役立ちます。
  • ファイルシステムなしでLinuxを実行するには、カーネルコードの一部を書き換える必要があるため、有用な作業とは言えません。
  • ファイル記述子を使用せずにLinuxを実行するには、多くの労力が必要になります。私はそれが努力の価値がないと確信しています。

カーネルコードの一部を書き換えて、ファイルシステムなしで動作するシステムにする必要がある理由は次のとおりです。

  • すべてのスレッドには、ルートディレクトリと現在の作業ディレクトリがあり、ファイルシステムをポイントする必要があります。
  • プログラムは、ファイルシステムからの実行可能ファイルを必要とするexecveシステムコールによって開始されます。
  • カーネルは、ブートプロセス中にメモリベースのファイルシステムを作成します。

execveを使用してプログラムが開始された後、それを開始した実行可能ファイルをマップ解除することができますが、これを行うには、すぐにクラッシュせずに、実行可能メモリマッピングを作成する必要があります。 tファイルに支えられており、ジャンプして実行可能ファイルのマッピングを解除する前に、有用なコードで初期化する必要があります。

したがって、実行中のユーザーモードプログラムは、ファイルにバッキングされたメモリマッピングがない状態で存在し、ファイルにバッキングされたすべてのファイル記述子を閉じることができます。ルートディレクトリと現在の作業ディレクトリを持つことを止めることはできませんが、それらを控えることができます。

したがって、この状態でカーネルコードを実装して、ファイルシステムをプログラムの下から引き離し、実行を継続させることはできますが、実用的ではないようです。そして、ファイルシステムを使用するという中間状態を経由せずにその最終状態に到達することは、有益な利点がないため、さらに多くの作業になるでしょう。

一部の特殊なユースケースに役立つ設定

ブロックデバイスの使用を回避すると便利な場合があります。ブート時に、カーネルはメモリファイルシステムを作成し、cpioを実行する前に、そのファイルシステムにinitアーカイブの内容を取り込むこともできます。このようにして、システムを完全にメモリベースのファイルシステムから実行できます。

これは、状態を保持したくないシステムで、システムを再起動時に白紙の状態から開始したい場合に役立ちます。

もちろん、カーネルに制御を与える前に、カーネルとcpioアーカイブが何らかの方法でメモリに存在する必要があります。彼らがそこに着いた方法は、ブートローダーの仕事です。最終的に実行中のシステムがブロックデバイスを使用していない場合でも、ブートローダーはそれらをブロックデバイスからロードできます。ただし、ネットワーク経由で起動するなどして、ブロックデバイスを使用せずに、ブートローダーがカーネルとcpioアーカイブを取得することもできます。

16
kasperd

Linuxでは、ほぼ すべてのデバイスはファイルです なので、実行するにはファイルシステムが必要です。

3
K7AAY