initrd紹介


initrdの英語の意味はboot loader initialized RAM diskであり、boot loaderによって初期化されたメモリディスクである.linuxカーネルが起動する前にboot loaderはストレージメディアのinitrdファイルをメモリにロードし、カーネルが起動すると本物のルートファイルシステムにアクセスする前にメモリのinitrdファイルシステムにアクセスします.boot loaderがinitrdを構成している場合、カーネル起動は2つの段階に分けられ、第1段階はinitrdファイルシステムの「ファイル」を先に実行し、ドライバモジュールのロードなどのタスクを完了し、第2段階は本当のルートファイルシステムの/sbin/initプロセスを実行します.
第1段階の起動の目的は、第2段階の起動のためにすべての障害を解消することであり、最も主要なのはルートファイルシステムの記憶媒体をロードする駆動モジュールである.ルートファイルシステムはIDE、SCSI、USBを含む多くのメディアに格納できることを知っています.これらのデバイスのドライバをカーネルにコンパイルすると、カーネルがどんなに膨大で肥大化しているか想像できます.  
 
Linux2.4カーネル対Initrdの処理フロー
読者にLinux 2をはっきり理解させるために.6カーネルinitrdメカニズムの変化、重点的にLinux 2を紹介する.6コアinitrdの前にlinux 2.4コアのinitrdについて簡単に説明します.Linux2.4コアのinitrdのフォーマットはファイルシステムのミラーファイルであり、本稿ではimage-initrdと呼び、後述linux 2を区別する.6コアのcpioフォーマットのinitrd.linux2.4カーネル対initrdの処理フローは以下の通りです.
1.boot loaderはカーネルおよび/dev/initrdの内容をメモリにロードし、/dev/initrdはboot loaderによって初期化されたデバイスであり、initrdを格納している.
2.カーネル初期化中、カーネルは/dev/initrdデバイスの内容を解凍して/dev/ram 0デバイスにコピーする.
3.カーネルは、/dev/ram 0デバイスを元のルートファイルシステムに読み書き可能にマウントします.
4./dev/ram 0が真のルートファイルシステムとして指定されている場合、カーネルは最後のステップにジャンプして正常に起動します.
5.initrd上の/linuxrcファイルを実行します.linuxrcは通常、カーネルアクセスルートファイルシステムに必要なドライバをロードし、ルートファイルシステムをロードするスクリプトファイルです.
6./linuxrcの実行が完了すると、本格的なルートファイルシステムがマウントされます.
7.本物のルートファイルシステムに/initrdディレクトリがある場合、/dev/ram 0は/initrdに移動します.それ以外の場合、/initrdディレクトリが存在しない場合、/dev/ram 0はアンインストールされます.
8.本格的なルートファイルシステム上で正常な起動プロセスを行い、/sbin/initを実行します.linux2.4カーネルのinitrdの実行はカーネル起動の中間段階である、すなわちinitrdの/linuxrc実行後、カーネルは初期化コードを実行し続け、後でlinux 2であることがわかる.4コアと2.6コアのinitrd処理フローの顕著な違い.
 
Linux2.6内照合Initrdの処理フロー
linux2.6カーネルは2つのフォーマットのinitrdをサポートし、1つは前の第3部で紹介したlinux 2である.4カーネルのような伝統的なフォーマットのファイルシステムのミラー-image-initrd、その作成方法はLinux 2と同じである.4カーネルのinitrdと同様に、そのコアファイルは/linuxrcです.もう1つのフォーマットのinitrdはcpioフォーマットであり、このフォーマットのinitrdはlinux 2からなる.5から導入を開始し、cpioツールを使用して生成され、そのコアファイルは/linuxrcではなく/initであり、本稿ではこのinitrdをcpio-initrdと呼ぶ.linux 2.6内照合cpio-initrdとimage-initrdの2つのフォーマットのinitrdはいずれもサポートされているが、その処理フローには著しい違いがあり、以下ではlinux 2をそれぞれ紹介する.6内でこの2つのinitrdの処理フローをチェックします.
 
cpio-initrdの処理フロー:
1.boot loaderはカーネルおよびinitrdファイルをメモリの特定の場所にロードします.
2.カーネルは、cpioフォーマットであればinitrdのファイルフォーマットを判断します.
3.initrdの内容をrootfsにリリースします.
4.initrdの/initファイルを実行し、それを実行すると、カーネルの作業はすべて終了し、/initファイル処理に完全に渡されます.
image-initrdの処理フロー:
1.boot loaderはカーネルおよびinitrdファイルをメモリの特定の場所にロードします.
2.カーネルはinitrdのファイルフォーマットを判断し、cpioフォーマットでなければimage-initrdとして処理する.
3.カーネルはinitrdの内容をrootfsの下の/initrdに保存する.イメージファイルにあります.
4.カーネルは/initrd.イメージの内容は/dev/ram 0デバイス、すなわちメモリディスクに読み込まれます.
5.カーネルは、/dev/ram 0デバイスを元のルートファイルシステムとして読み書き可能にマウントする.
6. ./dev/ram 0が本物のルートファイルシステムとして指定されている場合、カーネルは最後のステップにジャンプして正常に起動します.
7.initrdの/linuxrcファイルを実行します.linuxrcは通常、カーネルアクセスルートファイルシステムに必要なドライバをロードし、ルートファイルシステムをロードするスクリプトファイルです.
8.linuxrcの実行が完了し、通常のルートファイルシステムがマウントされました
9.通常のルート・ファイル・システムに/initrdディレクトリが存在する場合、/dev/ram 0は/initrdに移動します.それ以外の場合、/initrdディレクトリが存在しない場合、/dev/ram 0はアンインストールされます.
10.通常のルートファイルシステムで通常の起動プロセスを行い、/sbin/initを実行します.
上記の流れの紹介から分かるようにLinux 2.6内照合image-initrdの処理フローはlinux 2と同じである.4カーネルに比べて顕著な変化はなく,cpio-initrdの処理フローはimage-initrdの処理フローと大きく異なり,フローは非常に簡単であり,後のソースコード解析では読者が処理の簡素さをより体得できる.
cpio-initrdとimage-initrdの違いと優位性
正式なcpio-initrdとimage-initrdの比較に関する文献は見つからず,筆者の使用体験およびカーネルコードの分析に基づいて,cpio-initrdの利点はcpio-initrdの作成方法がより簡単であるという3つの違いをまとめた.cpio-initrdの作成は非常に簡単で、2つのコマンドで作成プロセス全体を完了することができます.
#現在のディレクトリが準備されたinitrdファイルシステムのルートディレクトリの下にあると仮定します.
bash# find . | cpio -c -o > ../initrd.img
bash# gzip ../initrd.img

従来のinitrdの作成プロセスは煩雑で、現在のディレクトリが準備されたinitrdファイルシステムのルートディレクトリの下にあると仮定する6つのステップが必要です.
bash# dd if=/dev/zero of=../initrd.img bs=512k count=5
bash# mkfs.ext2 -F -m0 ../initrd.img
bash# mount -t ext2 -o loop ../initrd.img /mnt
bash# cp -r * /mnt
bash# umount /mnt
bash# gzip -9 ../initrd.img