初期 RAM ディスク

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

Linuxシステムでは、 (initrd初期ramdisk )は一時的なルートファイル システムメモリにロードするためのスキームであり、 Linux の起動プロセスの一部として使用されますinitrdそして、initramfsこれを達成するための 2 つの異なる方法を参照してください。両方とも、実際のルートファイル システムをマウントする前に準備を行うためによく使用されます。

根拠

多くのLinux ディストリビューションは、単一の汎用Linux カーネルイメージを出荷しています。これは、ディストリビューションの開発者がさまざまなハードウェアで起動するために特別に作成したものです。この汎用カーネル イメージのデバイス ドライバーは、ロード可能なカーネル モジュールとして含まれてます多くのドライバーを 1 つのカーネルに静的にコンパイルすると、カーネル イメージが非常に大きくなり、メモリが限られているコンピューターで起動するには大きすぎる可能性があります。また、場合によっては、存在しないハードウェアや競合するハードウェアをプローブすることにより、起動時のクラッシュやその他の問題が発生する可能性があります。この静的にコンパイルされたカーネル アプローチでは、使用されなくなった、または不要になったモジュールがカーネル メモリに残り、ブート時にルート ファイル システムをマウントするために必要なモジュールを検出してロードするという問題が発生します。ルートファイルシステムは. [1]

さらに複雑なことに、ルート ファイル システムは、ソフトウェアRAIDボリューム、LVMNFS (ディスクレス ワークステーション上)、または暗号化されたパーティション上にある可能性があります。これらはすべて、マウントするために特別な準備が必要です。[2]

もう 1 つの問題は、カーネルがハイバネーションをサポートしていることです。これは、メモリの内容全体のイメージをスワップ パーティションまたは通常のファイルにダンプしてから、電源をオフにすることで、コンピューターをディスクにサスペンドします。次回の起動時に、このイメージをメモリにロードし直す前に、このイメージにアクセスできるようにする必要があります。

非常に多くの特殊なケースの処理をカーネルにハードコーディングする必要がないようにするために、一時的なルート ファイル システム (現在は初期ユーザー空間と呼ばれる) を使用した初期ブート ステージが使用されます。このルート ファイル システムには、実際のルート ファイル システムをマウントするために必要なハードウェアの検出、モジュールのロード、およびデバイスの検出を行うユーザー空間ヘルパーを含めることができます。[2]

実装

mkinitcpio、 Arch Linuxおよび関連ディストリビューションでinitramfs を生成するプログラム

この初期ルート ファイル システムのイメージ(カーネル イメージと共に) は、Linuxブートローダーまたはコンピューターのブート ファームウェアからアクセスできる場所に保存する必要があります。これは、ルート ファイル システム自体、光ディスク上のブート イメージ、ローカル ディスク上の小さなパーティション (通常はext2またはFATファイル システムを使用するブート パーティション)、またはTFTPサーバー (イーサネットから起動できるシステム上) のいずれかです。 )。

ブートローダーは、カーネルと初期ルート ファイル システム イメージをメモリにロードしてからカーネルを起動し、イメージのメモリ アドレスを渡します。ブート シーケンスの最後に、カーネルはデータの最初の数ブロックからイメージのフォーマットを判別しようとします。これにより、initrd または initramfs スキームが使用される可能性があります。

initrdスキームでは、イメージはファイル システム イメージ (オプションで圧縮) である場合があり、これは特別なブロック デバイス( /dev/ram ) で使用可能になり、初期ルート ファイル システムとしてマウントされます。[3]そのファイル システムのドライバーは、カーネルに静的にコンパイルする必要があります。多くのディストリビューションはもともと圧縮されたext2ファイル システム イメージを使用していましたが、他の ( Debian 3.1 を含む)ディストリビューションはメモリが限られたシステムで起動するためにcramfsを使用していました。初期ルート ファイル システムが起動すると、カーネルは最初のプロセスとして/linuxrcを実行します。[4]終了時に、カーネルは実際のルート ファイル システムがマウントされていると想定し、 /sbin/initを実行して通常のユーザー空間のブート プロセスを開始します。[3]

initramfsスキーム (Linux カーネル 2.6.13 以降で使用可能) では、イメージはcpioアーカイブ(オプションで圧縮) の場合があります。アーカイブは、カーネルによって初期ルート ファイル システムとなるtmpfsの特別なインスタンスに解凍されます。この方式には、中間ファイル システムやブロック ドライバーをカーネルにコンパイルする必要がないという利点があります。[5]一部のシステムでは、dracutパッケージを使用して initramfs イメージを作成します。[6] initramfs スキームでは、カーネルは/initを、終了しないと予想される最初のプロセスとして実行します。[5]一部のアプリケーションでは、initramfs で casper を使用できますユーティリティを使用して、unionfsを使用して書き込み可能な環境を作成し、読み取り専用のルート ファイルシステム イメージに永続化レイヤーをオーバーレイします。たとえば、オーバーレイ データはUSB フラッシュ ドライブに保存できますが、ライブ CDに保存された圧縮されたSquashFS読み取り専用イメージはルート ファイルシステムとして機能します。[7] [8]

静的にコンパイルされたアルゴリズムに応じて、カーネルはgzipbzip2LZMAXZLZOLZ4[9]およびzstdで圧縮された initrd/initramfs イメージを解凍できます。

マウントの準備

Debianなどの一部の Linux ディストリビューションは、 ATASCSI、ファイルシステムカーネル モジュールなど、特定のコンピューターを起動するために必要なものだけを含む、カスタマイズされた initrd イメージを生成しますこれらは通常、ルート ファイル システムの場所とタイプを埋め込みます。

他の Linux ディストリビューション ( FedoraUbuntuなど) は、より一般的な initrd イメージを生成します。これらは、ルート ファイル システム (またはそのUUID ) のデバイス名のみで始まり、起動時に他のすべてを検出する必要があります。この場合、ソフトウェアは、ルート ファイル システムをマウントするために、タスクの複雑なカスケードを実行する必要があります。

  • ブート プロセスが依存するすべてのハードウェア ドライバーをロードする必要があります。一般的な方法は、一般的なストレージ デバイスのカーネル モジュールを initrd にパックし、ホットプラグエージェントを呼び出して、コンピューターの検出されたハードウェアに一致するモジュールを取り込むことです。
  • ブート スプラッシュ スクリーンを表示するシステムでは、ビデオ ハードウェアを初期化する必要があり、ユーザー空間ヘルパーが起動プロセスとロックステップでアニメーションをディスプレイに描画することを開始します。
  • ルート ファイル システムが NFS 上にある場合は、プライマリネットワーク インターフェイスを起動し、DHCPクライアントを呼び出して DHCP リースを取得し、NFS 共有の名前と NFS サーバーのアドレスをリースから抽出する必要があります。 、NFS 共有をマウントします。
  • ルート ファイル システムがソフトウェア RAID デバイス上にあるように見える場合、RAID ボリュームがどのデバイスにまたがっているかを知る方法はありません。標準のMD ユーティリティを呼び出して、利用可能なすべてのブロック デバイスをスキャンし、必要なデバイスをオンラインにする必要があります。
  • ルート ファイル システムが論理ボリューム上にあると思われる場合は、LVM ユーティリティを呼び出して、それを含むボリューム グループをスキャンしてアクティブ化する必要があります。
  • ルート ファイル システムが暗号化されたブロック デバイス上にある場合、ソフトウェアはヘルパー スクリプトを呼び出して、ユーザーにパスフレーズの入力やハードウェア トークン (スマート カードや USB セキュリティドングルなど)の挿入を求めるプロンプトを表示する必要があります。次に、デバイス マッパーで復号化ターゲットを作成します

一部のディストリビューションでは、特定のルールに一致するハードウェア デバイス、ディスク パーティション、およびストレージ ボリュームがオンラインになると、ヘルパー プログラムを呼び出すudevなどのイベント駆動型ホットプラグ エージェントを使用します。これにより、検出を並行して実行し、LVM、RAID、または暗号化の任意のネストに段階的にカスケードして、ルート ファイル システムを取得できます。

ルート ファイル システムが最終的に表示されると、マウントされたルート ファイル システムで実行できないメンテナンス タスクが実行され、ルート ファイル システムが読み取り専用でマウントされ、実行を継続する必要があるプロセス (スプラッシュ スクリーン ヘルパーやそのコマンドFIFO ) は、新しくマウントされたルート ファイル システムに引き上げられます。

最終的なルート ファイル システムを単純に/にマウントすることはできません。これは、最初のルート ファイル システム上のスクリプトとツールに最終的なクリーンアップ タスクでアクセスできなくなるためです。

  • initrd では、新しいルートが一時的なマウント ポイントにマウントされ、pivot_root(8) (この目的のために特別に導入された) でローテーションされます。これにより、初期ルート ファイル システムがマウント ポイント ( /initrdなど) に残されます。通常のブート スクリプトは、後でマウントを解除して、initrd によって保持されているメモリを解放できます。
  • initramfs では、最初のルート ファイル システムをローテーションすることはできません。[10]代わりに、単純に空にし、最終的なルート ファイル システムをその上にマウントします。

ほとんどの初期ルート ファイル システムは/linuxrcまたは/initをシェル スクリプトとして実装しているため、最小限のシェル (通常は/bin/ash ) といくつかの重要なユーザー空間ユーティリティ (通常はBusyBoxツールキット) が含まれています。スペースをさらに節約するために、シェル、ユーティリティ、およびそれらをサポートするライブラリは通常、スペースの最適化を有効にして ( gccの「-Os」フラグなどを使用して)コンパイルされ、この目的のために特別に作成されたC ライブラリの最小バージョンであるklibcに対してリンクされます。 . [11]

その他の用途

Linux ディストリビューションのインストーラーは通常、initramfs から完全に実行されます。これは、永続ストレージがセットアップされる前に、インストーラー インターフェイスとサポート ツールをホストできる必要があるためです。

Tiny Core Linux [12]Puppy Linux [13] [検証に失敗]は、完全に initrd から実行できます。

他のオペレーティング システムでの類似点

Windows Vista 以降、[14] Windows は、ファイル形式が公開されているWIMディスク イメージ ファイルから起動できます。[15]ハードリンクをサポートし、チャンクごとの圧縮を使用し、重複排除されたチャンクをサポートできることを除いて、ZIP 形式にかなり似ています。この場合、WIM 全体が最初に RAM にロードされ、続いてカーネルが初期化されます。次に、読み込まれた WIM は、ドライブ文字が割り当てられた SystemRoot として利用できます。Windows インストーラーはこれを使用して BOOT.WIM から起動し、インストールする Windows ファイルのコレクションとして INSTALL.WIM を使用します。

また、Windows プレインストール環境(Windows PE) も同じものを使用しており、一部のウイルス対策ソフトウェアおよびバックアップ/災害復旧ソフトウェアのセパレート ブート バージョンのベースとなっています。

物理ドライブに配置された WIM または VHD ファイルから常に起動するように Windows をインストールすることもできます。ただし、Windows ブート ローダーは、Linux で initrd を必要とするタスクであるブート時のカーネル モジュール自体の .sys ファイルをロードできるため、これが使用されることはめったにありません。

も参照

参考文献

  1. ^ Almesberger、Werner (2000)、「Booting linux: the history and the future」Proceedings of the Ottawa Linux Symposium 、 2008 年 7 月 24 日にオリジナルからアーカイブ
  2. ^ a b Landley, Rob (2005 年 3 月 15 日)、initramfs の紹介、初期 RAM ディスクの新しいモデル
  3. ^ a b Almesberger、Werner; ラーメン、ハンス(2000)。「初期 RAM ディスク (initrd) の使用」 . 2015 年 4 月 2 日にオリジナルからアーカイブされました2015年 3 月 14 日閲覧
  4. ^ "linux/do_mounts_initrd.c at 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds/linux · GitHub" . GitHub .
  5. ^ロブ ・ランドリー (2005 年 10 月 17 日) "ramfs、rootfs、および initramfs のドキュメント、2 を取得" . Linux カーネル ソース ツリー。
  6. ^ ピーターセン、リチャード・リーランド (2010). Fedora 13: 管理、ネットワーク、セキュリティカリフォルニア州アラメダ: サーフィン タートル プレス。p。76.ISBN _ 978-1-936280-02-5. Dracut は、GRUB カーネル コマンド ラインにリストされているカーネル パラメータを使用して initramfs RAM ファイル システムをオンザフライで構成し、柔軟性を高め、RAM ファイル システム コードをさらに削減します。
  7. ^ "Ubuntu Manpage: casper - initramfs-tools がライブ システムを起動するためのフック" . manpages.ubuntu.com
  8. ^ ショーン・パワーズ. 「キャスパー、フレンドリーな (そしてしつこい) ゴースト」 . Linux ジャーナル。2012年。
  9. ^ Kyungsik Lee (2013 年 5 月 30 日). 「LZ4 圧縮と起動時間の改善」(PDF) . events.linuxfoundation.orgp。18 . 2015年 5 月 29 日閲覧
  10. ^ フィッシュ、リチャード (2005 年 7 月 6 日)。「initramfs からの pivot_root により、マウント ツリーで循環参照が発生します」 . Linux カーネル バグ トラッカー2009年 2 月 28 日閲覧
  11. ^ Garzik、Jeff (2002 年 11 月 2 日). 「initramfs マージ、N のパート 1」 . Linux カーネル メーリング リスト
  12. ^ "Tiny Core Linux - 概念" . ibiblio.org
  13. ^ バリー・カウラー. 「パピーリナックス リリースのお知らせ」 . ibiblio.org
  14. ^ "Windows イメージング ファイル形式 (WIM)" . microsoft.com . マイクロソフト。
  15. ^ 「公式の Microsoft ダウンロード センターから Windows Imaging File Format (WIM) をダウンロードする」 . Microsoft.com . マイクロソフト。

外部リンク