
私は CentOS 7 を使用しており、複数のディスクを接続しています。OS、カーネル、initramfs などが「/dev/sda」にあり、それが起動可能なディスクであることはわかっています。しかし、grub2 はそれをどのように推測するのでしょうか? 接続されているすべてのディスクを 1 つずつチェックするのでしょうか?
答え1
技術的には、Linux は起動可能なディスクを見つけられません。Linux が実行される頃には、ブートローダが次の処理を完了しているからです。
- LinuxをファイルからRAMのどこかにコピーする
- initramfs をファイルから RAM のどこかにコピーします
- ARMなどの一部のアーキテクチャでは、デバイスツリーやアーキテクチャ記述子などの追加情報をRAMのどこかにコピーします。
- Linux がコピーされた RAM の最初の場所に制御が渡され、ブートローダはアクティブではなくなります。
最新の UEFI ファームウェアや、U-Boot などの非 x86 プラットフォームのものには、ファームウェア内に「ブート エントリ」が保存されています。ブート エントリにはストレージ デバイスとファイル名が含まれており、ファームウェアは順番に進み、最初に見つかったファイルをロード/実行します。順序を変更するには、UEFI 設定に移動して変更するか、OS のユーティリティを使用して UEFI NVRAM 設定を変更します。
x86 上の UEFI の特徴は、単一のバイナリを RAM にロードすることですが、通常、Linux は起動するために少なくとも initramfs も必要とします (ただし、これは Linux の厳密な要件ではありません)。
また、歴史的に x86 には、ストレージ デバイスの最初のセクターをロードするだけ (順序は BIOS 設定によって決定) で、ファイルの検索やロードを試みることさえない、より原始的なファームウェア (BIOS) がありました。
そのため、ほとんどのLinuxシステムでは、UEFIが実際にロードするもの(つまり、ブート順序に従い、ブート可能なデバイスを検索するもの)はGRUBです。これは、Linux(および必要に応じて他のオペレーティングシステム)の一般的なブートローダープラットフォームであり、実際に多くのブート前の作業を実行します。すべきファームウェアに含まれているが、さまざまな理由で含まれていない、またオペレーティング システムがロードされる前に作業を行う環境も提供します。
Linux をインストールする際、インストーラーは GRUB がアクセスできる設定ファイルを生成して GRUB を設定し、カーネルと initramfs をロードする場所を GRUB に指示するエントリを GRUB のメニューに追加します。複数のエントリは可能であり、一般的です。たとえば、Debian はレスキュー カーネル用の 2 番目のメニュー項目をインストールします。これは Windows のセーフ モードとほぼ同等です。ただし、これらはすべて Linux のインストール時にインストーラーによって設定され、UEFI が処理を終えた後にこれらのオプションにアクセスします。
(ちなみに、U-Boot で気に入った点の 1 つは、カーネルと initramfs を直接ロードするため、GRUB がまったく必要なかったことです。ただし、これはカスタマイズ可能なファームウェアを備えた ARM デバイスでした)。
Windows には独自の「GRUB」があり、winload.exe
Windows に必要な処理を実行し、ファームウェアでは実行できない起動前のプリブート メニュー オプションをオプションで提供します。bcdedit
メニュー オプションを変更するには、これを使用します。Vista より前のバージョンの Windows では NTLDR が使用されており、C:\boot.ini ファイルで設定できたと思います。
Linux には GRUB は必要ありません。長い間、LILO (Linux Loader) と呼ばれるよりシンプルなブートローダが使用されており、一部のディストリビューションではおそらく今でもそれが使用されています。