from pathlib import Path from typing import TYPE_CHECKING, Any, List import archinstall from archinstall.lib import disk from archinstall import Installer, ProfileConfiguration, profile_handler from archinstall.default_profiles.minimal import MinimalProfile from archinstall.lib.models import Bootloader, User from archinstall.lib.user_interaction.disk_conf import select_devices, suggest_single_disk_layout if TYPE_CHECKING: _: Any def perform_installation(mountpoint: Path): disk_config: disk.DiskLayoutConfiguration = archinstall.arguments['disk_config'] disk_encryption: disk.DiskEncryption = archinstall.arguments.get('disk_encryption', None) with Installer( mountpoint, disk_config, disk_encryption=disk_encryption, kernels=archinstall.arguments.get('kernels', ['linux']) ) as installation: # Strap in the base system, add a boot loader and configure # some other minor details as specified by this profile and user. if installation.minimal_installation(): installation.set_hostname('minimal-arch') installation.add_bootloader(Bootloader.Systemd) # Optionally enable networking: if archinstall.arguments.get('network', None): installation.copy_iso_network_config(enable_services=True) installation.add_additional_packages(['nano', 'wget', 'git']) profile_config = ProfileConfiguration(MinimalProfile()) profile_handler.install_profile_config(installation, profile_config) user = User('devel', 'devel', False) installation.create_users(user) def prompt_disk_layout(): fs_type = None if filesystem := archinstall.arguments.get('filesystem', None): fs_type = disk.FilesystemType(filesystem) devices = select_devices() modifications = suggest_single_disk_layout(devices[0], filesystem_type=fs_type) archinstall.arguments['disk_config'] = disk.DiskLayoutConfiguration( config_type=disk.DiskLayoutType.Default, device_modifications=[modifications] ) def parse_disk_encryption(): if enc_password := archinstall.arguments.get('!encryption-password', None): modification: List[disk.DeviceModification] = archinstall.arguments['disk_config'] partitions: List[disk.PartitionModification] = [] # encrypt all partitions except the /boot for mod in modification: partitions += list(filter(lambda x: x.mountpoint != Path('/boot'), mod.partitions)) archinstall.arguments['disk_encryption'] = disk.DiskEncryption( encryption_type=disk.EncryptionType.Partition, encryption_password=enc_password, partitions=partitions ) prompt_disk_layout() parse_disk_encryption() fs_handler = disk.FilesystemHandler( archinstall.arguments['disk_config'], archinstall.arguments.get('disk_encryption', None) ) fs_handler.perform_filesystem_operations() mount_point = Path('/mnt') perform_installation(mount_point)