def os_setup(installation): # if len(mirrors): # Certain services might be running that affects the system during installation. # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist # We need to wait for it before we continue since we opted in to use a custom mirror/region. installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO) while archinstall.service_state('reflector') not in ('dead', 'failed'): time.sleep(1) # Set mirrors used by pacstrap (outside of installation) if archinstall.arguments.get('mirror-region', None): archinstall.use_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors for the live medium if installation.minimal_installation(): installation.set_locale(archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper()) installation.set_hostname(archinstall.arguments['hostname']) if archinstall.arguments['mirror-region'].get("mirrors", None) is not None: installation.set_mirrors( archinstall.arguments['mirror-region']) # Set the mirrors in the installation medium if archinstall.arguments["bootloader"] == "grub-install" and archinstall.has_uefi(): installation.add_additional_packages("grub") installation.add_bootloader(archinstall.arguments["bootloader"]) if archinstall.arguments['swap']: installation.setup_swap('zram') network_config = archinstall.arguments.get('nic', None) if network_config: handler = NetworkConfigurationHandler(network_config) handler.config_installer(installation) if archinstall.arguments.get('audio', None) is not None: installation.log(f"This audio server will be used: {archinstall.arguments.get('audio', None)}",level=logging.INFO) if archinstall.arguments.get('audio', None) == 'pipewire': archinstall.Application(installation, 'pipewire').install() elif archinstall.arguments.get('audio', None) == 'pulseaudio': print('Installing pulseaudio ...') installation.add_additional_packages("pulseaudio") else: installation.log("No audio server will be installed.", level=logging.INFO) if archinstall.arguments.get('packages', None) and archinstall.arguments.get('packages', None)[0] != '': installation.add_additional_packages(archinstall.arguments.get('packages', None)) if archinstall.arguments.get('profile', None): installation.install_profile(archinstall.arguments.get('profile', None)) if archinstall.arguments.get('!users',{}): for user, user_info in archinstall.arguments.get('!users', {}).items(): installation.user_create(user, user_info["!password"], sudo=False) if archinstall.arguments.get('!superusers',{}): for superuser, user_info in archinstall.arguments.get('!superusers', {}).items(): installation.user_create(superuser, user_info["!password"], sudo=True) if timezone := archinstall.arguments.get('timezone', None): installation.set_timezone(timezone) if archinstall.arguments.get('ntp', False): installation.activate_time_syncronization() if archinstall.accessibility_tools_in_use(): installation.enable_espeakup() if (root_pw := archinstall.arguments.get('!root-password', None)) and len(root_pw): installation.user_set_pw('root', root_pw)
def perform_installation(mountpoint): user_credentials = {} if archinstall.arguments.get('!users'): user_credentials["!users"] = archinstall.arguments['!users'] if archinstall.arguments.get('!superusers'): user_credentials["!superusers"] = archinstall.arguments['!superusers'] if archinstall.arguments.get('!encryption-password'): user_credentials["!encryption-password"] = archinstall.arguments['!encryption-password'] with open("/var/log/archinstall/user_credentials.json", "w") as config_file: config_file.write(json.dumps(user_credentials, indent=4, sort_keys=True, cls=archinstall.UNSAFE_JSON)) """ Performs the installation steps on a block device. Only requirement is that the block devices are formatted and setup prior to entering this function. """ with archinstall.Installer(mountpoint, kernels=archinstall.arguments.get('kernels', 'linux')) as installation: # Mount all the drives to the desired mountpoint # This *can* be done outside of the installation, but the installer can deal with it. if archinstall.storage.get('disk_layouts'): installation.mount_ordered_layout(archinstall.storage['disk_layouts']) # Placing /boot check during installation because this will catch both re-use and wipe scenarios. for partition in installation.partitions: if partition.mountpoint == installation.target + '/boot': if partition.size <= 0.25: # in GB _msg = "The selected /boot partition in use is not large enough to properly install a boot loader. " _msg += "Please resize it to at least 256MB and re-run the installation." raise archinstall.DiskError(_msg) # Certain services might be running that affects the system during installation. # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist # We need to wait for it before we continue since we opted in to use a custom mirror/region. if not is_chroot(): installation.log('Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO) while archinstall.service_state('reflector') not in ('dead', 'failed'): time.sleep(1) # Set mirrors used by pacstrap (outside of installation) if archinstall.arguments.get('mirror-region', None): archinstall.use_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors for the live medium if installation.minimal_installation(): installation.set_locale(archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper()) installation.set_hostname(archinstall.arguments['hostname']) if archinstall.arguments['mirror-region'].get("mirrors", None) is not None: installation.set_mirrors(archinstall.arguments['mirror-region']) # Set the mirrors in the installation medium if archinstall.arguments["bootloader"] == "grub-install" and archinstall.has_uefi(): installation.add_additional_packages("grub") installation.add_bootloader(archinstall.arguments["bootloader"]) if archinstall.arguments['swap']: installation.setup_swap('zram') # If user selected to copy the current ISO network configuration # Perform a copy of the config if archinstall.arguments.get('nic', {}) == 'Copy ISO network configuration to installation': installation.copy_iso_network_config(enable_services=True) # Sources the ISO network configuration to the install medium. elif archinstall.arguments.get('nic', {}).get('NetworkManager', False): installation.add_additional_packages("networkmanager") installation.enable_service('NetworkManager.service') # Otherwise, if a interface was selected, configure that interface elif archinstall.arguments.get('nic', {}): installation.configure_nic(**archinstall.arguments.get('nic', {})) installation.enable_service('systemd-networkd') installation.enable_service('systemd-resolved') if archinstall.arguments.get('audio', None) is not None: installation.log(f"This audio server will be used: {archinstall.arguments.get('audio', None)}", level=logging.INFO) if archinstall.arguments.get('audio', None) == 'pipewire': print('Installing pipewire ...') installation.add_additional_packages(["pipewire", "pipewire-alsa", "pipewire-jack", "pipewire-media-session", "pipewire-pulse", "gst-plugin-pipewire", "libpulse"]) elif archinstall.arguments.get('audio', None) == 'pulseaudio': print('Installing pulseaudio ...') installation.add_additional_packages("pulseaudio") else: installation.log("No audio server will be installed.", level=logging.INFO) if archinstall.arguments.get('packages', None) and archinstall.arguments.get('packages', None)[0] != '': installation.add_additional_packages(archinstall.arguments.get('packages', None)) if archinstall.arguments.get('profile', None): installation.install_profile(archinstall.arguments.get('profile', None)) for user, user_info in archinstall.arguments.get('!users', {}).items(): installation.user_create(user, user_info["!password"], sudo=False) for superuser, user_info in archinstall.arguments.get('!superusers', {}).items(): installation.user_create(superuser, user_info["!password"], sudo=True) if timezone := archinstall.arguments.get('timezone', None): installation.set_timezone(timezone) if archinstall.arguments.get('ntp', False): installation.activate_time_syncronization() if archinstall.accessibility_tools_in_use(): installation.enable_espeakup() if (root_pw := archinstall.arguments.get('!root-password', None)) and len(root_pw): installation.user_set_pw('root', root_pw) # This step must be after profile installs to allow profiles to install language pre-requisits. # After which, this step will set the language both for console and x11 if x11 was installed for instance. installation.set_keyboard_language(archinstall.arguments['keyboard-layout']) if archinstall.arguments['profile'] and archinstall.arguments['profile'].has_post_install(): with archinstall.arguments['profile'].load_instructions(namespace=f"{archinstall.arguments['profile'].namespace}.py") as imported: if not imported._post_install(): archinstall.log(' * Profile\'s post configuration requirements was not fulfilled.', fg='red') exit(1)
def perform_installation(mountpoint): """ Performs the installation steps on a block device. Only requirement is that the block devices are formatted and setup prior to entering this function. """ with archinstall.Installer(mountpoint, kernels=archinstall.arguments.get( 'kernels', ['linux'])) as installation: # Mount all the drives to the desired mountpoint # This *can* be done outside of the installation, but the installer can deal with it. if archinstall.arguments.get('disk_layouts'): installation.mount_ordered_layout( archinstall.arguments['disk_layouts']) # Placing /boot check during installation because this will catch both re-use and wipe scenarios. for partition in installation.partitions: if partition.mountpoint == installation.target + '/boot': if partition.size < 0.19: # ~200 MiB in GiB raise archinstall.DiskError( f"The selected /boot partition in use is not large enough to properly install a boot loader. Please resize it to at least 200MiB and re-run the installation." ) # if len(mirrors): # Certain services might be running that affects the system during installation. # Currently, only one such service is "reflector.service" which updates /etc/pacman.d/mirrorlist # We need to wait for it before we continue since we opted in to use a custom mirror/region. installation.log( 'Waiting for automatic mirror selection (reflector) to complete.', level=logging.INFO) while archinstall.service_state('reflector') not in ('dead', 'failed'): time.sleep(1) # If we've activated NTP, make sure it's active in the ISO too and # make sure at least one time-sync finishes before we continue with the installation if archinstall.arguments.get('ntp', False): # Activate NTP in the ISO archinstall.SysCommand('timedatectl set-ntp true') # TODO: This block might be redundant, but this service is not activated unless # `timedatectl set-ntp true` is executed. logged = False while archinstall.service_state( 'dbus-org.freedesktop.timesync1.service') not in ( 'running'): if not logged: installation.log( f"Waiting for dbus-org.freedesktop.timesync1.service to enter running state", level=logging.INFO) logged = True time.sleep(1) logged = False while 'Server: n/a' in archinstall.SysCommand( 'timedatectl timesync-status --no-pager --property=Server --value' ): if not logged: installation.log( f"Waiting for timedatectl timesync-status to report a timesync against a server", level=logging.INFO) logged = True time.sleep(1) # Set mirrors used by pacstrap (outside of installation) if archinstall.arguments.get('mirror-region', None): archinstall.use_mirrors(archinstall.arguments['mirror-region'] ) # Set the mirrors for the live medium # Retrieve list of additional repositories and set boolean values appropriately enable_testing = 'testing' in archinstall.arguments.get( 'additional-repositories', None) enable_multilib = 'multilib' in archinstall.arguments.get( 'additional-repositories', None) if installation.minimal_installation(testing=enable_testing, multilib=enable_multilib): installation.set_locale( archinstall.arguments['sys-language'], archinstall.arguments['sys-encoding'].upper()) installation.set_hostname(archinstall.arguments['hostname']) if archinstall.arguments['mirror-region'].get("mirrors", None) is not None: installation.set_mirrors( archinstall.arguments['mirror-region'] ) # Set the mirrors in the installation medium if archinstall.arguments['swap']: installation.setup_swap('zram') if archinstall.arguments[ "bootloader"] == "grub-install" and archinstall.has_uefi(): installation.add_additional_packages("grub") installation.add_bootloader(archinstall.arguments["bootloader"]) # If user selected to copy the current ISO network configuration # Perform a copy of the config network_config = archinstall.arguments.get('nic', None) if network_config: handler = NetworkConfigurationHandler(network_config) handler.config_installer(installation) if archinstall.arguments.get('audio', None) is not None: installation.log( f"This audio server will be used: {archinstall.arguments.get('audio', None)}", level=logging.INFO) if archinstall.arguments.get('audio', None) == 'pipewire': archinstall.Application(installation, 'pipewire').install() elif archinstall.arguments.get('audio', None) == 'pulseaudio': print('Installing pulseaudio ...') installation.add_additional_packages("pulseaudio") else: installation.log("No audio server will be installed.", level=logging.INFO) if archinstall.arguments.get('packages', None) and archinstall.arguments.get( 'packages', None)[0] != '': installation.add_additional_packages( archinstall.arguments.get('packages', None)) if archinstall.arguments.get('profile', None): installation.install_profile( archinstall.arguments.get('profile', None)) if archinstall.arguments.get('!users', {}): for user, user_info in archinstall.arguments.get('!users', {}).items(): installation.user_create(user, user_info["!password"], sudo=False) if archinstall.arguments.get('!superusers', {}): for superuser, user_info in archinstall.arguments.get( '!superusers', {}).items(): installation.user_create(superuser, user_info["!password"], sudo=True) if timezone := archinstall.arguments.get('timezone', None): installation.set_timezone(timezone) if archinstall.arguments.get('ntp', False): installation.activate_time_syncronization() if archinstall.accessibility_tools_in_use(): installation.enable_espeakup() if (root_pw := archinstall.arguments.get('!root-password', None)) and len(root_pw): installation.user_set_pw('root', root_pw) # This step must be after profile installs to allow profiles to install language pre-requisits. # After which, this step will set the language both for console and x11 if x11 was installed for instance. installation.set_keyboard_language( archinstall.arguments['keyboard-layout']) if archinstall.arguments['profile'] and archinstall.arguments[ 'profile'].has_post_install(): with archinstall.arguments['profile'].load_instructions( namespace= f"{archinstall.arguments['profile'].namespace}.py" ) as imported: if not imported._post_install(): archinstall.log( ' * Profile\'s post configuration requirements was not fulfilled.', fg='red') exit(1)