1. 概要

Linuxでは、 initrd (初期RAMディスク)コマンドと initramfs (初期RAMファイルシステム)コマンドは、一時ルートファイルシステムをRAMにロードするために使用できる異なるメソッドです。または正常に起動するためのシステムメモリ

カーネルをメモリにロードし、ルートファイルシステムをメモリからハードディスクにマウントするには、initrdまたはinitramfsファイルシステムが必要です。

initrdまたはinitramfsを使用して、実際のルートファイルシステムを(システムのハードディスクまたはストレージに)マウントする前に、カーネルの起動やハードウェアデバイスのセットアップなどの準備を行うことができます。

このチュートリアルでは、initrdinitramfsを詳しく見ていきます。 さらに、それらの相違点と類似点のいくつかを調査します

2. initrd とは何ですか?

initrdを使用すると、ブートローダーによってRAMディスクをロードできます。 ロードされたRAMディスクはルートファイルシステムとしてマウントされ、そこからさまざまなプログラムが実行されます。 別のデバイスから新しいルートファイルシステムをマウントして、ブートローダーに前者を移動させることもできます initrd 別のディレクトリにルートすると、マウントを解除できます。

initrd の主な設計は、システムの起動を前の2つのフェーズで実行できるようにすることでした。

  • カーネルは、コンパイルされたドライバーの最小セットを割り当てます
  • initrdからの追加モジュールのロード

initrd は通常、ブロックデバイスとして機能し、カーネルにコンパイルするには、 ext2 ext3 ext4などのファイルシステムドライバーが必要です。 ]。

カーネルがinitrdのファイルシステムを正常に検出するには、少なくとも1つの組み込みモジュールが使用可能である必要があります。

initrd ディスクのサイズは固定されているため、 initrd イメージの読み取りと書き込みの一般的な操作はすべて、システムのメインメモリに非効率的にバッファリングされます。

注: initrd は廃止され、initramfsに置き換えられました。

2.1. initrdを使用したブートプロセス

initrdブートプロセスのより詳細な説明を見てみましょう。

  • ブートローダーはカーネルと初期RAMディスクをロードします。
  • カーネルはinitrdをRAMディスクに変換します。 さらに、initrdが使用していたメモリをクリアします。
  • カーネルは/dev / ram0 ファイルパスでルートデバイスを検索し、見つからない場合、カーネルはchange_root手順に従います。
  • / dev / ram0 ディレクトリにある場合は、ルートファイルシステムとしてマウントされます。
  • Initは実際のファイルシステムをロードし、ivot_rootシステムコールを使用してルートファイルシステムをディレクトリに移動します。
  • Initは、新しく作成されたルートファイルシステムで / sbin / init を実行し、通常のブートシーケンスを実行します。
  • ブートローダーは、initrdファイルシステムを切断します。

注:ルートディレクトリを変更しても、必ずしもマウントを解除する必要はありません。 これにより、プロシージャ全体でプロセスをinitrdで実行したままにすることができます。 さらに、下にマウントされたファイルシステムに簡単にアクセスできます initrd。

2.2. initrdへのアクセス方法

新しいディレクトリを作成し、initrd.imgファイルを/boot/からコピーしましょう。

$ mkdir initrd_test
$ cd initrd_test
$ cp /boot/initrd.img .
$ ls
initrd.img

Debianのような一部のシステムでは、最初にinitrdファイルを抽出する必要があります。 ファイルの名前を.gz拡張子に変更して、抽出できるようにします。 さらに、 file を使用して、解凍されたファイルが実際にCPID形式であることを確認しましょう。

$ mv initrd.img initrd.img.gz
$ gunzip initrd.img.gz
$ file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)

cpioコマンドを使用して画像を抽出してみましょう。

$ cpio -id < initrd.img
62 blocks
$ ls
 initrd.img kernel

LinuxUbuntuOSでinitrd.imgファイルの内容を抽出しました。 抽出後に取得するファイルの数は、Linuxディストリビューションによって異なる場合があります。

3. initramfs とは何ですか?

initramfsは、メモリにロードされる初期ファイルシステムのcpioアーカイブファイルです。このロードは、カーネルがシステムの起動を終了した後、ユーザースペースがinitプロシージャを開始する前に行われます。 。

initramfsの内容は、メインルートがロードされる前にカーネルによって初期ルートファイルシステムとしてロードされます。初期ルートには、「実際の」ルートファイルシステムをマウントしてシステムを初期化するために必要なファイルが含まれます。 ファイルには主にカーネルモジュールが含まれています。

Linuxカーネルは互換性があり適応性があります。 これにより、ファイルの動的なロードやアンロードなどの機能をサポートできます。 カーネルのいくつかの部分をモジュールに変換できるため、Linuxシステムは、メインカーネルにコンパイルされた最低限の要素のみを使用してカーネルを構築できます。 さらに、他のすべての可能な機能またはハードウェアの機能をモジュールとして提供し、必要に応じてそれらをロードまたはアンロードできるようにします。

initramfs を使用すると、カーネルは特別なRAMファイルシステムからモジュールにアクセスすることもできます。 これにより、ディスクまたは別のファイルシステムからルートファイルシステムにアクセスできるようになります。

3.1. initramfsのしくみ

initramfs は、圧縮されたcpioアーカイブとして提供されます。

起動プロセスの早い段階でロードされたマイクロコードデータを含む解凍されたcpioアーカイブをイメージに付加することが可能です。

起動中、カーネルは次のプロセスに従います。

  • initramfsの開始時に圧縮されたcpioアーカイブが存在する場合、それを抽出し、そこからマイクロコードデータをCPUにロードします。
  • initramfsの開始時に非圧縮のcpioアーカイブが存在する場合、アーカイブをスキップし、ファイルの残りの部分を基本的なinitramfsとして設定します。 逆に、initramfs全体を基本的なinitramfsとして扱います。
  • 基本的なinitramfsを圧縮(Debianではgzip、UbuntuではLZ4) cpio アーカイブファイルとして扱うことにより、RAMベースのディスクに解凍します。

そこから、カーネルの初期化とブートストラップコードのほとんどがこのディスクに移動され、ユーザーモードで実行されます。 同様にカーネルから移動された他のプロセスには、次のものがあります。

  • 起動時のネットワーク設定
  • 実際のルートディスクを見つける
  • ACPIセットアップ
  • initrdスタイルのRAMディスクの処理

3.2. initramfsの利点

初期ブートプロセスのカスタマイズがはるかに簡単になります。 これは、ユーザースペースコードを使用して実現できます。これにより、システムの起動方法を変更するためにカーネルにパッチを適用する必要がなくなります。

初期化コードをユーザースペースに移動すると、コードの記述が容易になります。

システムコールを介してカーネルを処理するには、ユーザースペースコードが必要です。その結果、コードがよりクリーンで安全になります。

3.3. initramfsにアクセスする方法

The initramfs-tools-core パッケージ私たちに lsinitramfs 内部のファイルを一覧表示するために使用できます initramfs。

unmkinitramfs を使用して、initramfsからファイルを抽出することもできます。

path / to / initrd がすでに空のディレクトリとして存在し、出力ファイル/initrd.imgがASCII cpio アーカイブ(CRCのないSVR4)であると仮定します。 )。

initrdイメージにマイクロコードが付加されていると見なします。 マイクロコードを抽出して、STDERR表示を読んでみましょう。

$ cd path/to/initrd/
$ cpio -i < /initrd.img
62 blocks

基本的なinitrdは、次の方法で抽出できます。

$ cd path/to/initrd/

$ dd if=/initrd.img of=initrd.img bs =512 skip=62

$ zcat initrd.img | cpio -i 

注: cpioSTDERR出力に一致するようにスキップ値を調整する必要があります。

マイクロコードcpioアーカイブサイズを確認しましょう。

$ cpio -t </initrd.img >/dev/null

4. initrdinitramfsの違い

Linuxカーネル2.4以下ではinitrdを使用できます。 逆に、initramfsはカーネル2.6以降用です。

initrd をカーネルにコンパイルするには、少なくとも1つのファイルシステムドライバーが必要です。これにより、起動時の柔軟性、単純さ、およびメモリ効率が向上します。

initramfs を使用すると、カーネルが tmpfs、に抽出するファイルを含むアーカイブを作成できます。これにより、ファイルアクセスが非常に高速になります。

5. 結論

このチュートリアルでは、initrdinitramfsの意味と、それらを区別する方法について詳しく見てきました。 また、異なるカーネルバージョンでの起動プロセス中に両方が果たす重要な役割についても調べました。 さらに、それらのコンテンツを検索、抽出、およびリストする方法にも取り組みました。