Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for ESP partition flag #2133

Merged
merged 1 commit into from
Sep 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions archinstall/lib/disk/device_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,8 @@ class PartitionModification:
partuuid: Optional[str] = None
uuid: Optional[str] = None

_boot_indicator_flags = [PartitionFlag.Boot, PartitionFlag.XBOOTLDR]
_efi_indicator_flags = (PartitionFlag.Boot, PartitionFlag.ESP)
_boot_indicator_flags = (PartitionFlag.Boot, PartitionFlag.XBOOTLDR)

def __post_init__(self):
# needed to use the object as a dictionary key due to hash func
Expand Down Expand Up @@ -728,6 +729,13 @@ def relative_mountpoint(self) -> Path:

raise ValueError('Mountpoint is not specified')

def is_efi(self) -> bool:
return (
any(set(self.flags) & set(self._efi_indicator_flags))
and self.fs_type == FilesystemType.Fat32
and PartitionFlag.XBOOTLDR not in self.flags
)

def is_boot(self) -> bool:
"""
Returns True if any of the boot indicator flags are found in self.flags
Expand Down Expand Up @@ -828,9 +836,8 @@ def add_partition(self, partition: PartitionModification):
def get_efi_partition(self) -> Optional[PartitionModification]:
"""
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() or PartitionFlag.ESP in x.flags) and x.fs_type == FilesystemType.Fat32 and PartitionFlag.XBOOTLDR not in x.flags, self.partitions)
filtered = filter(lambda x: x.is_efi() and x.mountpoint, self.partitions)
return next(filtered, None)

def get_boot_partition(self) -> Optional[PartitionModification]:
Expand All @@ -843,10 +850,7 @@ def get_boot_partition(self) -> Optional[PartitionModification]:
filtered = filter(lambda x: x.is_boot() and x != efi_partition and x.mountpoint, self.partitions)
if boot_partition := next(filtered, None):
return boot_partition
if efi_partition.is_boot():
return efi_partition
else:
return None
return efi_partition
else:
filtered = filter(lambda x: x.is_boot() and x.mountpoint, self.partitions)
return next(filtered, None)
Expand Down
7 changes: 7 additions & 0 deletions archinstall/lib/disk/partitioning_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from .device_model import PartitionModification, FilesystemType, BDevice, Size, Unit, PartitionType, PartitionFlag, \
ModificationStatus, DeviceGeometry, SectorSize
from ..hardware import SysInfo
from ..menu import Menu, ListManager, MenuSelection, TextInput
from ..output import FormattedOutput, warn
from .subvolume_menu import SubvolumeMenu
Expand Down Expand Up @@ -105,10 +106,14 @@ def handle_action(
entry.mountpoint = self._prompt_mountpoint()
if entry.mountpoint == Path('/boot'):
entry.set_flag(PartitionFlag.Boot)
if SysInfo.has_uefi():
entry.set_flag(PartitionFlag.ESP)
case 'mark_formatting' if entry:
self._prompt_formatting(entry)
case 'mark_bootable' if entry:
entry.invert_flag(PartitionFlag.Boot)
if SysInfo.has_uefi():
entry.invert_flag(PartitionFlag.ESP)
case 'set_filesystem' if entry:
fs_type = self._prompt_partition_fs_type()
if fs_type:
Expand Down Expand Up @@ -310,6 +315,8 @@ def _create_new_partition(self) -> PartitionModification:

if partition.mountpoint == Path('/boot'):
partition.set_flag(PartitionFlag.Boot)
if SysInfo.has_uefi():
partition.set_flag(PartitionFlag.ESP)

return partition

Expand Down
11 changes: 9 additions & 2 deletions archinstall/lib/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -903,15 +903,22 @@ def _add_grub_bootloader(
'--debug'
]

if SysInfo.has_uefi() and efi_partition is not None:
if SysInfo.has_uefi():
if not efi_partition:
raise ValueError('Could not detect efi partition')

info(f"GRUB EFI partition: {efi_partition.dev_path}")

self.pacman.strap('efibootmgr') # TODO: Do we need? Yes, but remove from minimal_installation() instead?

boot_dir_arg = []
if boot_partition != efi_partition:
boot_dir_arg.append(f'--boot-directory={boot_dir}')

add_options = [
'--target=x86_64-efi',
f'--efi-directory={efi_partition.mountpoint}',
f'--boot-directory={boot_dir}',
*boot_dir_arg,
'--bootloader-id=GRUB',
'--removable'
]
Expand Down
4 changes: 3 additions & 1 deletion archinstall/lib/interactions/disk_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,11 @@ def select_disk_config(


def _boot_partition(sector_size: disk.SectorSize) -> disk.PartitionModification:
flags = [disk.PartitionFlag.Boot]
if SysInfo.has_uefi():
start = disk.Size(1, disk.Unit.MiB, sector_size)
size = disk.Size(512, disk.Unit.MiB, sector_size)
flags.append(disk.PartitionFlag.ESP)
else:
start = disk.Size(3, disk.Unit.MiB, sector_size)
size = disk.Size(203, disk.Unit.MiB, sector_size)
Expand All @@ -185,7 +187,7 @@ def _boot_partition(sector_size: disk.SectorSize) -> disk.PartitionModification:
length=size,
mountpoint=Path('/boot'),
fs_type=disk.FilesystemType.Fat32,
flags=[disk.PartitionFlag.Boot]
flags=flags
)


Expand Down