Skip to content

Releases: archlinux/archinstall

v2.3.2

28 Feb 13:24
Compare
Choose a tag to compare

Bug fixes:

  • Fixed a critical issue where if manual partitioning was performed, and the harddrive(s) selected had multiple partitions - and a disk encryption password was given afterwards, all partitions would get encrypted regardless of usage (which would encrypt prior data on other partitions in play by the harddrive selection). Multi-disk setups where only one drive was selected was fine for instance, but selecting both to re-use /boot would cause issues. #998
  • Fixed an issue where new partitions did not show up, because there was no GPT/MBR partition table on clean disks, this should fix #813

v2.3.1

26 Jan 22:43
v2.3.1
aa3b79c
Compare
Choose a tag to compare

Breaking Changes

There should be no breaking changes. But btrfs support is still in early shape so some layouts might still not be "supported".
But do note that some errors that went silently by before, now raises exceptions. Such as archinstall.Filesystem().partprobe().

Deprecated features

  • /home will be changed for next release, and instead of being set to MIN_SIZE_TO_ALLOW_HOME_PART it will be a user question that users can opt-in rather than us pushing it as a best practice. It was after reports that this was a desired behavior that we introduced it. But it's caused more trouble than it's worth. So anyone who wants a separate /home in the future will be asked so. Or they can do archinstall --dry-run to generate a /var/log/archinstall/user_disk_layouts.json and modify it to add a /home volume.
    For this version tho, we've increased the / volumes to 40 GiB to make it a bit more spacious.

New features

  • Default timeout in systemd-boot has changed from 5 to 15 seconds.
  • BTRFS subvolume default layout has changed to something that hopefully works with snapper/timeshift (not tested, but in theory should worK):
    "@": "/",
    "@home": "/home",
    "@log": "/var/log",
    "@pkg": "/var/cache/pacman/pkg",
    "@.snapshots": "/.snapshots"
    
  • archinstall.Installer() now keeps track of which packages have been installed with archinstall.Installer().pacstrap() in the variable archinstall.Installer().installed_packages.
  • archinstall.Installer().add_user() now calls a new plugin hook called plugin.on_user_created(self, user). This is used by the Application profile pipewire to enable user services pipewire-pulse.service and pipewire-media-session.service for new users.
  • Application profile pipewire has been added.
  • only_hd example was added, to be used in testing but also as an example of how to use archinstall to only perform disk operations.
  • @archinstall.plugin decorator has been added to support code to define plugins in-runtime. (used by the pipewire application profile. It's a bit rudimentary at the moment, this will be changed in coming versions)
  • mountpoint will not be set, even for / or /home if using subvolumes. This is because subvolumes have precedence in this release as we've changed the default layout to support a @ entry.

Bug fixes

  • btrfs subvolumes now get properly mounted recursively.
  • GRUB got --removable added as a parameter to support UEFI.
  • Users and Superuser questions should now properly be asked even if a root password was set. In the future, the menu system is re-worked (scheduled for v2.4.0), so this will work even better. But for now we only patched this behavior.
  • archinstall.Installer() now calls self.mkinitcpio('-P') upon exit, so that any changes done during installation by packages, profiles or plugins now get generated as a last step, right after genfstab.
  • archinstall.Installer().mount_ordered_layout() now deals with btrfs subvolumes in a more complex manner to support the new above default layout.
  • archinstall.Boot() now properly shuts down after shutdown was sent to the temporary boot of the installation session.
  • save_user_configurations() was added in the guided installer to properly save user configurations during --dry-run. Only partial configurations was saved before.
  • archinstall.Installer().add_bootloader() now supports subvolumes properly.
  • Swapped lsblk for blkid as blkid behaves more as we expect in junction with partprobe. It seams lsblk doesn't wait/understand/care about the kernel updating it's internal cache and will return "results" immediately. We haven't found a way around that, so we swapped to blkid which appears to be able to detect and wait for kernel changes before returning results *(the delay here is <0.1 seconds, but enough to cause issues such as #813 and #885
  • Improved uuid comparison by making sure they're compared fairly by using .lower() on both the real UUID and the asked for UUID for proper comparison. Which addresses #885
  • archinstall.manage_btrfs_subvolumes was introduced as a means to fixing the somewhat rudimentary btrfs support. This allows us to more properly support crazy btrfs subvolumes. See some (not to be used in production) examples here: #637, #787 & #838
  • archinstall.Filesystem().partuuid_to_index() now has an incremental time delay for each time it does not find the requested PARTUUID. And it also uses blkid for the actual PARTUUID lookup.
  • archinstall.Filesystem().partprobe() now only calls partprobe on itself, not the entire collection of blockdevices. It also raises an exception if it could not (such as on loop devices some times).
  • archinstall.Filesystem().add_partition() now raises an exception if it could not add the partition instead of silently continuing. This was mainly caused by .partprobe() silently passing by, but add_partition() did not have an exception handling either so. That is addressed now. This should also fix #885
  • archinstall.get_mount_info() will now properly set a BlockDevice() for each Partition() object, which should correspond to the partition path. For instance /dev/sda1 will have a BD of /dev/sda. And /dev/mapper/luksdev will have /dev/sda as well if it resides there.
  • archinstall.partprobe() (the overall generally exposed function, not the same in Filesystem()) got a five second sleep put to it to avoid issues where partprobe() would tell the kernel to update it's partition cache but immediately release and subsequent commands relying on the information wouldn't be able to find it.
  • archinstall.Partition().size no longer reports back a size for loop-devices, mainly because lsblk can't reliably return the data and returns a high exit code instead.
  • archinstall.Partition().uuid now uses self._safe_uuid instead which uses blkid for the same reasons as above. Also has an incremental timeout for each retry if it cannot return the PARTUUID.
  • archinstall.Partition().device_path now supports btrfs subvolume partitions by splitting out the btrfs subvolume name before returning the device path.
  • archinstall.Partition().bind_name returns the btrfs subvolume bind name, for instance @home
  • archinstall.Partition().partprobe() was introduced to call partprobe on the partition and only the partition. Also has a one second sleep on success to avoid subsequent calls to possibly have partial data for the same reasons as above.
  • archinstall.Partition().format() now unifies partition names like fat32 -> vfat and ntfs -> ntfs3. This addresses #834
  • archinstall.Partition().mount() now handles btrfs subvolumes seamlessly by setting subvol=X as mount options.
  • /var/log/archinstall/cmd_output.txt has been added to be able to grab cmd output after the fact.
  • archinstall.Installer() now sets storage['installation_session'] to itself upon every initation.
  • A internal sed call has changed from s/x/y/ to s%x%y% to avoid issues with subvolume paths containing /
  • The postgresql Application profile now uses run_as instead of runas (spelling error caused the profile to break)
  • The xorg profile now properly sets amdgpu before the radeon modules when generating a new initramfs.

v2.3.1-RC1

31 Dec 15:37
v2.3.1-rc1
Compare
Choose a tag to compare
v2.3.1-RC1 Pre-release
Pre-release

Breaking changes:

There should be no breaking changes in this patch release.

New features

  • Added a mkinitcpio -P at the end of Installer(), which should catch any late installation changes to kernel modules and binaries etc.
  • btrfs support has been improved, and more complex layouts should be supported. (See details in #787)
  • A separate /home partition will now be created only if drives are above 60GB, and / has been increased to 40GB to cope with desktop environments. A discussion has been started to remove /home or hide it behind a user-question, as it creates more issues than it's worth trying to set up a separate /home partition that fits everyone's needs and sizes.
  • Added a /var/log/archinstall/cmd_output.txt for complete command history output.

Bug fixes

  • Fixed one remaining issue tied to PARTUUID.
  • Fixed a bug that could cause sorting partitions to fail if they did not have a mountpoint
  • Fixed a bug where "what do you want to do with the selected drives?" would come up despite no hard drives being selected.
  • Fixed a bug where creating a user option would be skipped if a root password was set
  • Fixed amdgpu kernel parameters, made it so amdgpu is loaded before radeon (none were previous loaded)

v2.3.0

24 Nov 21:32
v2.3.0
c4ba14e
Compare
Choose a tag to compare

This new release of archinstall addresses the many issues raised by the community.
We would like to thank every single one who submitted issues, gave feedback and most importantly suggested or contributed to solutions to all these issues.

This is by no means a perfect release, a lot of work remains ahead. But we believe this is a step in the right direction with both accessibility improvements as well as stability and some security enhancements for the guided template that we ship. Below is a list of all the changes since the previous version, and we will begin with the breaking changes to highlight those.

Breaking changes

  • Filesystem()'s context manager (using with Filesystem()) no longer wipes the disk on entry, it no longer detects or handles differences in partition table vs expected partition table format (gpt vs mbr), instead those operations have moved to individual functions, see below in the Filesystem header as well as the Installer header, where mount logic has moved to.
  • Going from * imports to targeted imports. This should not cause issues, but if there's any API call not available do let us know.
  • BlockDevice().json() now only returns the string representation of path to the blockdevice ("/dev/sda" for instance)
  • BlockDevice().__dump__() has one additional dimension to the JSON dictionary, where it represent itself as "/dev/sda" : {"info": "value"} rather than a flat structure.
  • BlockDevice().device_or_backfile now return the backfile when the device is a loopdevice, BlockDevice().device still returns limited information of the type (raid, crypt and others).
  • Partition().size is now a read-only value and the parameter Partition(size=X) has hence been removed
  • Partition().allow_formatting has been removed/deprecated, this is handled via direct function calls instead of automatically wiping a partition.
  • Partition().safe_to_format() has been deprecated and removed since no automatic formatting or changes are done. Any destructive changes has to be explicitly called, and there for that is the safeguard instead.
  • Partition().format() no longer has the argument allow_formatting as it's implicitly set whenever the function is called. This means that "testing" which file systems are supported is no longer supported, but instead we have a curated list of supported file systems that can be used.
  • Partition().format() no longer uses the nomenclature vfat for the filesystem argument, instead fat32 is used. This to better reflect the mount call later where fat32 is specified and better reflects man parted's expectations.
  • archinstall.JSON serializer now correctly removes any key in a dictionary that starts with !, for instance "!password" : "moo" will get filtered out. To serialize a structure without loosing values, use archinstall.UNSAFE_JSON which is unsafe to use unless you know what you're doing.
  • The gfx_driver argument in profiles etc no longer has supported for Nvidia, and instead of using sub-menu's under the Nvidia category there is now two top level choices of either Nvidia (open-source) and Nvidia (proprietary). They both do the same as before, just on a top level of choices and as a single argument in JSON configurations/profiles.
  • The default installation mountpoint is no longer /mnt but instead /mnt/archinstall
  • Disk layout and configuration has moved from user_configuration.json into user_disk_layouts.json
    (It's still supported for as long as possible to define these in user_configuration.json for backwards compatibility reasons)
  • User credentials have moved from user_configuration.json into user_credentials.json
    (It's still supported for as long as possible to define these in user_configuration.json for backwards compatibility reasons)
  • Keywords in the JSON configuration has changed in the guided installer:
    • keyboard-language has been re-named to keyboard-layout
    • harddrive has been re-named to harddrives (and changed structure)
    • disk_layouts have been added and replaces harddrives partially
    • users have changed to !users
    • superusers have changed to !superusers

Highlighted new features

  • GRUB and Disk Encryption now properly works.
  • BTRFS subvolumes (very early beta feature, hence some limitations for initial tests. Supports only a nested structure and some issues are known with this approach)
  • Archinstall now detects if espeakup.service is active on the installation ISO and copies the setup over to the installed medium automatically.
  • Now supports multiple encrypted volumes (slightly limited, it's either on or off, but multiple partitions will be encrypted). All encrypted partitions are protected by the passphrase as usual and stored in key-slot 0, bu every partition that is not the root partition will also have a computer generated passphrase stored on the root device under /dev/cryptsetup-keys.d/ and that passphrase is stored in key-slot 1 on the partition. It's a unique passphrase per volume.
  • More reliable disk operations (partitioning, encryption and mounting)
  • A rudimentary plugin-support, allowing users to create their own plugins. There are four ways of activating the plugin support, either via --plugin=url|location, via en entry in --config as {"plugin": "url|location"} or via the API call archinstall.load_plugin() or finally via pip install yourplugin assuming that the plugin registers itself via Pythons builtin entry-point system as archinstall.plugin. These plugins are triggered/called at various points in the installation and more documentation on this specific will come and be continuously updated. One such step is archinstall.pacstrap() which calls on_pacstrap(package_list) in the plugin and the return value should be a curated list of packages, this enables for instance custom plugins to be written and deal with for instance AUR packages and deal with the custom operations needed and filter out those packages from the rest of the install process, leaving only official packages to be dealt with by the official installation process. (again, just an example).
  • swap has been added into the mix using zram and zram-generator.
  • Manual partitioning has been re-worked (but released partially unfinished, the reason being it was impossible to release this version where this specific change was removed - as it's so intertwined with everything else that's been re-worked)

Detailed changelog

Parameters

  • More static arguments have been added to the initialization making for a more traditional argument parsing of known arguments.
  • --creds is a new argument that take the previous "users", "superusers" and "root-password" keys & values, this allows for separation of JSON machine configuration and user credentials which might want to be stored separately for security reasons.
  • --disk_layouts is a new argument that takes the previous structure of "harddrive" which later was renamed "harddrives". The old JSON structure of "harddrives" still remains in the --config input as an indicator of which harddrives to use and find from --disk_layouts.
  • --dry-run has been added, which will abort before any changes are made on hardware. This allows for generating a configuration file which can then be passed to either of --config, --creds and --disk_layouts.
  • --mount-point has been added to enable choosing where the installed system gets mounted during installation/configuration.
  • --plugin has been added for loading external archinstall plugins via parameter.

Library changes

  • archinstall/lib/disk.py has been split up into archinstall/lib/disk/*.py since it grew out of hand. The exposure of API calls should remain the same as they're exposed via __init__.py, but for contributors this change is worth noting when finding functions and files.
  • Going from * imports to targeted imports. This should not cause issues, but if there's any API call not available do let us know.

General changes

  • A dummy epoll() has been added in order to be able to run certain tests on Windows, for instance "reach mirror"-tests etc without causing import issues.
  • archinstall.generate_password(length) has been added to generate a rudimentary password for disk encryption and other things. This using the secrets library and string.printable as a haystack.
  • archinstall.json_dumps(*args, **kwargs) performs a safe json.dumps() call using the archinstall.JSON serializer
  • archinstall.UNSAFE_JSON() has been added to serialize JSON structures without consideration of private information.
  • archinstall.SysCommandWorker() now outputs the stdout as-is, without any attempt to make it pretty.
  • archinstall.SysCommandWorker() (and in extension, even SysCommand()) now logs all commands executed under /var/log/archinstall/cmd_history.txt for easier debugging and learning which commands we executed. Currently we don't filter anything, so there will be a lot of spam from parted() calls and lsblk multiple times "for no reason".
  • archinstall.SysCommand() has support for retrieving slices using SysCommand("ls")[:10] for instance, where the output generated by the internal SysCommandWorker() call will be simplified into retrieving the final output and only the first 10 bytes in this example.
  • archinstall.cpuinfo() has been created to return CPU information from /proc/cpuinfo i...
Read more

v2.3.0.RC2

18 Nov 21:48
v2.3.0.RC2
5ec690d
Compare
Choose a tag to compare
v2.3.0.RC2 Pre-release
Pre-release

Highlighted features:

  • BTRFS subvolumes (limited functionality on this first release, still in beta and very niche usecases)
  • Re-worked partitioning
  • systemd-timesyncd instead of ntpd

A more detailed inventory of changes will be put up on the release day, the list is a bit long

Known issues:

  • Encryption with GRUB still broken (Fixed in this RC2 release)
  • Occasional .format() glitch during partitioning, see #689 (Fixed in this RC2 release)
  • Multi-disk layouts are incomplete, please submit feedback here or on discord even if we know this is an issue

General discussions are welcome in #692

v2.3.0.RC1

07 Nov 12:03
v2.3.0.RC1
565464c
Compare
Choose a tag to compare
v2.3.0.RC1 Pre-release
Pre-release

Highlighted features:

  • BTRFS subvolumes (limited functionality on this first release)
  • Re-worked partitioning
  • systemd-timesyncd instead of ntpd

Known issues:

  • Encryption with GRUB still broken
  • Occasional .format() glitch during partitioning, see #689 (please submit logs in that issue if this happens)
  • Multi-disk layouts are incomplete with BTRFS, please submit feedback here or on discord even if we know this is an issue

v2.2.0

28 May 06:56
v2.2.0
595bd65
Compare
Choose a tag to compare

Known Issues:

  • Partitioning still has issues with certain layouts. Workaround: Manually creating partitions and selecting "use /mnt as is" or "Re-use partitions" (after a valid file system was created on the manually created partitions) will solve most issues. Wiping the desired drive before running archinstall is also a workaround for now but remember to backup your data! Work is already underway to correct this, but will not make it in time for this release, follow the progress here: #426
  • Dual-Boot with Windows works, but there's an issue with Windows creating a very small /boot partition which causes issues, please track the progress here: #527
  • #536: The output from pacman (via pacstrap also) looks broken/corrupt/garbage - This is a cosmetic issue only, and installs work fine. Will be fixed!

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.
  • Moved the IRC channel from FreeNode to LiberaChat
  • 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) Just like installation moved, so has gfx_driver_packages which is now archinstall.storage["gfx_driver_packages"]
  • (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 rais...
Read more

v2.2.0.RC1

23 May 10:50
v2.2.0.RC1
84ee318
Compare
Choose a tag to compare
v2.2.0.RC1 Pre-release
Pre-release

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 ...
Read more

v2.1.4

25 Apr 20:22
v2.1.4
ea9d34e
Compare
Choose a tag to compare

Patch release v2.1.4

Known issues:

  • Installing to a USB device is still a bit iffy at times and some partition layouts might still confuse the installer and these will be fixed in v2.2.0 due to it requiring some re-work of the partition logic - which is to big of a change for this version.
  • MBR and GRUB support will be coming in v2.2.0 (next release)

For more issues, see the issues tab. And thank you for your patience and constructive feedback, it's very much appreciated!

Experimental features:

  • "Use /mnt as is" #124 has been added as a new option in the formatting process. This function is tested, but internet is filled with people who use exotic partitioning layouts and such. So this feature is bound to break at some points. Feedback is very welcome especially around this new feature. lsblk output has been added to the logs, so submitting that log should be sufficient for us to replicate certain layouts and file formats.

This release contains the following:

  • (breaking change) Installer() has been re-worked quite a bit to accomodate #124. This meant that partition and boot_partition are no longer used, instead, a single installation directory is given which adds more degrees of freedom for the installer - as it no longer "cares" what partitions are being used. As long as it can run pacstrap in said directory, the installer will try to figure out what packages to source additionally to deal with the file system's in play. It also no longer sets a hostname by default, instead .set_hostname() should be called on the installation. (see the minimal example for information on how the new workflow should look like).
  • argon2id is being used by default instead of argon2i after some discussions here on GitHub, with a future plan of making this configurable through --PBKDF=<implementation name>.
  • #124 has been implemented and allows for more complex partition layouts. See note above surrounding this feature.
  • Added more verification to time zone selection
  • Added a warning for one experimental feature
  • The install log now contains lsblk output to better help diagnose potential partitioning issues.
  • Added information regarding unattended installations in the readme
  • IP addresses are now verified when entering them
  • Time zone input will now loop instead of default to UTC when a invalid time zone is given (leaving blank will however default to UTC still as mentioned below)
  • generic_select have been improved quite a bit. It now supports allow_empty_input=False which will loop over the choices until a valid is given as well as a sort=True which sorts the listing. Lastly options_output=False have been added to hide any output of the list, enabling the programmer to print their own list prior to selecting the options (options still has to be given to generic_select, but these can be different from the output printed, enabling for more programatically understandable options returned from generic_select while allowing for presenting user friendly options)
  • "Keep partitions" now forces the user to select at least / and /boot
  • A .editorconfig to help contributors use and follow some guidelines when contributing
  • Added a mission statement to the project
  • Simplified and consolidated the build process.
  • minimal.py and the script your own installation examples have been updated properly.
  • The test instructions and build ISO instructions have been added and modified.
  • The entry-point for the module have moved in to init.py
  • Partial support for hardware raids have been added (still very much an experimental feature)
  • Partition() now has a .uuid property for easy access to the PARTUUID of lsblk
  • BlockDevice() now has a .uuid property for easy access to the UUID of lsblk for the device.
  • Partition().real_device now always returns the parent device, not only when it's encrypted. This means that /dev/mapper/luksloop will return /dev/sda2 for instance, and /dev/sda2 will return /dev/sda. For a more consistent behavior.
  • Relaxed the Partition().safe_to_format() a bit to allow for formatting "odd" boot partitions that doesn't make sense.
  • Partition().mount() will now create the destination by default.
  • archinstall has a new function called .get_partitions_in_use(mountpoint) which can look up a folder/mountpoint and analyze which block devices are mounted there (recursively). This helps the Installer() to understand which partitions is mounted and what packages to source.
  • archinstall.sys_command() now take environment_vars as a new argument, which can be used to pipe in specific environment variables. It also properly disposes of any open filehandles once done executing.
  • Some general code clean up such as this
  • Installer() no longer installs nano by default as a base package. That is now an optional package in profiles instead.
  • Installer().partitions have been added to facilitate easy access to the current partitions in play during this installation.
  • Installer().enable_service() now takes an arbitrary number of services instead of just one
  • Installer().drop_to_shell() has been added to the API for easy access into the new installation.
  • Installer().detect_encryption() has been added to the API to crudely but conveniently detect if there's encryption in play at the given pacstrap location.
  • Installer().minimal_installation() now patches mkinitcpio instead of blindly writing a string. This is prep-work for the future, where there will be API hooks such as on_mkinitcpio that will pipe these variables to external functions for patching.
  • archinstall.list_keyboard_languages() should no longer be limited to QWERTY layouts. This should enable layouts like be-latin1 to be discoverable which was mentioned in #149.
  • Some NVMe sleeps have been added to combat the issues during formatting/encryption/unlocking where commands release us before the kernel is done updating.
  • list_mirrors() now support offline mode is detected. This is useful when building your own ISO's that is targeted at offline environments. An example usage of this is archoffline that utilize this as a test.
  • profiles/ now has the ability to masquerade as [top_level_profile](v2.1.3...v2.1.4-RC...
Read more

v2.1.4-RC2

22 Apr 20:29
v2.1.4-RC2
b963ed2
Compare
Choose a tag to compare
v2.1.4-RC2 Pre-release
Pre-release

Patch release v2.1.4 (Release Candidate)

Attached below is an unofficial Arch Linux ISO that ships this specific release candidate.
Since this is an unsupported ISO, please help the support out by not asking questions about it anywhere but here or in the archinstall channels.

Known issues: Installing to a USB device is still a bit iffy at times.

Experimental features:

  • "Use /mnt as is" #124 has been added as a new option in the formatting process. This function is tested, but internet is filled with people who use exotic partitioning layouts and such. So this feature is bound to break at some points. Feedback is very welcome especially around this new feature. lsblk output has been added to the logs, so submitting that log should be sufficient for us to replicate certain layouts and file formats.

This release contains the following:

  • (breaking change) Installer() has been re-worked quite a bit to accomodate #124. This meant that partition and boot_partition are no longer used, instead, a single installation directory is given which adds more degrees of freedom for the installer - as it no longer "cares" what partitions are being used. As long as it can run pacstrap in said directory, the installer will try to figure out what packages to source additionally to deal with the file system's in play. It also no longer sets a hostname by default, instead .set_hostname() should be called on the installation. (see the minimal example for information on how the new workflow should look like).
  • argon2id is being used by default instead of argon2i after some discussions here on GitHub, with a future plan of making this configurable through --PBKDF=<implementation name>.
  • #124 has been implemented and allows for more complex partition layouts. See note above surrounding this feature.
  • The install log now contains lsblk output to better help diagnose potential partitioning issues.
  • Added information regarding unattended installations in the readme
  • IP addresses are now verified when entering them
  • Time zone input will now loop instead of default to UTC when a invalid time zone is given (leaving blank will however default to UTC still as mentioned below)
  • generic_select have been improved quite a bit. It now supports allow_empty_input=False which will loop over the choices until a valid is given as well as a sort=True which sorts the listing. Lastly options_output=False have been added to hide any output of the list, enabling the programmer to print their own list prior to selecting the options (options still has to be given to generic_select, but these can be different from the output printed, enabling for more programatically understandable options returned from generic_select while allowing for presenting user friendly options)
  • "Keep partitions" now forces the user to select at least / and /boot
  • A .editorconfig to help contributors use and follow some guidelines when contributing
  • Added a mission statement to the project
  • Simplified and consolidated the build process.
  • minimal.py and the script your own installation examples have been updated properly.
  • The test instructions and build ISO instructions have been added and modified.
  • The entry-point for the module have moved in to init.py
  • Partial support for hardware raids have been added (still very much an experimental feature)
  • Partition() now has a .uuid property for easy access to the PARTUUID of lsblk
  • BlockDevice() now has a .uuid property for easy access to the UUID of lsblk for the device.
  • Partition().real_device now always returns the parent device, not only when it's encrypted. This means that /dev/mapper/luksloop will return /dev/sda2 for instance, and /dev/sda2 will return /dev/sda. For a more consistent behavior.
  • Relaxed the Partition().safe_to_format() a bit to allow for formatting "odd" boot partitions that doesn't make sense.
  • Partition().mount() will now create the destination by default.
  • archinstall has a new function called .get_partitions_in_use(mountpoint) which can look up a folder/mountpoint and analyze which block devices are mounted there (recursively). This helps the Installer() to understand which partitions is mounted and what packages to source.
  • archinstall.sys_command() now take environment_vars as a new argument, which can be used to pipe in specific environment variables. It also properly disposes of any open filehandles once done executing.
  • Some general code clean up such as this
  • Installer() no longer installs nano by default as a base package. That is now an optional package in profiles instead.
  • Installer().partitions have been added to facilitate easy access to the current partitions in play during this installation.
  • Installer().enable_service() now takes an arbitrary number of services instead of just one
  • Installer().drop_to_shell() has been added to the API for easy access into the new installation.
  • Installer().detect_encryption() has been added to the API to crudely but conveniently detect if there's encryption in play at the given pacstrap location.
  • Installer().minimal_installation() now patches mkinitcpio instead of blindly writing a string. This is prep-work for the future, where there will be API hooks such as on_mkinitcpio that will pipe these variables to external functions for patching.
  • archinstall.list_keyboard_languages() should no longer be limited to QWERTY layouts. This should enable layouts like be-latin1 to be discoverable which was mentioned in #149.
  • Some NVMe sleeps have been added to combat the issues during formatting/encryption/unlocking where commands release us before the kernel is done updating.
  • list_mirrors() now support offline mode is detected. This is useful when building your own ISO's that is targeted at offline environments. An example usage of this is archoffline that utilize this as a test.
  • profiles/ now has the ability to masquerade as top_level_profile enabling it to show up in profile listing. And subsequently hide themselves from the top level menu in guided. This helps a ...
Read more