update-grub
, legalábbis a Debianban és rokonaiban, mint az Ubuntu, alapvetően csak egy burkolat a grub-mkconfig
körül. Tehát a GRUB konfigurációt hozza létre/frissíti/újragenerálja, nem magát a tényleges bootloadert.
Mit csinál valójában a grub-install
, az attól függ, hogy a GRUB melyik verzióját futtatod: hagyományos BIOS GRUB vagy UEFI GRUB?
A hagyományos BIOS GRUB esetében a grub-install
(újra)írja a GRUB-nak a Master Boot Recordba ágyazott részét, és belekódolja a fizikai lemezblokkok számát, ahonnan a GRUB következő részét kell beolvasni. Azt is meghatározza, hogy a tényleges GRUB konfigurációs fájl (/boot/grub/grub.cfg
) melyik partícióról lesz beolvasva. Fontos tényező itt a /boot/grub/device.map
fájl, amely megmondja a GRUB-nak, hogy a BIOS (és így a GRUB) eszközszámozása hogyan illeszkedik a Linux lemezeszközökhöz.
Az UEFI GRUB esetében a GRUB bootloader fő része az EFI rendszerpartícióban található fájlként, jellemzően /boot/efi/EFI/<name of distribution>/grubx64.efi
vagy hasonló néven. Ez a bootloader elérési útvonala a rendszer NVRAM-jában (= a BIOS-beállítások tárolásának helye) az UEFI bootváltozókban kerül tárolásra. A GRUB fő része lehet teljesen önálló (és annak kell lennie, ha Secure Boot van használatban!), vagy betölthet további funkciókat GRUB modulokként, jellemzően a /boot/grub
könyvtárból a Linux disztribúcióból, amelynek része.
Az UEFI bootváltozók azonosítják a lemezt, amelyen a rendszer keresi az EFI rendszerpartíciót és a benne lévő bootloader fájlt. Ezeket a változókat maga is megtekintheti a efibootmgr -v
parancs segítségével. A grub-install
parancs frissíti ezeket a változókat, hacsak nem használja a --no-nvram
opciót, hogy mást adjon meg.
A hagyományos BIOS és az UEFI esetében egyaránt a grub-install
parancs futtatása frissítheti a bootloadert, hogy egy teljesen más GRUB konfigurációs fájlt olvasson egy teljesen más lemezen – bár ennek a folyamatnak a részletei teljesen mások lesznek.
Az UEFI esetében ténylegesen megváltoztathatja a rendszerindító eszköz kiválasztását az operációs rendszeren belül, a efibootmgr
vagy a grub-install
segítségével. De a grub-install
egy hatalmas túlzás ehhez: ha mindkét telepítésed UEFI-s, és saját külön ESP partícióval rendelkezik, akkor saját UEFI bootváltozóik lesznek, és a kettő közötti választás könnyen elvégezhető a efibootmgr
segítségével, vagy akár az UEFI BIOS beállításaiban.
A hagyományos BIOS-szal ez egy kicsit kuszább: meg kell győződnöd arról, hogy mindkét telepítés /boot/grub/device.map
-ja az adott telepítés lemezét hd0
-ként azonosítja, a másikat pedig hd1
-ként. Ezután a grub-install
használatával csak az egyes telepítések saját lemezére írja a bootloadert; az “ellenkező” lemezre soha. Így mindkét lemez teljesen önálló és bootolható lesz, még akkor is, ha a másik lemezt teljesen eltávolítjuk. Ha akarod, mindkét GRUB konfigurációs fájljaiban hozzáadhatsz egy olyan menüpontot, amely lehetővé teszi az “ellenkező” telepítés bootolását. Vagy egyszerűen a BIOS segítségével kiválaszthatod, hogy melyik lemezről bootolj.
Azt kell tudni, hogy a hagyományos BIOS-ok bootolási sorrendválasztója általában úgy működik, hogy a BIOS funkciói szempontjából a bootoláshoz kiválasztott lemez lesz az “első” lemez, és így a GRUB hd0
mindig “a BIOS-ban a bootoláshoz aktuálisan kiválasztott lemezre” fog hivatkozni.
Szóval, ha jelenleg a /dev/sda
lemezről bootolsz (tehát a BIOS szerint a sda
a hd0
), és azt akarod, hogy a GRUB menüpont ezen a lemezen a /dev/sdb
lemez boot menüjére váltson, akkor valami ilyesmit használsz:
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}
… és ugyanígy a /dev/sdb GRUB konfigurációjában is.