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 System Partition に /boot/efi/EFI/<name of distribution>/grubx64.efi
または同様のファイルとして置かれます。 このブートローダのパス名は UEFI ブート変数内のシステム NVRAM (= BIOS 設定が保存される場所) に保存されます。 GRUB のメイン部分は完全に自己完結しているかもしれませんし (Secure Boot が使われている場合はそうでなければなりません!)、GRUB モジュールとして追加機能をロードするかもしれません、通常はその一部である Linux ディストリビューションの /boot/grub
ディレクトリからロードします。 これらの変数は、efibootmgr -v
コマンドを使用して自分で見ることができます。 grub-install
コマンドは、--no-nvram
オプションで指定しない限り、これらの変数を更新します。
結果として、従来の BIOS と UEFI の両方で、grub-install
を実行すると、完全に異なるディスク上の完全に異なる GRUB 設定ファイルを読むようにブートローダを更新できます – そのプロセスの詳細は全く異なるものですが。
UEFI では、efibootmgr
か grub-install
を使って OS 内からブートデバイスの選択を実際に変更することができます。 両方のインストールが UEFI で、それぞれ別の ESP パーティションを持っている場合、それらは独自の UEFI ブート変数を持っており、それらの間の選択は efibootmgr
や、実際には UEFI BIOS 設定で容易に行うことができます。 そして、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 設定でも同じようにします
…