初期RAMディスク

Linuxシステムにおいて、 initrd初期RAMディスク)は、Linuxの起動プロセスの一部として使用される一時的なルートファイルシステムをメモリにロードするための仕組みです。 (初期RAMディスク)と(初期RAMファイルシステムから)は、これを実現するための2つの異なる方法を指します。どちらも、実際のルートファイルシステムをマウントする前の準備としてよく使用されます。 initrdinitramfs

根拠

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

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

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

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

実装

mkinitcpioArch Linuxおよび関連ディストリビューションでinitramfsを生成するプログラム
dracut一部のLinuxディストリビューションでinitramfsを生成する別のプログラム

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

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

initrd方式では、イメージはファイルシステムイメージ(オプションで圧縮)であり、特別なブロックデバイス/dev/ram)で利用可能になり、初期ルートファイルシステムとしてマウントされます。[ 3 ]そのファイルシステムのドライバは、カーネルに静的にコンパイルされる必要があります。多くのディストリビューションは元々圧縮されたext2ファイルシステムイメージを使用していましたが、その他のディストリビューション(Debian 3.1 を含む)は、メモリが限られたシステムで起動するためにcramfsを使用していました。これは、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イメージを生成します。これらのinitrdイメージには通常、ルートファイルシステムの場所と種類が埋め込まれています。

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

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

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

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

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

ほとんどの初期ルートファイルシステムは、/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) でも同じものが使用されており、一部のウイルス対策ソフトウェアやバックアップ/障害復旧ソフトウェアの個別ブート バージョンのベースとして使用されています。

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

参照

参考文献

  1. ^ Almesberger, Werner (2000)、「Linuxのブート:歴史と未来」オタワLinuxシンポジウム議事録、2008年7月24日時点のオリジナルよりアーカイブ
  2. ^ a b Landley, Rob (2005年3月15日) 「initramfs の紹介:初期 RAM ディスクの新しいモデル」
  3. ^ a b Almesberger, Werner; Lermen, Hans (2000). 「初期RAMディスク(initrd)の使用」 2015年4月2日時点のオリジナルよりアーカイブ。 2015年3月14日閲覧
  4. ^ "linux/do_mounts_initrd.c at 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7 · torvalds/linux · GitHub" . GitHub .
  5. ^ a b Landley, Rob (2005年10月17日). 「ramfs、rootfs、initramfsのドキュメント、第2回」 . Linuxカーネルソースツリー.
  6. ^ Petersen, Richard Leland (2010). Fedora 13: 管理、ネットワーク、セキュリティ. アラメダ、カリフォルニア州: Surfing Turtle Press. p. 76. ISBN 978-1-936280-02-5Dracut は、GRUB カーネルのコマンドラインにリストされているカーネルパラメータを使用して、initramfs RAM ファイルシステムをオンザフライで構成し、柔軟性を高め、RAM ファイルシステムコードをさらに削減します。
  7. ^ 「Ubuntu Manpage: casper - initramfs-tools でライブシステムを起動するためのフック」 manpages.ubuntu.com . 2017年8月4日時点のオリジナルよりアーカイブ。 2017年8月7日閲覧
  8. ^ Shawn Powers .「Casper、フレンドリーでしつこい幽霊」 Linux Journal、2012年。
  9. ^ Kyungsik Lee (2013年5月30日). 「LZ4圧縮と起動時間の改善」(PDF) . events.linuxfoundation.org . p. 18. 2015年5月29日閲覧.
  10. ^ Fish, Richard (2005年7月6日). 「initramfsのpivot_rootがマウントツリーで循環参照を引き起こす」 . Linux Kernel Bug Tracker . 2009年2月28日閲覧
  11. ^ Garzik, Jeff (2002年11月2日). 「initramfsのマージ、Nのパート1」 . Linuxカーネルメーリングリスト.
  12. ^Tiny Core Linux - 概念」。ibiblio.org
  13. ^ Barry Kauler. Puppy Linux リリース発表」ibiblio.org .
  14. ^ 「Windows イメージング ファイル形式 (WIM)」 . microsoft.com . Microsoft.
  15. ^ 「公式Microsoftダウンロード センターから Windows イメージング ファイル形式 (WIM) をダウンロード」。Microsoft.com。Microsoft