
オンラインで見つかった例の中には、update-grub は grub-install の後に実行する必要があると書かれているものがあります。順序が逆になっているものもあります。どちらが正しいでしょうか?
2 つの Linux インストール (1 つは sda 上、もう 1 つは sdb 上) がある場合、sda インストールで update-grub を実行すると、sda インストールがブート メニューの先頭に配置されます。sdb インストールで update-grub を実行すると、sdb インストールがメニューの先頭に配置されます。
DEFAULT=0 と仮定すると、理論的には、BIOS でブート デバイスを選択することで OS を選択できるはずです。「grub-install /dev/sda」は、Linux の sda バージョンまたは sdb バージョンのどちらから実行されたかに関係なく、最後の「update-grub」に対応するように sda ブート メニューを変更しますか?
答え1
update-grub
は、少なくともDebianやUbuntuのようなその関連では、基本的に のラッパーに過ぎませんgrub-mkconfig
。つまり、GRUBを作成/更新/再生成します。構成実際のブートローダそのものではありません。
実際に何がgrub-install
行われるかは、実行している GRUB のバージョン (従来の BIOS GRUB または UEFI GRUB) によって異なります。
従来の BIOS GRUB では、grub-install
マスター ブート レコードに埋め込まれた GRUB の部分を (再) 書き込み、そこに物理ディスク ブロック番号をエンコードして、GRUB の次の部分をどこから読み取るかを決定します。また、実際の GRUB 構成ファイル ( /boot/grub/grub.cfg
) がどのパーティションから読み取られるかを決定します。ここで重要な要素は、ファイルです。この/boot/grub/device.map
ファイルは、BIOS (したがって GRUB) のデバイス番号が Linux ディスク デバイスにどのようにマップされるかを GRUB に伝えます。
UEFI GRUB では、GRUB ブートローダの主要部分は、EFI システム パーティション内のファイルとして、通常は または/boot/efi/EFI/<name of distribution>/grubx64.efi
同様の場所に配置されます。このブートローダのパス名は、UEFI ブート変数内のシステム NVRAM (BIOS 設定が保存される場所) に保存されます。GRUB の主要部分は完全に自己完結型である場合があり (セキュア ブートが使用されている場合はそうである必要があります)、通常はそれが属する Linux/boot/grub
ディストリビューションのディレクトリから、GRUB モジュールとして追加機能を読み込む場合もあります。
UEFI ブート変数は、システムが EFI システム パーティションとその中のブートローダ ファイルを検索するために使用するディスクを識別します。efibootmgr -v
コマンドを使用して、これらの変数を自分で表示できます。コマンドは、オプションを使用して別の指定をしないgrub-install
限り、これらの変数を更新します。--no-nvram
GRUB が実行されたら、次に決定する必要があるのは、構成ファイルをどこから読み取るかということです。
grub-install
prefix
GRUB変数の希望値をGRUBのメイン部分に直接挿入する機能があります。埋め込みプレフィックスパスを完全に指定することも、アーキテクチャ固有のデフォルトを使用して実行時に決定される部分を省略することもできます。
従来の BIOS GRUB では、埋め込まれたプレフィックスでは通常、実際のディスク指定子が省略されるため、GRUB がロードされたのと同じディスクが使用されます。その場合、保存されるプレフィックスは、たとえば、GRUB がインストールされているディスクの最初のプライマリ パーティションに(,msdos1)/grub
なり ます。/boot
UEFI GRUB では、埋め込まれたプレフィックスは通常、ディレクトリのみを指定し、その後、EFI システム パーティション (ESP) 上のディストリビューションのディレクトリを参照します。したがって、一般的な埋め込みプレフィックスは/EFI/debian
または/EFI/redhat
または類似のものになります。ディスクとパーティションのデフォルト値は、「UEFI GRUB バイナリがロードされたのと同じパーティション」になります。
RHEL などの一部のディストリビューションでは、UEFI GRUB の実際の構成が ESP に直接配置されます。Debian および関連ディストリビューションでは、通常、もう 1 行間接的に処理されます。ESPgrub.cfg
のミニ ファイルには、Linux が起動してすべてのディスクをマウントした後の実際の構成ファイルを読み取るように GRUB に指示する数行が/boot/grub/grub.cfg
含まれます。最も単純な場合、このミニ構成は 3 行だけです。
configfile
GRUBルートを、実際のGRUB設定ファイル(次のコマンド用)を含むファイルシステムを指すように設定します。最近のディストリビューションでは通常search
、コマンドとファイルシステムUUIDを使用します。このスキームの最も古い実装では、実際には固定のGRUBパーティション仕様が使用されていた可能性があります。例:set root=(hd0,gpt1)
- GRUB
prefix
変数の設定(セキュアブートが有効になっていない場合にGRUBモジュールの自動読み込みを有効にするため)。設定が読み込まれるファイルシステムがLinuxルートファイルシステムの場合、この行はset prefix=($root)'/boot/grub'
;/boot
別のファイルシステムの場合、この行はset prefix=($root)'/grub'
- 実際の GRUB 設定ファイルを読み取ります
configfile $prefix/grub.cfg
。
GRUB 構成を含むファイルシステムが LVM 論理ボリューム、暗号化ボリューム、またはソフトウェア RAID セット上にある場合、最初の行はより複雑になり、必要に応じて追加の行が存在することもあります。
その結果、従来の BIOS と UEFI の両方で、を実行するとgrub-install
ブートローダーが更新され、まったく異なるディスク上のまったく異なる GRUB 構成ファイルを読み取ることができますが、そのプロセスの詳細は完全に異なります。
efibootmgr
UEFI では、またはを使用して、OS 内からブート デバイスの選択を実際に変更できますgrub-install
。ただし、grub-install
そのためには はやりすぎです。両方のインストールが UEFI であり、それぞれに個別の ESP パーティションがある場合、それぞれに独自の UEFI ブート変数があり、efibootmgr
または UEFI BIOS 設定を使用して簡単に選択できます。
従来の BIOS では、少し面倒です。各インストールの が、/boot/grub/device.map
その特定のインストールのディスクを としてhd0
、もう 1 つのディスクを として識別していることを確認する必要がありますhd1
。次に、 を使用してgrub-install
、各インストールの独自のディスクにのみブートローダを書き込みます。「反対の」ディスクには書き込みません。こうすることで、両方のディスクが完全にスタンドアロンになり、もう一方のディスクが完全に削除された場合でも起動可能になります。必要に応じて、各 GRUB の構成ファイルにメニュー項目を追加して、「反対の」インストールを起動できます。または、BIOS を使用して起動するディスクを選択することもできます。
知っておくべきことは、従来の BIOS のブート順序セレクターは通常、ブート用に選択されたディスクを BIOS 機能の「最初の」ディスクにすることで機能するため、GRUB はhd0
常に「BIOS でブート用に現在選択されているディスク」を参照するということです。
したがって、現在 から起動している場合/dev/sda
(BIOS では と表示されsda
ますhd0
)、そのディスク上の GRUB メニュー項目を のブート メニューに切り替えたい場合は/dev/sdb
、次のようなコマンドを使用します。
menuentry "Switch to /dev/sdb"
{
# flip the disk mappings and reload configuration
drivemap -s (hd0) (hd1)
set root=<the identifier for sdb's partition that contains grub.cfg>
configfile /boot/grub/grub.cfg # or just /grub/grub.cfg is /boot is a separate partition
}
.../dev/sdb の GRUB 構成でも同様です。