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


19

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

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

この質問に対する答えは、「実行中」の定義に依存しますか?


4
実行中のカーネルは「必要」ではないと思いますuseful exposure to the outside world
jsotola


1
カーネルに新しいコードを追加すると、何でもできます。できない場合は、実行しようとする時点init(最初のユーザー空間プロセス)まで正常に初期化され、失敗します。
user253751

1
...「ファイル名を指定して実行」の定義
するThorbjörnRavnアンデルセン

回答:


27

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

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

そのため、起動しないとカーネルにパニックが発生します。これがないと、initをロードする方法がないためです。

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


カーネルがハードウェアの初期化と既知のファイルシステム(init paramsを介してカーネルに渡されたinitrdではない)のロードを試みてから、非常に限られたシェル(init = / bin / bashなし)にドロップしようとする状況はありませんか?また、/ bin / bashを起動するので、カーネルは、これを潜在的に排除できる他の.configオプションでビルドされたとしても、常にその最小限のファイルシステムを利用できるでしょうか?
ピーターL.

1
@PeterL。その制限シェルは、initrd / initramfs /そのカーネルで起動したもの(IIRC)のシェルです。
muru

3
initramfs(ramfsまたはtmpfsファイルシステムに抽出されるCPIOアーカイブ)カーネルにビルドできることに注意してください。カーネルとして「ファイルシステムが必要」とみなされるかどうかはあなた次第です。これは、カーネルのみを起動でき、カーネル以外は何も機能せず、機能する(少し制限されている場合)システムを持っているからです。また、カーネルにパッチを適用してinitが不要になった場合でも、公開されない内部仮想ファイルシステムが作成されることに注意してください。
フォレスト

@forestシステムは「制限」される必要はありません-systemdとgnomeをinitrdにパックできます(実際に役立つものと一緒に;-))。initramfsの1つの制限は、それが拡張属性をサポートしていなかったこと(?まだ)であった-私はなかったその後のループデバイスとしてマウントされたinitrdのcpioのアーカイブにext4の画像を含むことにより、アンドロイドにその周り作業init.$DEV.rcスクリプト。
ビリーおじさん

1
@IsmaelMiguel、いや、それ自体initramfsはcpioアーカイブです。Squashfsは組み込みファイルシステムに適した選択肢であり、それを使用するinitrd(vs initramfs)を作成することもできます(用語は頻繁に交換可能に使用されますが、まったく同じものではありません)が、Linuxが展開する形式ではありませんinitramfs。(実際、squashfsイメージは、使用する前に解凍する必要はありません。適切にインデックス付けされています)。
チャールズダフィー

16

答えは、あなたが文字通りファイルシステムなしで意味するかどうか、または質問が実際に述べられている方法とは少し異なるように解釈されることを意図しているかどうかに依存するでしょう。質問の解釈方法のわずかなバリエーションに対する回答は次のとおりです。

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

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

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

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

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

そのため、この状態でカーネルコードを実装して、プログラムの下からファイルシステムをリッピングして実行し続けることはできますが、有用であるとは思えません。そして、ファイルシステムを使用する中間状態を経ずにその最終状態に到達することは、有益な利益がないためにさらに多くの作業を行うことになります。

いくつかの特殊なユースケースに役立つセットアップ

ブロックデバイスの使用を避けることは有用です。ブート中に、カーネルはメモリファイルシステムを作成します。また、cpio実行する前に、そのファイルシステムにアーカイブの内容を取り込むことができますinit。そうすれば、システムを完全にメモリベースのファイルシステムから実行することができ、システムをバックアップするブロックデバイスはありません。

これは、状態を保持したくないシステムや、再起動時にシステムがクリーンな状態から起動するようにしたい場合に役立ちます。

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


1
問題は、構築された構成のLinuxカーネルが(何も書き直さずに)ファイルシステムなしで「実行」できるかどうかです。便利なことをしたり、状態を保存したりする必要はありません。すべての答えから、少なくともシャットダウンするまで、カーネル自体の中に何らかのファイルシステムが提供され、想定されていることを理解してます。'/'でもファイルシステムです。ですから、答えを単純化するために「はい」と思います。
ピーターL.

2
@PeterL。はい、何も書き換えない場合、Linuxはファイルシステムを必要とします。ファイルシステムを使用しないLinuxの実用的な使用について話す場合、通常はブロックデバイスを使用したLinuxを指し、ブロックデバイスを使用したファイルシステムを使用せずにLinuxを実行できます。まだ何らかのファイルシステムがあります。
22:11のカスペルド

3

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


8
しかし、もちろん、デバイスファイルがそれらを指しているかどうかに関係なく、デバイスドライバーはカーネル内に存在します。
フィリップクーリング

6
すべてのデバイスがファイルであるとは限りません。たとえばeth0、ネットワークインターフェイス(wlan0など)はありません。
ルスラン

1
これはよくある誤解です。理論的には、すべてがUNIXおよびUNIXライクシステムのファイルですが、Plan 9のような高度に専門化されたシステムにのみ完全に当てはまります(ただし、Windowsよりもはるかに当てはまります)。Linuxの場合、かなり多くのものがファイルではありません。多くのドライバーがキャラクターデバイス(ファイル)でioctlではなくnetlinkを使用し始めているため、これはますます真実になっています。
フォレスト

@forest Plan 9は「高度に専門化された」システムではありません。UnixやWindowsのような汎用システムであると想定されていました(Unixの置き換えに失敗し、研究システムのままであった理由はまったく異なります)。とにかく、Linuxと同じように、plan9は仮想化されたインターフェイスをハードウェアに公開しています(ioctlがありません-これでnetlinkとioctlの要素をどのように使用するかわかりません)。ネットワークインターフェースはファイルシステム経由でアクセス可能です)。名前空間の導入により、Linuxはすでに従来のUNIXよりもplan9に似ています。
ビリーおじさん

1
非常に良い議論:定義ごとにファイルシステムであるdevfsが存在するか、devfsが存在しない場合、デバイスノードをホストするファイルシステムが必要です...
pmf

-1

カーネルは他のプログラムと同様にプログラムです。デフォルトでは、Linuxカーネルはファイルシステムへのアクセスを試みますが、この動作は、カーネルの変更(実際には「arch_call_rest_init()」関数の追加)によって簡単に排除できます。「有用な作業」を実行するには、開発者がカスタムドライバーにカーネルスレッド(kthreads)、perhaposを含めて、必要な初期化とアプリケーションタイプのワークロードを実行することを期待します。Linuxカーネルにはすでに多くのkthreadが含まれていますが、主にカーネルまたはドライバーに付随する作業を実行するためのものです。カーネルコンテキスト内で使用可能なAPIは、Linuxユーザー空間で使用可能なAPIとはまったく異なります。ファイルシステムが存在しないシナリオでは、システムコール機能の大部分は役に立たなくなります。

はい、Linuxはデフォルトでファイルシステムへのアクセスを想定しています。いいえ、変更されたカーネルは、ファイルシステムなしで有用な作業を実行するように作成できます。Linux w / oファイルシステムの実際の使用はIMOにかなり制限されていますが、ゼロではありません。FWIWは、これまで多くのリアルタイムカーネルがRTアプリケーションと同じネームスペースとバイナリに組み込まれていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.