utils: add enforce_gpt argument to get_efi_partition()

The Windows bootloader only supports a UEFI boot from a GPT
partition. Set enforce_gpt to True in every codepath related to
Windows. When enforce_gpt is set to True get_efi_partition()
raises an exception when an MBR partition scheme is detected.
master
Alejandro Sirgo Rica 2024-03-26 11:46:54 +01:00
parent 42791a1a7c
commit 97647c32aa
2 changed files with 8 additions and 5 deletions

View File

@ -57,7 +57,7 @@ def _boot_bios_windows(disk, part, mountpoint):
def _boot_uefi_windows(disk, part, mountpoint):
logging.info(f'Booting windows system')
bootlabel = f'Part-{disk:02d}-{part:02d}'
esp, esp_disk, esp_part_number = get_efi_partition(disk)
esp, esp_disk, esp_part_number = get_efi_partition(disk, enforce_gpt=True)
esp_mountpoint = esp.replace('dev', 'mnt')
if not mount_mkdir(esp, esp_mountpoint):
raise RuntimeError(f'Unable to mount detected EFI System Partition at {esp} into {esp_mountpoint}')
@ -82,7 +82,7 @@ def _boot_uefi_windows(disk, part, mountpoint):
def _boot_uefi_linux(disk, part, mountpoint):
logging.info(f'Booting Linux system')
bootlabel = f'Part-{disk:02d}-{part:02d}'
esp, esp_disk, esp_part_number = get_efi_partition(disk)
esp, esp_disk, esp_part_number = get_efi_partition(disk, enforce_gpt=False)
esp_mountpoint = esp.replace('dev', 'mnt')
if not mount_mkdir(esp, esp_mountpoint):
raise RuntimeError(f'Unable to mount detected EFI System Partition at {esp} into {esp_mountpoint}')

View File

@ -41,9 +41,12 @@ def get_partition_device(disknum, partnum):
raise ValueError(f'No such partition with disk index {disknum} and partition index {partnum}')
def get_efi_partition(disknum):
def get_efi_partition(disknum, enforce_gpt):
"""
Look for an EFI System Partition at the n-th disk. If disknum is invalid an exception is thrown
Look for an EFI System Partition at the n-th disk. If disknum is invalid an
exception is thrown.
If enforce_gpt is set to True the ESP will be ignored in a MBR partition
scheme.
Returns tuple with:
- Device name containing the ESP
@ -57,7 +60,7 @@ def get_efi_partition(disknum):
disk = get_disks()[disk_index]
cxt = fdisk.Context(f'/dev/{disk}')
if cxt.label == fdisk.FDISK_DISKLABEL_DOS:
if enforce_gpt and cxt.label == fdisk.FDISK_DISKLABEL_DOS:
raise RuntimeError(f'Disk has DOS partition scheme, cannot find ESP at /dev/{disk}')
for pa in cxt.partitions: