オンラインで見つかったいくつかの例では、grub-installの後にupdate-grubを実行する必要があることが示されています。他の人は順序を逆にします。どちらが正しいですか?
2つのLinuxインストール(sdaに1つ、sdbに1つ)がある場合、sdaインストールでupdate-grubを実行すると、sdaインストールが起動メニューの上部に表示されます。 sdbインストールでupdate-grubを実行すると、sdbインストールがメニューの上部に表示されます。
DEFAULT = 0と仮定すると、理論的にはBIOSから起動デバイスを選択してオペレーティングシステムを選択できます。 "grub-install /dev/sda"は、sdaまたはsdbバージョンのLinuxで実行されているかどうかに関係なく、最後の "update-grub"に対応するようにsdaブートメニューを変更しますか?
答え1
update-grub
、少なくともDebianなどのバージョン(Ubuntuなど)では、デフォルトでgrub-mkconfig
.so GRUBを作成/更新/再生します。構成、実際のブートローダ自体ではありません。
実際に実行する操作は、grub-install
実行しているGRUBのバージョン(従来のBIOS GRUBまたはUEFI GRUB)によって異なります。
既存のBIOS GRUBを使用すると、grub-install
マスターブートレコードに含まれているGRUBセクションが(再)書き込まれ、物理ディスクブロック番号がGRUBの次のセクションを読み取れるようにエンコードされます。また、/boot/grub/grub.cfg
実際のGRUB構成ファイルをどのパーティションから読み取るかを決定します()。ここで重要な要素は、/boot/grub/device.map
デバイス番号がLinuxディスクデバイスにマップされる方法をGRUB BIOS(およびGRUB)に通知するファイルです。
UEFI GRUB の場合、GRUB ブートローダの主要部分は通常、/boot/efi/EFI/<name of distribution>/grubx64.efi
または同様の EFI システムパーティションのファイルとして配置されます。このブートローダのパス名は、UEFIブート変数のシステムNVRAM(= BIOS設定が保存されている場所)に保存されます。 GRUBの主要部分は完全に独立している(セキュアブートを使用している場合は必ずそうする必要があります)、アドインはGRUBモジュールにロードされ、通常はその部分が属する/boot/grub
Linuxディストリビューションのディレクトリから可能です。
UEFIブート変数は、システムがEFIシステムパーティションとその中にあるブートローダーファイルを見つけるために使用する必要があるディスクを識別します。コマンドを使用してこれらの変数を直接表示できますefibootmgr -v
。このオプションを使用して特に指定しない限り、このgrub-install
コマンドはこれらの変数を更新します。--no-nvram
GRUBが実行されたら、次に決定する必要があるのは、構成ファイルをどこで読み取るべきかということです。
grub-install
GRUB変数の所望の値をprefix
GRUBの主要部分に直接挿入する機能。これ組み込みプレフィックスパスを完全に指定するか、アーキテクチャ固有のデフォルト値を使用して、実行時にいくつかの部分を決定できます。
従来のBIOS GRUBの場合、組み込みのプレフィックスは通常物理ディスク指定子を無視するため、GRUBがロードされているのと同じディスクが使用されます。この場合、保存されたプレフィックスは、たとえば、(,msdos1)/grub
GRUBがインストールされているディスクの最初のデフォルトのパーティション時間です。/boot
UEFI GRUBの場合、埋め込みプレフィックスは通常ディレクトリのみを指定します。これはEFIシステムパーティション(ESP)の展開ディレクトリを参照します。したがって、一般的な埋め込みプレフィックスは/EFI/debian
or/EFI/redhat
または類似しています。ディスクとパーティションのデフォルト値は、「UEFI GRUBバイナリがロードされたのと同じパーティション」です。
一部のディストリビューション(RHELなど)は、UEFI GRUBの実際の設定をESPに直接配置します。 Debianと関連ディストリビューションは通常、より間接的な作業を行います。grub.cfg
ESPのミニファイルには、Linuxが起動してすべてのディスクがマウントされた後、GRUBにファイルから実際の設定ファイルを読み取るように指示する数行しか含まれていません/boot/grub/grub.cfg
。最も簡単に、このミニ構成には3行しかありません。
configfile
最新のディストリビューションで一般的に使用される実際のGRUB構成ファイル(実行するコマンド用)を含むファイルシステムsearch
とファイルシステムUUIDを指すようにGRUBルートを設定します。このスキームの最も古い実装では、実際には固定GRUBパーティショニング仕様を使用している可能性があります。set root=(hd0,gpt1)
- GRUB
prefix
変数を設定します(セキュアブートが適用されない場合はGRUBモジュールの自動ロードを有効にします)。構成をロードするファイルシステムがLinuxルートファイルシステムの場合、この行は次のようになります。別のファイルシステムの場合、この行は次のようになりますset prefix=($root)'/boot/grub'
。/boot
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
を使用して実際のGRUB設定ファイルを読み込みます。
GRUB構成を含むファイルシステムがLVM論理ボリューム、暗号化ボリューム、またはソフトウェアRAIDセットにある場合、最初の行はより複雑になり、必要に応じて追加の行が追加されることがあります。
したがって、レガシー BIOS と UEFI の両方がgrub-install
まったく異なるディスクから完全に異なる GRUB 設定ファイルを読み取るようにブートローダを更新することが可能です。プロセスの詳細は完全に異なります。
efibootmgr
UEFIを使用すると、オペレーティングシステム内で起動デバイスの選択を実際に変更できますgrub-install
。しかし、これはgrub-install
途方もないキラーです。インストールがすべてUEFIで、別々のESPパーティションがある場合は、独自のUEFIブート変数があり、どちらかを簡単に選択したり、efibootmgr
UEFIから実際にブートしたりできます。 BIOS設定で完了しました。
/boot/grub/device.map
従来のBIOSでは、状況はやや混乱しています。各インストールがその特定のインストールディスクをhd0
別のインストールディスクとして識別していることを確認する必要があります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 構成でも同様です。