From 8eec5a731a00c618a4bf753617020afb7b2df7df Mon Sep 17 00:00:00 2001 From: Alperen42v <243298691+Alperen42v@users.noreply.github.com> Date: Thu, 2 Jul 2026 12:50:40 +0300 Subject: [PATCH] fix : removed chacha20 --- archinstall/lib/disk/device_handler.py | 4 ++- archinstall/lib/disk/encryption_menu.py | 3 +- archinstall/lib/disk/luks.py | 48 +++++++++++++++++++++++-- archinstall/lib/models/device.py | 3 +- 4 files changed, 50 insertions(+), 8 deletions(-) diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 4b0e40b9..d86ab062 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -333,6 +333,8 @@ class DeviceHandler: info(f'luks2 formatting mapper dev: {luks_handler.mapper_dev}') self.format(fs_type, luks_handler.mapper_dev) + udev_sync() + info(f'luks2 locking device: {dev_path}') luks_handler.lock() @@ -626,4 +628,4 @@ class DeviceHandler: self._wipe(block_device.device_info.path) -device_handler = DeviceHandler() +device_handler = DeviceHandler() \ No newline at end of file diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py index 8153b35e..3c0cd059 100644 --- a/archinstall/lib/disk/encryption_menu.py +++ b/archinstall/lib/disk/encryption_menu.py @@ -460,7 +460,6 @@ async def select_encryption_cipher(preset: str | None = None) -> str | None: 'aes-cbc-essiv:sha256', 'serpent-xts-plain64', 'twofish-xts-plain64', - 'chacha20-random', # AEAD, requires --integrity poly1305, LUKS2 only ] if not preset: @@ -483,4 +482,4 @@ async def select_encryption_cipher(preset: str | None = None) -> str | None: case ResultType.Skip: return preset case ResultType.Selection: - return result.get_value() + return result.get_value() \ No newline at end of file diff --git a/archinstall/lib/disk/luks.py b/archinstall/lib/disk/luks.py index 06bf0003..8788262e 100644 --- a/archinstall/lib/disk/luks.py +++ b/archinstall/lib/disk/luks.py @@ -163,6 +163,18 @@ class Luks2: if not self.mapper_name: raise ValueError('mapper name missing') + # If a mapper device with this name already exists (e.g. left over from a + # previous failed run), close it before trying to open a new one. + # cryptsetup open returns exit code 5 / "Device already exists" otherwise. + if self.is_unlocked(): + debug(f'Mapper {self.mapper_name} already open, closing before re-opening') + try: + SysCommand(f'cryptsetup close {self.mapper_name}') + except SysCallError as close_err: + raise DiskError( + f'Could not close existing mapper "{self.mapper_name}" before unlock: {close_err}' + ) + key_file_arg, passphrase = self._get_passphrase_args(key_file) cmd = [ @@ -187,6 +199,7 @@ class Luks2: raise DiskError(f'Failed to open luks2 device: {self.luks_dev_path}') def lock(self) -> None: + import time umount(self.luks_dev_path) # Get crypt-information about the device by doing a reverse lookup starting with the partition path @@ -195,14 +208,43 @@ class Luks2: # For each child (sub-partition/sub-device) for child in lsblk_info.children: - # Unmount the child location for mountpoint in child.mountpoints: debug(f'Unmounting {mountpoint}') umount(mountpoint, recursive=True) + # Wait for udev to finish processing events so the kernel drops + # any lingering reference on the mapper device before we close it. + try: + run(['udevadm', 'settle', '--timeout=5']) + except Exception: + pass + # And close it if possible. debug(f'Closing crypt device {child.name}') - SysCommand(f'cryptsetup close {child.name}') + + mapper_dev = Path(f'/dev/mapper/{child.name}') + try: + SysCommand(f'cryptsetup close {child.name}') + except SysCallError as err: + debug(f'cryptsetup close failed ({err}), retrying with --deferred') + try: + SysCommand(f'cryptsetup close --deferred {child.name}') + debug(f'cryptsetup close --deferred issued for {child.name}') + except SysCallError as deferred_err: + raise DiskError( + f'Could not close luks2 device "{child.name}": {deferred_err}' + ) from deferred_err + + # Wait until the mapper device node actually disappears before returning. + # Subsequent commands (wipefs, mkfs, etc.) will fail with "Device busy" + # if we return while the node still exists. + for _ in range(15): + if not mapper_dev.exists(): + break + debug(f'Waiting for {mapper_dev} to disappear...') + time.sleep(1) + else: + raise DiskError(f'Mapper device {mapper_dev} did not disappear after close') def create_keyfile(self, target_path: Path, override: bool = False) -> None: """ @@ -286,4 +328,4 @@ def unlock_luks2_dev( if not luks_handler.is_unlocked(): luks_handler.unlock() - return luks_handler + return luks_handler \ No newline at end of file diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index d0b14ba9..50d82068 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -1469,7 +1469,6 @@ DEFAULT_CIPHER = 'aes-xts-plain64' # block-cipher + chainmode + ivmode strings (e.g. aes-xts-plain64). # Mapping: cipher value used in --cipher -> required --integrity value AEAD_CIPHERS: dict[str, str] = { - 'chacha20-random': 'poly1305', 'aes-gcm-random': 'aead', } @@ -1686,4 +1685,4 @@ class LsblkInfo(BaseModel): @classmethod def fields(cls) -> list[str]: - return [field.alias or name for name, field in cls.model_fields.items() if name != 'children'] + return [field.alias or name for name, field in cls.model_fields.items() if name != 'children'] \ No newline at end of file