デバイスはパスにマウントできます。たとえば、「/ dev/sda1」は「/ home/user」にマウントできます。私が理解していないのは、起動時に「/」がどのようにどこにマウントされるかです。説明する助けはありますか?
Unixシステムの起動中、カーネルは通常の操作では実行しないいくつかのことを実行します。これらの1つは、ディレクトリ/
にファイルシステムをマウントすることです。マウントはmount
システムコールによってトリガーされず、ターゲットディレクトリは既存のディレクトリではないため、これは通常のマウント操作とはまったく異なります。もう1つは、 PID 1としてプログラムを実行する です。これは、 既存のプロセスを複製する なしでプロセスを作成するため、通常の操作とは異なります。
ルートディレクトリのこの「魔法の」マウント方法は、Unixのバリアントによって大きく異なります。カーネルは、さまざまな方法で指定できる構成パラメーターに基づいて、マウントするデバイスを選択します。コンパイル時の構成、カーネルイメージのランタイム構成、事前定義されたメモリ位置のランタイム構成、コマンドラインパラメーターなど。お使いのマシンで動作する場合は、Unixバリアントのドキュメントを調べて、マシンがどのように構成されているかを確認する必要があります。
それがどのように機能するかを理解するために、最新のLinuxカーネルがどのように動作するかの概要を以下に示します。 Linuxには多くの歴史とさまざまなユースケースがあるため、これは最も単純な例ではありません。
/
に接続された「特別な」ファイルシステムから開始できます。このファイルシステムはRAMに保存されたファイルで構成されています。この特別なファイルシステムは initramfs ;と呼ばれます。これは、rootfsファイルシステムタイプのインスタンスです。 initramfsには、ブートローダーによってアーキテクチャに依存するプロトコルを介して渡され、ブートローダーによってメモリにロードされるカーネルイメージに直接コンパイルされたコンテンツが入力されます。/
にデバイスをマウントできます。このようなデバイスタイプには、一般的なタイプのディスク(ATA、USBなどを含む漠然とSCSIのようなもの)上の一般的なタイプのパーティション上のファイルシステム、およびRAMディスクとNFSマウント)が含まれます。これは、Ubuntuマシンのbootup(7)
マニュアルからのものです。
システムの起動には、さまざまなコンポーネントが関係しています。電源投入直後、システムBIOSは最小限のハードウェア初期化を行い、永続ストレージデバイスに保存されているブートローダーに制御を渡します。このブートローダーは、ディスク(またはネットワーク)からOSカーネルを呼び出します。 Linuxの場合、このカーネルは(オプションで)最初のRAMディスクイメージ(
initrd
)を抽出して実行します。たとえば、dracut(8)
によって生成されます。ルートファイルシステムの場合(おそらくこれにはsystemd(1)
を使用します)。ルートファイルシステムが検出されてマウントされた後、initrd
はホストのシステムマネージャー(systemd(1)
)OSイメージに保存され、OSイメージは、残りのすべてのハードウェアのプローブ、必要なすべてのファイルシステムのマウント、および構成されたすべてのサービスの生成を担当します。
これは_man boot
_で見つけたはずですが、読んでも答えは見つかりませんでしたが、マニュアルの下部にある「bootup(7)
も参照してください」を参照してください。
興味があったので、次にinitrd
のマニュアルを調べました。
最初の起動フェーズでは、カーネルが起動し、_
/dev/initrd
_の内容から初期ルートファイルシステムをマウントします(例:RAMブートローダーによって初期化されたディスク)。第2フェーズでは、追加のドライバーまたは他のモジュールが最初のルートデバイスのコンテンツからロードされます。追加のモジュールをロードした後、新しいルートファイルシステム(つまり、通常のルートファイルシステム)が別のデバイスからマウントされます。
「Unix」についておっしゃっていたので、OpenBSD 第1段階のシステムブートストラップ および 第2段階のブートストラップ のドキュメントも紹介します。