github archlinux/archinstall v2.4.0.rc2
v2.4.0.RC2

latest releases: v2.8.6, v2.8.5, v2.8.4...
pre-release2 years ago

ℹ️ Changes up until: 7f0ccbe

Breaking Changes

  • archinstall.SysCommand* now properly raises exceptions when exit codes are bad. This used to go by unnoticed in some cases, which caused silent errors. The flip-side to this is that it may now be overly aggressive and cause breakage at certain points. In which case the call itself should be wrapped around a catch block. As an example:
    if (result := archinstall.SysCommand("ls --breaking-arguments")).exit_code != 0
    Should now be:
    try:
        result = archinstall.SysCommand("ls --breaking-arguments")
    except SysCallError as error:
        if error.exit_code != 0:
    This avoids the risk of calls silently passing errors.
  • archinstall/lib/models/network_configuration.py has been added to more strictly handle different data classes, instead of dictionaries. More models will be added and have been added, but will move under models/ in a near future.
  • archinstall.Filesystem().load_layout() now looks for the keyword "wipe": True and not "format": True. This is to avoid confusion as to what the menu alternatives does, for instance "mark partition for wiping" as well as avoid mixing up the format options like "filesystem" and other options during formatting.
  • archinstall.find_package() now returns a data class to make it easier to detect upstream changes during normal operation. If pydantic ever becomes a built-in, we'll use that instead. (This change affects archinstall.find_packages() as well)
  • archinstall.lib.packages.py has been split and moved into /lib/packages/*.py (exposed the same way, so should not cause any issues)
  • python -m archinstall now includes a loader to look for archinstall in ./ for testing. This may or may not cause confusion or path issues that we haven't found yet. That also means that if you execute the modules with a folder called ./archinstall that will have priority over any installed library via pip or pacman (this is to prioritize testing)
  • archinstall.generic_multi_select and archinstall.generic_select now uses the new menu system. Return values should remain the same.
  • (Potentially breaking change) ConfigurationOutput has been added in archinstall/lib/configuration.py to deal with configuration aspects of archinstall. It's in charge of showing, storing and loading different configurations in one place. Previously this was done by guided, and then __init__.py for a brief moment.
  • archinstall.all_disks have been renamed to archinstall.all_blockdevices (an alias still exists, but is deprecated)
  • archinstall.all_disks archinstall.all_blockdevices no longer relies on lsblk for information, instead a combination of /sys/class/block/* and blkid is used.
  • archinstall.all_disks archinstall.all_blockdevices now returns dataclasses for the objects, rather than dictionary/string objects. This will be a significant change for anyone dealing with block devices manually before.
  • archinstall.Installer().configure_nic now takes a NetworkConfiguration data class structure. This will only be an issue if you've manually created installation steps and configured network manually, this will have no effect on the guided installer.
    Note that nic in the user_configuration.json has changed to reflect the above change.
  • archinstall/lib/user_interaction.py has been split into multiple files as it outgrew it's simple purpose. It now lives in archinstall/lib/user_interaction/init.py and it's subdirectory, imports should work the same, but might cause some breakage here and there. Breakage should be considered a bug and we've probably just missed one import somewhere to expose the different calls. Please do report these.

New Features

  • A completely new menu system (still accessibility friendly) using simple-term-menu as the base (bundled with this source to avoid external dependencies. A big thank you to Ingo Meyer and his employer at the time):
    screenshot
    A enormous thank you to @wllacer and @svartkanin who's put in more than 1200 lines of code to get this working nicely.
  • Localization/Translation options for all archinstall output (Currently us, es and se is available). To contribute please read the translation contribution README
  • Introduction of pytest test cases for a lot of the code
  • archinstall.package_search() was added to streamline the package search into one place, and move the logic for parsing the results into find_package() instead.
  • archinstall.Installer().minimal_installation now has two new flags, testing=False and multilib=False.
    • archinstall.Installer() now has a new function .enable_multilib_repository() which enables multilib in the pacman conf.
    • archinstall.Installer() now has a new function .enable_testing_repositories() which enables testing repos in the pacman conf.
  • Created archinstall.load_config() and archinstall.save_config() functions for loading and saving configurations, instead of having it in guided. This should allow people to seamlessly load configurations and save it through the "archinstall" format. No need to create your own format and configurations unless you want to. Arguments are always initialized through archinstall.storage['arguments'] but this should allow for processing configurations through --conf independent of guided.
  • archinstall.post_process_arguments() has been added and will be execute after loading of configurations. This cleans up any arguments and converts it to proper archinstall structures.
  • The .uuid property of archinstall.Partition() and archinstall.BlockDevice() now uses blkid instead of lsblk, which should improve reliability and stability when used together with partprobe.
  • Improvements to the BTRFS handling has been made, namely allowing for more complex layouts. Among those things are also the option for compression and nodatacow.
  • Partitions now has a "bind name" definition to deal with BTRFS "virtual" namespace. archinstall.split_bind_name() can split partition representations into traditional /dev/x and @/.
  • archinstall.Partition().end_sectors has been added to give the sector at which the partition ends, .size now uses lsblk to return the size.
  • archinstall.Partition().device_path now returns /dev/x even if the partition has a logical namespace attached to it.
  • archinstall.Partition().bind_name has been added to get the logical namespace for a partition
  • archinstall.Partition().partprobe now only calls partprobe on the partition itself, rather than system wide.
  • archinstall.Partition().format() now homogenize the name of the filesystem to format so that vfat and fat32 are treated equally for instance.
  • archinstall.Partition().mount() now handles BTRFS virtual namespaces by checking the .bind_name property and adds the corresponding mount options required.
  • archinstall.SysCommand* now escapes VT100 escape codes by default on the output when iterating over the result output.
  • Multiple partitions now store a key-file for each partition, but not for multiple subvolumes using the same luks volume.
  • archinstall.Installer() now keeps track of which packages have been installed.
  • archinstall.minimal_installation() now enables periorid trim by default
  • archinstall.add_bootloader() now sets --removable for GRUB on UEFI to try and eliminate some oddities where EFI wouldn't boot the GRUB setup.
  • archinstall.SysCommand* now allows to override system locales. By default en_US locale will be set. But this could be useful for overriding locales and get output in another language. Keep in mind that output matching (if b'example' in SysCommand("ssh @x") would need to be localized from 'example' to for instance 'exempel' in swedish if you override en_US)
  • archinstall.list_installed_locales() has been added to list the available locales
  • archinstall.list_timezones() has been added to show available time-zones using timedatectl as the source of truth
  • archinstall.update_keyring() has been added as a specific call to make it clear what we're doing in guided. Guided will now attempt update the keyring if it's out of date. This function is deprecated upon release and will be removed once stability to archlinux-keyring can be guaranteed. (Upstream is tracking this in a private issue https://gitlab.archlinux.org/archlinux/archlinux-keyring/-/issues/4)
  • Examples have been created for --disk_layouts, --creds and --conf. Since they are now split into separate files to comply with security concerns when sharing user configurations publicly. This makes supporting easier, and multiple machine setups easier as they can share common --conf but have different --disk_layouts for instance.
  • profiles/applications/pipewire.py has been added as a application profile to properly configure pipewire
  • Python based qtile has been added as a new Windows Manager (WM)
  • archinstall.group_search() have been added to return information about a package group
  • archinstall.get_subvolumes_from_findmnt() takes a findmt JSON struct and yields BtrfsSubvolume dataclasses for each result found.
  • archinstall.get_subvolume_info() takes a path, and returns a dict containing all the information about the subvolume
  • archinstall/lib/disk/dmcryptdev.py data class has been added to separate logic between block devices, loopdevices and dmcrypt devices specifically.
    • DMCryptDev().MapperDev can be used to access the mapper device associated. dm-0 -> /dev/mapper/luksloop for instance.
    • DMCryptDev().mountpoint can be used to see where the cryptdev is mounted
    • DMCryptDev().filesystem returns the mapperdev's filesystem
  • archinstall/lib/disk/mapperdev.py data class has been added just like dmcryptdev to separate logic between devices further.
    • MapperDev().subvolumes is one of the few/many helper functions which returns subvolumes on the specified /dev/mapper/<dev> device.
  • archinstall.blkid() has been added to help with calling, parsing and returning data from blkid. Returns a dict with the information.
  • archinstall.get_loop_info() returns losetup information in a dict structure
  • archinstall.enrich_blockdevice_information can enrich blkid and other structures with information from /sys/class/block/*
  • archinstall.uevent() is a parser for /sys/class/block/{dev_name}/uevent information
  • archinstall.get_blockdevice_uevent() retrieves information for a given /sys/class/block/{dev_name}/uevent dev name.
  • archinstall.get_parent_of_partition() returns a string path to the parent of a partition
  • archinstall.find_mountpoint() returns a dict containing information returned from findmnt without additional parsing
  • archinstall.get_all_targets() cleans up findmnt and returns only the mount point based on looking at targets
  • archinstall.Partition().mountpoint has been added to make it easier to access where a partition is mounted.
  • archinstall.Partition().subvolumes has been added and iterates all subvolumes under the specific partition
  • archinstall.TranslationError is a new exception that might pop up
  • archinstall.Installer().add_bootloader() now called separate functions for the three different supported boot loader. The code does the same more or less, just separated into functions for easier maintenance.
    • archinstall.Installer().add_systemd_bootloader()
    • archinstall.Installer().add_grub_bootloader()
    • archinstall.Installer().add_efistub_bootloader()
  • archinstall.Installer().enable_sudo now places configurations in /etc/sudoers.d/* instead of modifying /etc/sudoers.
  • archinstall.log() now supports a few more new colors:
    screenshot
  • archinstall.run_pacman() has been added to deal with calling pacman.
    In the future, this call will try to re-run failed pacman executions, but for now it simply adds some error handling for one attempt.

Plugin changes

  • on_user_created has been added to perform post-creation actions on user profiles

Profile changes

Minor changes and bug fixes

  • archinstall.define_arguments() has been added to separate the logic of setting up ArgumentParser arguments.
  • Fixed all arguments so that they support both --x="something" and --x "something".
  • Typing has been added throughout archinstall
  • Added a lot of tweaks and bug fixes to how we handle partitions, which should eliminate a bunch of issues surrounding sorting of partitions as well as working with them through the partition["device_instance"].
  • archinstall.Filesystem().partprobe now only calls partprobe on the target filesystem, not system wide.
  • archinstall.Boot() now properly exits cleanly when the temporary boot shuts down. Previously it only took into account the shutdown now call exit code, which could sometimes exit badly even tho the machine spun down properly. Now it checks both shutdown now and the containers process for an exit code.
  • Guided has been updated to use the new menu system, as well as code made simpler by leaning on archinstall library calls for many things
  • only_hdd.py has been added as an example, of how to only manage partitions and not installing.
  • kwrite replaced kate in the KDE profile
  • sway now checks if nvidia is being used, in which case it warns that it's not supported.
  • network-manager-applet has been removed from xfce4
  • The xorg profile now properly sets amdgpu modules in the mkinitcpio hooks
  • The build-system has been changed/updated to not use flit for everything
  • archinstall is now a reproducible build
  • Fixed some URL's in the README to work better across documentation platforms

Don't miss a new archinstall release

NewReleases is sending notifications on new releases.