From ae5e644e9ed8b9777e53eaa5ef09a8119d5f2ec2 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 16:49:27 +0100 Subject: [PATCH 1/9] Lvm hotfix attempt --- archinstall/lib/installer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index ca240e3905..0021c9301e 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -248,6 +248,7 @@ def mount_ordered_layout(self) -> None: match self._disk_encryption.encryption_type: case EncryptionType.NoEncryption: + self._import_lvm() self._mount_lvm_layout() case EncryptionType.Luks: luks_handlers = self._prepare_luks_partitions(self._disk_encryption.partitions) From 32abc8723fbe281736150b08ae571b673dd6b002 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 17:16:06 +0100 Subject: [PATCH 2/9] Use --force and --yes flags --- archinstall/lib/disk/device_handler.py | 40 ++++++++++++++------------ 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 3365a89363..b1a9cc2edb 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -464,8 +464,22 @@ def lvm_export_vg(self, vg: LvmVolumeGroup) -> None: SysCommand(cmd) def lvm_import_vg(self, vg: LvmVolumeGroup) -> None: - cmd = f'vgimport {vg.name}' + # Check if the VG is actually exported before trying to import it + check_cmd = f'vgs --noheadings -o vg_exported {vg.name}' + + try: + result = SysCommand(check_cmd) + is_exported = result.decode().strip() == 'exported' + except SysCallError: + # VG might not exist yet, skip import + debug(f'Volume group {vg.name} not found, skipping import') + return + + if not is_exported: + debug(f'Volume group {vg.name} is already active (not exported), skipping import') + return + cmd = f'vgimport {vg.name}' debug(f'vgimport: {cmd}') SysCommand(cmd) @@ -477,33 +491,21 @@ def lvm_vol_reduce(self, vol_path: Path, amount: Size) -> None: SysCommand(cmd) def lvm_pv_create(self, pvs: Iterable[Path]) -> None: - cmd = 'pvcreate ' + ' '.join([str(pv) for pv in pvs]) + pvs_str = ' '.join([str(pv) for pv in pvs]) + cmd = f'pvcreate --yes --force {pvs_str}' + # note flags used in scripting debug(f'Creating LVM PVS: {cmd}') - - worker = SysCommandWorker(cmd) - worker.poll() - worker.write(b'y\n', line_ending=False) - - # Wait for the command to complete - while worker.is_alive(): - worker.poll() + SysCommand(cmd) # Sync with udev to ensure the PVs are visible self.udev_sync() def lvm_vg_create(self, pvs: Iterable[Path], vg_name: str) -> None: pvs_str = ' '.join([str(pv) for pv in pvs]) - cmd = f'vgcreate --yes {vg_name} {pvs_str}' + cmd = f'vgcreate --yes --force {vg_name} {pvs_str}' debug(f'Creating LVM group: {cmd}') - - worker = SysCommandWorker(cmd) - worker.poll() - worker.write(b'y\n', line_ending=False) - - # Wait for the command to complete - while worker.is_alive(): - worker.poll() + SysCommand(cmd) # Sync with udev to ensure the VG is visible self.udev_sync() From e5a96f4e91d329d20c233b8af1140e6038d6bf85 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 18:06:18 +0100 Subject: [PATCH 3/9] Changed mirror behavior and more lvm testing --- archinstall/lib/mirrors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/mirrors.py b/archinstall/lib/mirrors.py index d87c5c3af9..6dae496eec 100644 --- a/archinstall/lib/mirrors.py +++ b/archinstall/lib/mirrors.py @@ -450,8 +450,8 @@ def get_status_by_region(self, region: str, speed_sort: bool) -> list[MirrorStat # Local mirrors lack this data and can be modified manually before-hand # Or reflector potentially ran already if self._fetched_remote and speed_sort: - # original return - return sorted(region_list, key=lambda mirror: (mirror.score, mirror.speed)) + # Sort by speed descending (higher is better) - fastest mirrors first + return sorted(region_list, key=lambda mirror: -mirror.speed) # just return as-is without sorting? return region_list From 761c6a43167f997ef274797fc39d289d1664382a Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 18:20:10 +0100 Subject: [PATCH 4/9] Handle properly LvmOnLuks to only export in one fo the scenarios --- archinstall/lib/disk/filesystem.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index c397afa5d6..03b603b345 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -146,7 +146,7 @@ def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEnc self._format_lvm_vols(lvm_config) # export the lvm group safely otherwise the Luks cannot be closed - self._safely_close_lvm(lvm_config) + self._safely_close_lvm(lvm_config, export_vg=True) for luks in enc_mods.values(): luks.lock() @@ -158,14 +158,16 @@ def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEnc for luks in enc_vols.values(): luks.lock() - self._safely_close_lvm(lvm_config) + # Don't export VG for LuksOnLvm - dm-crypt references prevent clean export + self._safely_close_lvm(lvm_config, export_vg=False) - def _safely_close_lvm(self, lvm_config: LvmConfiguration) -> None: + def _safely_close_lvm(self, lvm_config: LvmConfiguration, export_vg: bool = False) -> None: for vg in lvm_config.vol_groups: for vol in vg.volumes: device_handler.lvm_vol_change(vol, False) - device_handler.lvm_export_vg(vg) + if export_vg: + device_handler.lvm_export_vg(vg) def _setup_lvm( self, From 816abe738fecb059c7a3f2e4e2e3a580e09a3490 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 18:42:41 +0100 Subject: [PATCH 5/9] Idek --- archinstall/lib/disk/filesystem.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index 03b603b345..5c06255d9e 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -145,22 +145,19 @@ def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEnc self._setup_lvm(lvm_config, enc_mods) self._format_lvm_vols(lvm_config) - # export the lvm group safely otherwise the Luks cannot be closed - self._safely_close_lvm(lvm_config, export_vg=True) - - for luks in enc_mods.values(): - luks.lock() + # Don't close LVM or LUKS during setup - keep everything active + # The installation phase will handle unlocking and mounting + # Closing causes "parent leaked" and lvchange errors elif enc_config.encryption_type == EncryptionType.LuksOnLvm: self._setup_lvm(lvm_config) enc_vols = self._encrypt_lvm_vols(lvm_config, enc_config, False) self._format_lvm_vols(lvm_config, enc_vols) + # Lock LUKS devices but keep LVM active + # LVM volumes must remain active for later re-unlock during installation for luks in enc_vols.values(): luks.lock() - # Don't export VG for LuksOnLvm - dm-crypt references prevent clean export - self._safely_close_lvm(lvm_config, export_vg=False) - def _safely_close_lvm(self, lvm_config: LvmConfiguration, export_vg: bool = False) -> None: for vg in lvm_config.vol_groups: for vol in vg.volumes: From 110999b69b53fd936738ca6e228cf115f61e7a99 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 19:10:24 +0100 Subject: [PATCH 6/9] Remove dead block --- archinstall/lib/disk/filesystem.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index 5c06255d9e..1ac4d35f6a 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -158,14 +158,6 @@ def _setup_lvm_encrypted(self, lvm_config: LvmConfiguration, enc_config: DiskEnc for luks in enc_vols.values(): luks.lock() - def _safely_close_lvm(self, lvm_config: LvmConfiguration, export_vg: bool = False) -> None: - for vg in lvm_config.vol_groups: - for vol in vg.volumes: - device_handler.lvm_vol_change(vol, False) - - if export_vg: - device_handler.lvm_export_vg(vg) - def _setup_lvm( self, lvm_config: LvmConfiguration, From e00bc51da0df106a0dbb551ef6317ce7aa5096b8 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 19:34:08 +0100 Subject: [PATCH 7/9] Use -f flag and wipefs to remove any existing headers avoid "has signatures" --- archinstall/lib/disk/device_handler.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index b1a9cc2edb..bd87f0ae43 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -492,7 +492,8 @@ def lvm_vol_reduce(self, vol_path: Path, amount: Size) -> None: def lvm_pv_create(self, pvs: Iterable[Path]) -> None: pvs_str = ' '.join([str(pv) for pv in pvs]) - cmd = f'pvcreate --yes --force {pvs_str}' + # Signatures are already wiped by wipefs, -f is just for safety + cmd = f'pvcreate -f --yes {pvs_str}' # note flags used in scripting debug(f'Creating LVM PVS: {cmd}') SysCommand(cmd) @@ -752,6 +753,17 @@ def partition( disk.commit() + # Wipe filesystem/LVM signatures from newly created partitions + # to prevent "signature detected" errors + for part_mod in filtered_part: + if part_mod.dev_path: + debug(f'Wiping signatures from: {part_mod.dev_path}') + SysCommand(f'wipefs --all {part_mod.dev_path}', ignore_errors=True) + + # Sync with udev after wiping signatures + if filtered_part: + self.udev_sync() + @staticmethod def swapon(path: Path) -> None: try: From e0f5bfa8a7cbfd6e0aa2e3b317a2c69bfc90f130 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Sun, 28 Dec 2025 19:37:54 +0100 Subject: [PATCH 8/9] oops --- archinstall/lib/disk/device_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index bd87f0ae43..a0eaa0e5e7 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -758,7 +758,7 @@ def partition( for part_mod in filtered_part: if part_mod.dev_path: debug(f'Wiping signatures from: {part_mod.dev_path}') - SysCommand(f'wipefs --all {part_mod.dev_path}', ignore_errors=True) + SysCommand(f'wipefs --all {part_mod.dev_path}') # Sync with udev after wiping signatures if filtered_part: From b3545dd88853123ef42225a3aea09aef720593b8 Mon Sep 17 00:00:00 2001 From: h8d13 Date: Mon, 29 Dec 2025 17:31:32 +0100 Subject: [PATCH 9/9] Revert mirror change --- archinstall/lib/mirrors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/mirrors.py b/archinstall/lib/mirrors.py index 6dae496eec..d87c5c3af9 100644 --- a/archinstall/lib/mirrors.py +++ b/archinstall/lib/mirrors.py @@ -450,8 +450,8 @@ def get_status_by_region(self, region: str, speed_sort: bool) -> list[MirrorStat # Local mirrors lack this data and can be modified manually before-hand # Or reflector potentially ran already if self._fetched_remote and speed_sort: - # Sort by speed descending (higher is better) - fastest mirrors first - return sorted(region_list, key=lambda mirror: -mirror.speed) + # original return + return sorted(region_list, key=lambda mirror: (mirror.score, mirror.speed)) # just return as-is without sorting? return region_list