web-dev-qa-db-ja.com

Linuxカーネルはどのようにして割り当てられたinitramfs / initrdにアクセスできますか?

電源ボタンを押したときから、マシン全体の起動プロセスを理解しようとしています。ブートローダーからinitramfsステージまで、この1つの部分がありますが、他の小さなビットの中でもよくわかりません。

最近のUbuntuのデフォルトインストールから取得した、エントリのこのGrub構成を前提としています。

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z

これは、システムの状態とメモリに関して実際に何をしますか? Grubのタスクは「カーネルをロードして実行する」ことであり、デバイス(またはネットワーク)上のファイルにアクセスしてそれらにアクセスするための独自のモジュールセットがあることを理解しています。ここの例では、insmods、set root、およびsearchですが、これはGrubの観点からのものであり、カーネルとは共有されていません。

また、Grubがカーネルの(コピー?)をメモリにロード( linuxコマンド )し、実行を開始するためにキックしていると推測しています。 (2つの異なるステップは明らかに-そう、どのように?)与えられたパラメーターはカーネルで読み取られ、解釈され(これはどこかのメモリにマップされた大きな文字列ですか?)、要求されたものを配置するオプションを提供します。

このinitrdオプションも表示されます。これは、root=で指定された実際のルートデバイスを起動するために必要なgzip圧縮されたinitramfsを指します。しかし、このinitramfsはどのようにカーネルに提供されますか?カーネルが起動する前にすでにロードされているため、ロードできる場所にメモリアドレスが渡されることも、それ自体にアクセスすることもできません。一部のカーネルドキュメントには、このinitramfsファイルシステムの「デバイス」は/dev/ram0からアクセスできると記載されていますが、そもそもアクセス可能なデバイスファイルになる方法がわかりません。見えない水中で何かが起こっていると思います。

また、これが、たとえばU-boot/Corebootを使用する組み込みプラットフォームを含む、他のブートローダーとどのように関連しているかわかりません。これはGrubと同じことをしていますか(同じ標準メモリアドレスですか?)、カーネル/ initrdのロードに関してこれらはGrubとどの程度比較されますか?

私の質問を明確にするために、なぜ異なるブートステージが存在し、what遷移が発生するのかは理解していると思いますが、どのようにそれらが行われ、各段階に対する正確な責任は何ですか。私は、これがすべてに帰着するいくつかの「標準」を見逃しているような気がします。

これについて説明をいただければ幸いです。

8
gertvdijk

通常、ファイルをメモリにロードして特定の場所にジャンプするだけでは不十分であるため、一般に何らかのプロトコルが必要ですが、カーネルパラメータなどの追加の引数を渡す必要があります。つまり、 memdisk引数にアクセスするDOS

これはハードウェアに依存するため(たとえば、armはx86とは異なります)、正しい情報を見つける必要があります。 armの起動に関するこの記事 または Linux/x86ブートプロトコル を参照してください。いくつかの例。

5
Ulrich Dangel

ブートローダーはinitrdをメモリ内の場所に格納し、カーネルにinitrdイメージのメモリアドレスを通知します。最近のほとんどのLinuxシステムは、 dracut を使用する initramfs スキームを使用します。これは、実際には、カーネルによって作成されたtmpfsファイルシステムにアンパックされる(ディスクイメージではなく)cpioアーカイブです。実行後。

6
jsbillings