import archinstall # Select a harddrive and a disk password archinstall.log(f"Minimal only supports:") archinstall.log(f" * Being installed to a single disk") if archinstall.arguments.get('help', None): archinstall.log( f" - Optional disk encryption via --!encryption-password=<password>") archinstall.log(f" - Optional filesystem type via --filesystem=<fs type>") archinstall.log(f" - Optional systemd network via --network") archinstall.arguments['harddrive'] = archinstall.select_disk( archinstall.all_disks()) def install_on(mountpoint): # We kick off the installer by telling it where the with archinstall.Installer(mountpoint) 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() # Optionally enable networking: if archinstall.arguments.get('network', None): installation.copy_ISO_network_config(enable_services=True) installation.add_additional_packages(['nano', 'wget', 'git']) installation.install_profile('minimal')
import archinstall, getpass # Unmount and close previous runs archinstall.sys_command(f'umount -R /mnt', suppress_errors=True) archinstall.sys_command(f'cryptsetup close /dev/mapper/luksloop', suppress_errors=True) # Select a harddrive and a disk password harddrive = archinstall.select_disk(archinstall.all_disks()) disk_password = getpass.getpass(prompt='Disk password (won\'t echo): ') with archinstall.Filesystem(harddrive, archinstall.GPT) as fs: # Use the entire disk instead of setting up partitions on your own fs.use_entire_disk('luks2') if harddrive.partition[1].size == '512M': raise OSError('Trying to encrypt the boot partition for petes sake..') harddrive.partition[0].format('fat32') with archinstall.luks2(harddrive.partition[1], 'luksloop', disk_password) as unlocked_device: unlocked_device.format('btrfs') with archinstall.Installer(unlocked_device, boot_partition=harddrive.partition[0], hostname='testmachine') as installation: if installation.minimal_installation(): installation.add_bootloader() installation.add_additional_packages(['nano', 'wget', 'git']) installation.install_profile('awesome')
def ask_user_questions(): """ First, we'll ask the user for a bunch of user input. Not until we're satisfied with what we want to install will we continue with the actual installation steps. """ if not archinstall.arguments.get('keyboard-language', None): archinstall.arguments[ 'keyboard-language'] = archinstall.select_language( archinstall.list_keyboard_languages()).strip() # Before continuing, set the preferred keyboard layout/language in the current terminal. # This will just help the user with the next following questions. if len(archinstall.arguments['keyboard-language']): archinstall.set_keyboard_language( archinstall.arguments['keyboard-language']) # Set which region to download packages from during the installation if not archinstall.arguments.get('mirror-region', None): archinstall.arguments[ 'mirror-region'] = archinstall.select_mirror_regions( archinstall.list_mirrors()) else: selected_region = archinstall.arguments['mirror-region'] archinstall.arguments['mirror-region'] = { selected_region: archinstall.list_mirrors()[selected_region] } # Ask which harddrive/block-device we will install to if archinstall.arguments.get('harddrive', None): archinstall.arguments['harddrive'] = archinstall.BlockDevice( archinstall.arguments['harddrive']) else: archinstall.arguments['harddrive'] = archinstall.select_disk( archinstall.all_disks()) # Perform a quick sanity check on the selected harddrive. # 1. Check if it has partitions # 3. Check that we support the current partitions # 2. If so, ask if we should keep them or wipe everything if archinstall.arguments['harddrive'].has_partitions(): archinstall.log( f"{archinstall.arguments['harddrive']} contains the following partitions:", fg='yellow') # We curate a list pf supported paritions # and print those that we don't support. partition_mountpoints = {} for partition in archinstall.arguments['harddrive']: try: if partition.filesystem_supported(): archinstall.log(f" {partition}") partition_mountpoints[partition] = None except archinstall.UnknownFilesystemFormat as err: archinstall.log(f" {partition} (Filesystem not supported)", fg='red') # We then ask what to do with the paritions. if (option := archinstall.ask_for_disk_layout()) == 'abort': archinstall.log( f"Safely aborting the installation. No changes to the disk or system has been made." ) exit(1) elif option == 'keep-existing': archinstall.arguments['harddrive'].keep_partitions = True archinstall.log( f" ** You will now select which partitions to use by selecting mount points (inside the installation). **" ) archinstall.log( f" ** The root would be a simple / and the boot partition /boot (as all paths are relative inside the installation). **" ) while True: # Select a partition partition = archinstall.generic_select( partition_mountpoints.keys(), "Select a partition by number that you want to set a mount-point for (leave blank when done): " ) if not partition: break # Select a mount-point mountpoint = input( f"Enter a mount-point for {partition}: ").strip(' ') if len(mountpoint): # Get a valid & supported filesystem for the parition: while 1: new_filesystem = input( f"Enter a valid filesystem for {partition} (leave blank for {partition.filesystem}): " ).strip(' ') if len(new_filesystem) <= 0: if partition.encrypted and partition.filesystem == 'crypto_LUKS': old_password = archinstall.arguments.get( '!encryption-password', None) if not old_password: old_password = input( f'Enter the old encryption password for {partition}: ' ) if (autodetected_filesystem := partition.detect_inner_filesystem( old_password)): new_filesystem = autodetected_filesystem else: archinstall.log( f"Could not auto-detect the filesystem inside the encrypted volume.", fg='red') archinstall.log( f"A filesystem must be defined for the unlocked encrypted partition." ) continue break # Since the potentially new filesystem is new # we have to check if we support it. We can do this by formatting /dev/null with the partitions filesystem. # There's a nice wrapper for this on the partition object itself that supports a path-override during .format() try: partition.format(new_filesystem, path='/dev/null', log_formating=False, allow_formatting=True) except archinstall.UnknownFilesystemFormat: archinstall.log( f"Selected filesystem is not supported yet. If you want archinstall to support '{new_filesystem}', please create a issue-ticket suggesting it on github at https://github.com/Torxed/archinstall/issues." ) archinstall.log( f"Until then, please enter another supported filesystem." ) continue except archinstall.SysCallError: pass # Expected exception since mkfs.<format> can not format /dev/null. # But that means our .format() function supported it. break # When we've selected all three criterias, # We can safely mark the partition for formatting and where to mount it. # TODO: allow_formatting might be redundant since target_mountpoint should only be # set if we actually want to format it anyway. partition.allow_formatting = True partition.target_mountpoint = mountpoint # Only overwrite the filesystem definition if we selected one: if len(new_filesystem): partition.filesystem = new_filesystem archinstall.log('Using existing partition table reported above.')
import archinstall # Select a harddrive and a disk password archinstall.log("Minimal only supports:") archinstall.log(" * Being installed to a single disk") if archinstall.arguments.get('help', None): archinstall.log( " - Optional disk encryption via --!encryption-password=<password>") archinstall.log(" - Optional filesystem type via --filesystem=<fs type>") archinstall.log(" - Optional systemd network via --network") archinstall.arguments['harddrive'] = archinstall.select_disk( archinstall.all_blockdevices()) def install_on(mountpoint): # We kick off the installer by telling it where the with archinstall.Installer(mountpoint) 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() # Optionally enable networking: if archinstall.arguments.get('network', None): installation.copy_iso_network_config(enable_services=True) installation.add_additional_packages(['nano', 'wget', 'git']) installation.install_profile('minimal')