github archlinux/archinstall v2.2.0.RC1

latest releases: v2.8.1, v2.8.0, v2.7.2...
pre-release3 years ago

Known Issues:

  • Partitioning still has issues with some layouts, manually creating partitions and selecting "use /mnt as is" or wiping the desired drive before running archinstall is two workarounds for now (Remember to backup your data). Work is already underway to correct this, but will not make it in time for this release.

Top New Features

  • Archinstall now supports GRUB as a secondary boot loader. It's still experimental, so any issues would be appreciated if they got reported.
  • archinstall.Installer() (and subsequently the guided installer) now supports selecting kernels
  • archinstall.Installer() now supports modifying kernel parameters and other mkinitcpio related stuff
  • archinstall.Installer().pacstrap() now shows a "progress bar" of what's going on
  • Archinstall now features a multi-selection mode thanks to archinstall.generic_multi_select() - which will help users select multiple options. We've begun by allowing for selecting multiple kernels, but in the future more options that support multiple choices, such as multiple mirror selection will be introduced.
  • Archinstall supports loading configuration from a JSON file, if you wish to re-use a setup. We also ship a example JSON file, (warning: It does use /dev/sda in the example). The JSON structure that is shown on screen during installation and in /var/log/archinstall/install.log is valid configuration and can be re-used. There's also an example with additional custom commands that we support in the --config structure, which isn't produced by the guided installer log output.
  • The guided installer now allows you to optionally activate NTP if a time-zone was specified
  • A very rudimentary runas has been added to archinstall.Installer().arch_chroot(), beware that a any quotations might break this function call as it's experimental for now. There is also no error checks if the user you try to run exists or not, so make sure to create the user first. Future improvements will be made here.
  • archinstall.Installer().mkinitcpio() has been added, which can be called after modifications to Installer().MODULES or .HOOKS have been made.
  • archinstall.Installer().minimal_installation() now intalls Intel and AMD ucode binaries by default.
  • Archinstall's guided installer now has a --advanced flag, which will allow you to unlock certain additional configuration questions, such as system language. (because how the /etc/locale.conf and localectl list-locales work, there's no way to get the full list of supports locales, so you will have to know which locale to write in order for this to work, hence the --advanced flag requirement)
  • Keyboard map selection now translates in to X11-desktops as well. This thanks to #147 (comment) (We've moved to localectl for setting locales, which vastly improves reliability but also locks us into systemd more than ever)
  • Archinstall will now identify as ArchInstall for most of it's web requests, such as getting the mirror-list and similar activities.
  • archinstall.check_mirror_reachable() has been added to detect if we have a reliable connection to the configured mirrors (locally or remote)
  • archinstall.Boot(<Installer() instance>) has been added, which can temporally boot up the new installation without having to re-boot from the ISO installation medium. A use case can be where you would need to communicate with systemd to set certain configuration parameters, or communicate via dbus to services etc. As an example, this is how it could be used:
with Boot(archinstall.Installer("/mnt")) as session:
    session.SysCommand(["localectl", "set-keymap", '""'])

General Guided installation changes

  • Archinstall's guided installer will only execute if run as root
  • --help was added, which simply points to man archinstall
  • Can now be run in EFI and BIOS mode.
  • The --advanced flag was added, to unlock certain options that require more experienced users
    • Currently only --sys-language and --sys-encoding is unlocked/hidden from the general view
  • --filesystem flag now works properly to skip the file system question
  • It now asks for a default boot-loader if EFI was detected, in BIOS mode it defaults to GRUB
  • Multiple kernel selection has been added (mentioned above as well)
  • NTP option has been added after time-zone selection
  • Keyboard layout selection has been stabilized
  • --services flag/option has been added
  • --custom-commands flag/option have been added
  • --silent flag has been added, which mutes the "Would you like to chroot into" question at the end as well as other user inputs. This requires a --config` to be given in the place of asking the user for questions.

New Profiles

  • server (lets you select multiple server-category application profiles)
  • deepin
  • enlightenment
  • sway

Profile changes

  • i3 has an updated package list, which now includes lightdm-gtk-greeter, lightdm and dmenu
  • (Breaking Change) Most desktop applications which has little to no additional configuration other than installing packages, have now had it's profiles/application/<profile>.py removed, and the contents have moved in to the profiles/<profile>.py instead. Since it was just one additional call for "no reason".

New Application Profiles

Keep in mind that these are only accessibly if you script your own installations or to some extent select the server profile above, they are outside of the scope of the guided installer in general

  • Cockpit
  • docker
  • httpd (apache)
  • lighttpd (v1.0)
  • mariadb
  • nginx
  • postgresql
  • sshd
  • tomcat

General API Changes

  • With the previous change, we also introduce loading configuration from a JSON file with --config <config_path.json>, this configuration equals the same structure you see before the installation begins, which means you can re-use a configuration and inject it with --config.
  • (Breaking Change) The magic global variable installation has been removed effect of immediately, instead, archinstall.storage["installation_session"] is created whenever archinstall.Installer() is instantiated. This is to make it less mysterious and keeping it simple - as well as satisfy the linters which produced over 400 errors because of this alone.
  • (Breaking Change) A lot of function names have been re-named in order to facilitate some stricter PEP-8 syntaxes, this in order to make linters happier and produce less errors.
    • archinstall.sys_command() -> archinstall.SysCommand() (This function has also been re-worked from the ground up as well, but should be backwards compatible, any issues of incompatibility should be reported)
    • JSON_Encoder -> JsonEncoder
    • hasUEFI -> has_uefi
    • hasWifi -> has_wifi
    • graphicsDevices -> graphics_devices
    • hasNvidiaGraphics -> has_nvidia_graphics
    • hasAmdGraphics -> has_amd_graphics
    • hasIntelGraphics -> has_intel_graphics
    • archinstall.Installer().copy_ISO_network_config -> archinstall.Installer().copy_iso_network_config
    • archinstall.getHwAddr -> archinstall.get_hw_addr
    • archinstall.enrichIfaceTypes -> archinstall.enrich_iface_types
    • archinstall.wirelessScan -> archinstall.wireless_scan
    • archinstall.GetWirelessNetworks -> archinstall.get_wireless_networks
    • archinstall. -> archinstall.
    • archinstall. -> archinstall.
  • (Deprecated) archinstall.LOG_LEVELS have been deprecated, instead, normal logging.<level> can be used. Next version will remove these old level definitions permanently.
  • archinstall.Partition().mount() now supports passing down mount options when called via options=<string with mount flags>
  • archinstall.Filesystem(mode=<archinstall.GPT|archinstall.MBR>) now supports MBR, allowing for older hardware to be used. This is still some what experimental, and archinstall.Filesystem().use_entire_disk() will honor GPT if UEFI is detected but fall back on MBR if EFI vars isn't present. Use manual formatting if you want to override and use MBR on EFI compliant hardware.
  • archinstall.disk_layouts() have been added as a helper function to get an overview of the partition layout at any given moment. This function is called before and after an installation and added to the logs for easier support. If you wish to hide any disk information from the logs, make sure to remove this if you do not wish to expose your total disk setup. Only the disk SIZE and TYPE are added to the logs other than the identifiers themselves.
  • locate_binary() now raises a RequirementError when the binary can not be found.
  • (Breaking Change) SysCommand() Has been re-worked a lot, the following logic has been split into a new class called SysCommandWorker()
    • It no longer has the ability to emulate a command, this might be brought back later if the need for it is great.
    • .raw_cmd no longer exists, it's just cmd
    • .callback and .start_callback has been merged into .callbacks which now is a dictionary with two keys currently: on_start and on_end (currently not in use, but that's the future)
    • .peak_output is a boolean to control if we should trail the command output (we don't strip \n, but we do stay on the same line as long as no new line was given)
    • .status has been removed, instead you can rely on .is_alive() and .exit_code.
    • .is_alive() is a new function that does what it sounds like
    • It now supports the in operator, if b"/home" in SysCommand("pwd") for instance.
    • for line in SysCommand() as previously mentioned now only iterates the latest output since the last iteration.
    • .write() has been added to communicate with a process
    • .tell() will give you the current position in the trace log.
    • .seek() will move to a position in the trace log
    • .peak() is the internal function called on bytes to print it, something you wouldn't normally use, but you can override it.
    • .poll() will perform emptying of buffers and perform work on the process, it also updates if the process is alive or not.
    • .execute() will initate execution of the command and setup all the registers and stuff
    • .decode(encoding='utf-8') will return the trace log decoded in the given encoding
  • SysCommand() has been reworked - but should work the same way as before, but while utilizing SysCommandWorker():
    • .trace_log is now a property that fetches the SysCommandWorker()'s instance variable ._trace_log
    • If SysCommand() is put in a with context, it will return the inner SysCommandWorker() for raw processing, rather than returning itself.
    • SysCommand() will not raise exceptions, instead it will log errors, instead handle.exit_code should be used. This was done to weed out bad behavior, since some commands use exit codes as status messages rather than actual errors.
    • Using SysCommand() in a string, for instance like f"This path is cool: {SysCommand('pwd')}" will automatically decode into a UTF-8 string of the output from the command.
    • SysCommand() can also be JSON-dumped with the JsonEncoder, without the trace log.
    • Also has the .decode() function
  • archinstall.pid_exists() has been added to find out if a pid exists or not
  • archinstall.run_custom_user_commands() have been added as a helper function to execute custom commands in the --config file.
  • Most modules have now gotten a __packages__ definition, for instance in hardware.py a __packages__ has been created with the different drivers that it offers. This will allow us to do package inventory externally. Which will help with giving feedback of what we support. It can also be used in projects like archoffline to source packages during build time.
  • hardware now also maintains a list of graphics drivers, called archinstall.lib.hardware.AVAILABLE_GFX_DRIVERS
  • archinstall.has_amd_cpu() has been added
  • archinstall.has_intel_cpu() has been added
  • archinstall.is_vm() has been added
  • A lot of docstring and typing has been done to help IDE users navigate the code.
  • Listing keyboard mappings now uses localectl list-keymaps
  • archinstall.set_keyboard_language now uses localectl instead of loadkeys
  • (Breaking Change) archinstall.Profile() will now reset the namespace on every with context opening. This to ensure that it's started with the correct name-space, make sure to override .original_namespace if you want to take back control, otherwise whatever the namespace was on creation will be reverted on each instance.
  • (Breaking Change) archinstall.Profile().is_top_level_profile has been re-worked to make sure not just a comment saying # top_level_profile = True exists, but it has to be an actual declared variable now.
  • An error in Profile lookups have been fixed, where the search paths (PROFILE_PATH) was some what broken due to a previous re-work.
  • archinstall.generic_multi_select() has been added which allows for selecting multiple options.
  • archinstall.MiniCurses has been added, to emulate ncurses some what, without having to pull in all that it entails.
  • archinstall.ask_for_bootloader() has been added.
  • archinstall.select_profile() will now only show top level profiles, but entering any valid profile should also be supported.
  • archinstall.select_driver() has been added, to select available graphics drivers
  • archinstall.select_kernel() has been added, to select given kernels, uses generic_multi_select for this
  • A lot of changes to the documentation, mainly surrounding --config has been re-worked or added.
  • Introduced linting and automated ISO builds on commits and pull requests for easier contributions.

Don't miss a new archinstall release

NewReleases is sending notifications on new releases.