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): while True: try: archinstall.arguments[ 'keyboard-language'] = archinstall.select_language( archinstall.list_keyboard_languages()).strip() break except archinstall.RequirementError as err: archinstall.log(err, fg="red") # 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): while True: try: archinstall.arguments[ 'mirror-region'] = archinstall.select_mirror_regions( archinstall.list_mirrors()) break except archinstall.RequirementError as e: archinstall.log(e, fg="red") 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()) if archinstall.arguments['harddrive'] is None: archinstall.arguments['target-mount'] = '/mnt' # 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'] and archinstall.arguments[ 'harddrive'].has_partitions(): archinstall.log( f"{archinstall.arguments['harddrive']} contains the following partitions:", fg='yellow') # We curate a list pf supported partitions # 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 partitions. 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). **" ) mountpoints_set = [] while True: # Select a partition # If we provide keys as options, it's better to convert them to list and sort before passing mountpoints_list = sorted(list(partition_mountpoints.keys())) partition = archinstall.generic_select( mountpoints_list, "Select a partition by number that you want to set a mount-point for (leave blank when done): " ) if not partition: if set(mountpoints_set) & {'/', '/boot'} == {'/', '/boot'}: break continue # Select a mount-point mountpoint = input( f"Enter a mount-point for {partition}: ").strip(' ') if len(mountpoint): # Get a valid & supported filesystem for the partition: 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_formatting=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/archlinux/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 criteria, # 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. mountpoints_set.append(mountpoint) 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 archdrives = archinstall.all_disks() print(f"Please select a drive: 0 - {len(archdrives) - 1}") i = 0 drives = [] for drive in archdrives: print(f"{i}: {drive}") drives.append(drive) i += 1 selected_drive = drives[int(input())] print(f"Installing on the drive \"{selected_drive}\"") mode = archinstall.GPT fs = archinstall.Filesystem(selected_drive, mode) # fs.find_partition() fs.use_entire_disk("btrfs") test = fs.add_partition("fat32", 2048, 3072) print(test)
import archinstall import json import urllib.request import git # Unmount and close previous runs (Mainly only used for re-runs, but won't hurt.) archinstall.sys_command(f'umount -R /mnt', surpress_errors=True) archinstall.sys_command(f'cryptsetup close /dev/mapper/luksloop', surpress_errors=True) # Select a harddrive and a disk password harddrive = archinstall.all_disks()['/dev/sda'] disk_password = '******' 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()
import archinstall import 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('minimal') installation.user_create('devel', 'devel')
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_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')
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-layout', None): while True: try: archinstall.arguments[ 'keyboard-layout'] = archinstall.select_language( archinstall.list_keyboard_languages()).strip() break except archinstall.RequirementError as err: archinstall.log(err, fg="red") # 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-layout']): archinstall.set_keyboard_language( archinstall.arguments['keyboard-layout']) # Set which region to download packages from during the installation if not archinstall.arguments.get('mirror-region', None): while True: try: archinstall.arguments[ 'mirror-region'] = archinstall.select_mirror_regions( archinstall.list_mirrors()) break except archinstall.RequirementError as e: archinstall.log(e, fg="red") if not archinstall.arguments.get('sys-language', None) and archinstall.arguments.get( 'advanced', False): archinstall.arguments['sys-language'] = input( "Enter a valid locale (language) for your OS, (Default: en_US): " ).strip() archinstall.arguments['sys-encoding'] = input( "Enter a valid system default encoding for your OS, (Default: utf-8): " ).strip() archinstall.log( "Keep in mind that if you want multiple locales, post configuration is required.", fg="yellow") if not archinstall.arguments.get('sys-language', None): archinstall.arguments['sys-language'] = 'en_US' if not archinstall.arguments.get('sys-encoding', None): archinstall.arguments['sys-encoding'] = 'utf-8' # Ask which harddrives/block-devices we will install to # and convert them into archinstall.BlockDevice() objects. if archinstall.arguments.get('harddrives', None) is None: archinstall.arguments['harddrives'] = archinstall.generic_multi_select( archinstall.all_disks(), text= "Select one or more harddrives to use and configure (leave blank to skip this step): ", allow_empty=True) if archinstall.arguments.get('harddrives', None) is not None and archinstall.storage.get( 'disk_layouts', None) is None: archinstall.storage['disk_layouts'] = archinstall.select_disk_layout( archinstall.arguments['harddrives']) # Get disk encryption password (or skip if blank) if archinstall.arguments['harddrives'] and archinstall.arguments.get( '!encryption-password', None) is None: if passwd := archinstall.get_password( prompt= 'Enter disk encryption password (leave blank for no encryption): ' ): archinstall.arguments['!encryption-password'] = passwd