web-dev-qa-db-ja.com

LinuxまたはUnixの「/」は起動時にどのようにマウントされますか?

デバイスはパスにマウントできます。たとえば、「/ dev/sda1」は「/ home/user」にマウントできます。私が理解していないのは、起動時に「/」がどのようにどこにマウントされるかです。説明する助けはありますか?

4
claOnline

Unixシステムの起動中、カーネルは通常の操作では実行しないいくつかのことを実行します。これらの1つは、ディレクトリ/にファイルシステムをマウントすることです。マウントはmountシステムコールによってトリガーされず、ターゲットディレクトリは既存のディレクトリではないため、これは通常のマウント操作とはまったく異なります。もう1つは、 PID 1としてプログラムを実行する です。これは、 既存のプロセスを複製する なしでプロセスを作成するため、通常の操作とは異なります。

ルートディレクトリのこの「魔法の」マウント方法は、Unixのバリアントによって大きく異なります。カーネルは、さまざまな方法で指定できる構成パラメーターに基づいて、マウントするデバイスを選択します。コンパイル時の構成、カーネルイメージのランタイム構成、事前定義されたメモリ位置のランタイム構成、コマンドラインパラメーターなど。お使いのマシンで動作する場合は、Unixバリアントのドキュメントを調べて、マシンがどのように構成されているかを確認する必要があります。

それがどのように機能するかを理解するために、最新のLinuxカーネルがどのように動作するかの概要を以下に示します。 Linuxには多くの歴史とさまざまなユースケースがあるため、これは最も単純な例ではありません。

  • Linuxは、パス/に接続された「特別な」ファイルシステムから開始できます。このファイルシステムはRAMに保存されたファイルで構成されています。この特別なファイルシステムは initramfs ;と呼ばれます。これは、rootfsファイルシステムタイプのインスタンスです。 initramfsには、ブートローダーによってアーキテクチャに依存するプロトコルを介して渡され、ブートローダーによってメモリにロードされるカーネルイメージに直接コンパイルされたコンテンツが入力されます。
  • あるいは、Linuxは、カーネルの初期化コードによって認識される、制限された(ただし大きな)ボリュームタイプのセットの一部である/にデバイスをマウントできます。このようなデバイスタイプには、一般的なタイプのディスク(ATA、USBなどを含む漠然とSCSIのようなもの)上の一般的なタイプのパーティション上のファイルシステム、およびRAMディスクとNFSマウント)が含まれます。
  • 使用されたパスに応じて、最初のルートファイルシステムは後でシャドウイングされるか、別のファイルシステムに置き換えられる可能性があります。シャドウイングはinitramfsで発生することであり、それがほとんどのデスクトップおよびサーバーシステムの動作方法です(一方、組み込みシステムにはハードコードされたルートファイルシステムがあることがよくあります)。置換は、特定の種類のRAMディスクである initrd で発生します。initramfsまたはinitrdの仕事は、「実際の」を提供するドライバーをロードすることです。 」通常の操作で使用されるルートファイルシステム。

これは、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段階のブートストラップ のドキュメントも紹介します。

5
Kusalananda