Fix GRUB with non-/boot ESP (#2015)
* Fix GRUB with non-/boot ESP Fixes #2001 * GRUB EFI fixes * Fix flake8 and mypy --------- Co-authored-by: Anton Hvornum <anton@hvornum.se> Co-authored-by: Daniel Girtler <girtler.daniel@gmail.com>
This commit is contained in:
parent
ca3051ebf3
commit
ad6cbcfd3d
|
|
@ -800,20 +800,25 @@ class DeviceModification:
|
||||||
def get_efi_partition(self) -> Optional[PartitionModification]:
|
def get_efi_partition(self) -> Optional[PartitionModification]:
|
||||||
"""
|
"""
|
||||||
Similar to get_boot_partition() but excludes XBOOTLDR partitions from it's candidates.
|
Similar to get_boot_partition() but excludes XBOOTLDR partitions from it's candidates.
|
||||||
|
Also works with ESP flag.
|
||||||
"""
|
"""
|
||||||
filtered = filter(lambda x: x.is_boot() and x.fs_type == FilesystemType.Fat32 and PartitionFlag.XBOOTLDR not in x.flags, self.partitions)
|
filtered = filter(lambda x: (x.is_boot() or PartitionFlag.ESP in x.flags) and x.fs_type == FilesystemType.Fat32 and PartitionFlag.XBOOTLDR not in x.flags, self.partitions)
|
||||||
return next(filtered, None)
|
return next(filtered, None)
|
||||||
|
|
||||||
def get_boot_partition(self) -> Optional[PartitionModification]:
|
def get_boot_partition(self) -> Optional[PartitionModification]:
|
||||||
"""
|
"""
|
||||||
Returns the first partition marked as XBOOTLDR (PARTTYPE id of bc13c2ff-...) or Boot and has a mountpoint.
|
Returns the first partition marked as XBOOTLDR (PARTTYPE id of bc13c2ff-...) or Boot and has a mountpoint.
|
||||||
Only returns XBOOTLDR if separate EFI is detected using self.get_efi_partition()
|
Only returns XBOOTLDR if separate EFI is detected using self.get_efi_partition()
|
||||||
|
Will return None if no suitable partition is found.
|
||||||
"""
|
"""
|
||||||
if efi_partition := self.get_efi_partition():
|
if efi_partition := self.get_efi_partition():
|
||||||
filtered = filter(lambda x: x.is_boot() and x != efi_partition and x.mountpoint, self.partitions)
|
filtered = filter(lambda x: x.is_boot() and x != efi_partition and x.mountpoint, self.partitions)
|
||||||
if boot_partition := next(filtered, None):
|
if boot_partition := next(filtered, None):
|
||||||
return boot_partition
|
return boot_partition
|
||||||
return efi_partition
|
if efi_partition.is_boot():
|
||||||
|
return efi_partition
|
||||||
|
else:
|
||||||
|
return None
|
||||||
else:
|
else:
|
||||||
filtered = filter(lambda x: x.is_boot() and x.mountpoint, self.partitions)
|
filtered = filter(lambda x: x.is_boot() and x.mountpoint, self.partitions)
|
||||||
return next(filtered, None)
|
return next(filtered, None)
|
||||||
|
|
|
||||||
|
|
@ -874,7 +874,8 @@ class Installer:
|
||||||
def _add_grub_bootloader(
|
def _add_grub_bootloader(
|
||||||
self,
|
self,
|
||||||
boot_partition: disk.PartitionModification,
|
boot_partition: disk.PartitionModification,
|
||||||
root_partition: disk.PartitionModification
|
root_partition: disk.PartitionModification,
|
||||||
|
efi_partition: Optional[disk.PartitionModification]
|
||||||
):
|
):
|
||||||
self.pacman.strap('grub') # no need?
|
self.pacman.strap('grub') # no need?
|
||||||
|
|
||||||
|
|
@ -895,12 +896,15 @@ class Installer:
|
||||||
'--debug'
|
'--debug'
|
||||||
]
|
]
|
||||||
|
|
||||||
if SysInfo.has_uefi():
|
if SysInfo.has_uefi() and efi_partition is not None:
|
||||||
|
info(f"GRUB EFI partition: {efi_partition.dev_path}")
|
||||||
|
|
||||||
self.pacman.strap('efibootmgr') # TODO: Do we need? Yes, but remove from minimal_installation() instead?
|
self.pacman.strap('efibootmgr') # TODO: Do we need? Yes, but remove from minimal_installation() instead?
|
||||||
|
|
||||||
add_options = [
|
add_options = [
|
||||||
'--target=x86_64-efi',
|
'--target=x86_64-efi',
|
||||||
f'--efi-directory={boot_partition.mountpoint}',
|
f'--efi-directory={efi_partition.mountpoint}'
|
||||||
|
f'--boot-directory={boot_partition.mountpoint if boot_partition else "/boot"}'
|
||||||
'--bootloader-id=GRUB',
|
'--bootloader-id=GRUB',
|
||||||
'--removable'
|
'--removable'
|
||||||
]
|
]
|
||||||
|
|
@ -913,8 +917,10 @@ class Installer:
|
||||||
try:
|
try:
|
||||||
SysCommand(command, peek_output=True)
|
SysCommand(command, peek_output=True)
|
||||||
except SysCallError as err:
|
except SysCallError as err:
|
||||||
raise DiskError(f"Could not install GRUB to {self.target}{boot_partition.mountpoint}: {err}")
|
raise DiskError(f"Could not install GRUB to {self.target}{efi_partition.mountpoint}: {err}")
|
||||||
else:
|
else:
|
||||||
|
info(f"GRUB boot partition: {boot_partition.dev_path}")
|
||||||
|
|
||||||
parent_dev_path = disk.device_handler.get_parent_device_path(boot_partition.safe_dev_path)
|
parent_dev_path = disk.device_handler.get_parent_device_path(boot_partition.safe_dev_path)
|
||||||
|
|
||||||
add_options = [
|
add_options = [
|
||||||
|
|
@ -931,7 +937,7 @@ class Installer:
|
||||||
try:
|
try:
|
||||||
SysCommand(
|
SysCommand(
|
||||||
f'/usr/bin/arch-chroot {self.target} '
|
f'/usr/bin/arch-chroot {self.target} '
|
||||||
f'grub-mkconfig -o {boot_partition.mountpoint}/grub/grub.cfg'
|
f'grub-mkconfig -o {boot_partition.mountpoint if boot_partition else "/boot"}/grub/grub.cfg'
|
||||||
)
|
)
|
||||||
except SysCallError as err:
|
except SysCallError as err:
|
||||||
raise DiskError(f"Could not configure GRUB: {err}")
|
raise DiskError(f"Could not configure GRUB: {err}")
|
||||||
|
|
@ -1131,7 +1137,7 @@ TIMEOUT=5
|
||||||
case Bootloader.Systemd:
|
case Bootloader.Systemd:
|
||||||
self._add_systemd_bootloader(boot_partition, root_partition, efi_partition)
|
self._add_systemd_bootloader(boot_partition, root_partition, efi_partition)
|
||||||
case Bootloader.Grub:
|
case Bootloader.Grub:
|
||||||
self._add_grub_bootloader(boot_partition, root_partition)
|
self._add_grub_bootloader(boot_partition, root_partition, efi_partition)
|
||||||
case Bootloader.Efistub:
|
case Bootloader.Efistub:
|
||||||
self._add_efistub_bootloader(boot_partition, root_partition)
|
self._add_efistub_bootloader(boot_partition, root_partition)
|
||||||
case Bootloader.Limine:
|
case Bootloader.Limine:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue