From 0e3a8f2dc5dc0eb12c08b4a816e88c9439c56e67 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 2 May 2026 14:25:37 +0300 Subject: [PATCH 1/2] Keep standalone initramfs for grub-btrfs when UKI is enabled Fixes #4505 --- archinstall/lib/installer.py | 19 +++++++++++++------ archinstall/scripts/guided.py | 17 ++++++++++++++++- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 44a10eb2d4..6e3adb4e0b 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -1754,6 +1754,7 @@ def _config_uki( self, root: PartitionModification | LvmVolume, efi_partition: PartitionModification | None, + keep_initramfs: bool = False, ) -> None: if not efi_partition or not efi_partition.mountpoint: raise ValueError(f'Could not detect ESP at mountpoint {self.target}') @@ -1777,11 +1778,11 @@ def _config_uki( config = preset.read_text().splitlines(True) for index, line in enumerate(config): - # Avoid storing redundant image file if m := image_re.match(line): - image = self.target / m.group(2) - image.unlink(missing_ok=True) - config[index] = '#' + m.group(1) + if not keep_initramfs: + image = self.target / m.group(2) + image.unlink(missing_ok=True) + config[index] = '#' + m.group(1) elif m := uki_re.match(line): if diff_mountpoint: config[index] = m.group(2) + diff_mountpoint + m.group(3) @@ -1800,7 +1801,13 @@ def _config_uki( if not self.mkinitcpio(['-P']): error('Error generating initramfs (continuing anyway)') - def add_bootloader(self, bootloader: Bootloader, uki_enabled: bool = False, bootloader_removable: bool = False) -> None: + def add_bootloader( + self, + bootloader: Bootloader, + uki_enabled: bool = False, + bootloader_removable: bool = False, + keep_initramfs: bool = False, + ) -> None: """ Adds a bootloader to the installation instance. Archinstall supports one of five types: @@ -1849,7 +1856,7 @@ def add_bootloader(self, bootloader: Bootloader, uki_enabled: bool = False, boot bootloader_removable = False if uki_enabled: - self._config_uki(root, efi_partition) + self._config_uki(root, efi_partition, keep_initramfs) match bootloader: case Bootloader.Systemd: diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 2122848083..1ac7dd3f39 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -115,7 +115,22 @@ def perform_installation( installation.setup_swap(algo=config.swap.algorithm) if config.bootloader_config and config.bootloader_config.bootloader != Bootloader.NO_BOOTLOADER: - installation.add_bootloader(config.bootloader_config.bootloader, config.bootloader_config.uki, config.bootloader_config.removable) + keep_initramfs = False + if ( + config.bootloader_config.uki + and config.bootloader_config.bootloader == Bootloader.Grub + and disk_config.has_default_btrfs_vols() + and disk_config.btrfs_options + and disk_config.btrfs_options.snapshot_config + ): + keep_initramfs = True + + installation.add_bootloader( + config.bootloader_config.bootloader, + config.bootloader_config.uki, + config.bootloader_config.removable, + keep_initramfs, + ) if config.network_config: install_network_config( From 07d0760dc43ff7a84e44f70e54380892cecb3c1e Mon Sep 17 00:00:00 2001 From: Softer Date: Tue, 5 May 2026 03:00:27 +0300 Subject: [PATCH 2/2] Move keep_initramfs logic into add_bootloader() The grub-btrfs snapshot detection was in guided.py, forcing custom script authors to replicate it. Since Installer already holds disk_config, the check belongs inside add_bootloader(). --- archinstall/lib/installer.py | 7 ++++++- archinstall/scripts/guided.py | 11 ----------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 6e3adb4e0b..801eaee22b 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -1806,7 +1806,6 @@ def add_bootloader( bootloader: Bootloader, uki_enabled: bool = False, bootloader_removable: bool = False, - keep_initramfs: bool = False, ) -> None: """ Adds a bootloader to the installation instance. @@ -1856,6 +1855,12 @@ def add_bootloader( bootloader_removable = False if uki_enabled: + keep_initramfs = ( + bootloader == Bootloader.Grub + and self._disk_config.has_default_btrfs_vols() + and self._disk_config.btrfs_options is not None + and self._disk_config.btrfs_options.snapshot_config is not None + ) self._config_uki(root, efi_partition, keep_initramfs) match bootloader: diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 1ac7dd3f39..dd3a2b233d 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -115,21 +115,10 @@ def perform_installation( installation.setup_swap(algo=config.swap.algorithm) if config.bootloader_config and config.bootloader_config.bootloader != Bootloader.NO_BOOTLOADER: - keep_initramfs = False - if ( - config.bootloader_config.uki - and config.bootloader_config.bootloader == Bootloader.Grub - and disk_config.has_default_btrfs_vols() - and disk_config.btrfs_options - and disk_config.btrfs_options.snapshot_config - ): - keep_initramfs = True - installation.add_bootloader( config.bootloader_config.bootloader, config.bootloader_config.uki, config.bootloader_config.removable, - keep_initramfs, ) if config.network_config: