Releases: archlinux/archinstall
v2.3.2
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
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 toMIN_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 doarchinstall --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 to40 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 witharchinstall.Installer().pacstrap()
in the variablearchinstall.Installer().installed_packages
.archinstall.Installer().add_user()
now calls a new plugin hook calledplugin.on_user_created(self, user)
. This is used by the Application profilepipewire
to enable user servicespipewire-pulse.service
andpipewire-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 callsself.mkinitcpio('-P')
upon exit, so that any changes done during installation by packages, profiles or plugins now get generated as a last step, right aftergenfstab
.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 aftershutdown
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
forblkid
asblkid
behaves more as we expect in junction with partprobe. It seamslsblk
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 toblkid
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 & #838archinstall.Filesystem().partuuid_to_index()
now has an incremental time delay for each time it does not find the requestedPARTUUID
. And it also usesblkid
for the actualPARTUUID
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, butadd_partition()
did not have an exception handling either so. That is addressed now. This should also fix #885archinstall.get_mount_info()
will now properly set aBlockDevice()
for eachPartition()
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 inFilesystem()
) got a five second sleep put to it to avoid issues wherepartprobe()
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 becauselsblk
can't reliably return the data and returns a high exit code instead.archinstall.Partition().uuid
now usesself._safe_uuid
instead which usesblkid
for the same reasons as above. Also has an incremental timeout for each retry if it cannot return thePARTUUID
.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 likefat32 -> vfat
andntfs -> ntfs3
. This addresses #834archinstall.Partition().mount()
now handles btrfs subvolumes seamlessly by settingsubvol=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 setsstorage['installation_session']
to itself upon every initation.- A internal
sed
call has changed froms/x/y/
tos%x%y%
to avoid issues with subvolume paths containing/
- The
postgresql
Application profile now usesrun_as
instead ofrunas
(spelling error caused the profile to break) - The
xorg
profile now properly setsamdgpu
before theradeon
modules when generating a new initramfs.
v2.3.1-RC1
Breaking changes:
There should be no breaking changes in this patch release.
New features
- Added a
mkinitcpio -P
at the end ofInstaller()
, 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 to40GB
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 soamdgpu
is loaded beforeradeon
(none were previous loaded)
v2.3.0
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 (usingwith 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 theFilesystem
header as well as theInstaller
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 parameterPartition(size=X)
has hence been removedPartition().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 argumentallow_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 nomenclaturevfat
for thefilesystem
argument, insteadfat32
is used. This to better reflect themount
call later wherefat32
is specified and better reflectsman 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, usearchinstall.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 forNvidia
, and instead of using sub-menu's under theNvidia
category there is now two top level choices of eitherNvidia (open-source)
andNvidia (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
intouser_disk_layouts.json
(It's still supported for as long as possible to define these inuser_configuration.json
for backwards compatibility reasons) - User credentials have moved from
user_configuration.json
intouser_credentials.json
(It's still supported for as long as possible to define these inuser_configuration.json
for backwards compatibility reasons) - Keywords in the JSON configuration has changed in the guided installer:
keyboard-language
has been re-named tokeyboard-layout
harddrive
has been re-named toharddrives
(and changed structure)disk_layouts
have been added and replacesharddrives
partiallyusers
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 callarchinstall.load_plugin()
or finally viapip install yourplugin
assuming that the plugin registers itself via Pythons builtin entry-point system asarchinstall.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 isarchinstall.pacstrap()
which callson_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 intoarchinstall/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 thesecrets
library andstring.printable
as a haystack.archinstall.json_dumps(*args, **kwargs)
performs a safejson.dumps()
call using thearchinstall.JSON
serializerarchinstall.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, evenSysCommand()
) 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 fromparted()
calls andlsblk
multiple times "for no reason".archinstall.SysCommand()
has support for retrieving slices usingSysCommand("ls")[:10]
for instance, where the output generated by the internalSysCommandWorker()
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...
v2.3.0.RC2
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
Highlighted features:
- BTRFS subvolumes (limited functionality on this first release)
- Re-worked partitioning
systemd-timesyncd
instead ofntpd
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
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
(viapacstrap
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 kernelsarchinstall.Installer()
now supports modifying kernel parameters and othermkinitcpio
related stuffarchinstall.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 toarchinstall.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 toInstaller().MODULES
or.HOOKS
have been made.archinstall.Installer().minimal_installation()
now intalls Intel and AMDucode
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
andlocalectl 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 tolocalectl
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 toman 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
- Currently only
--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
anddmenu
- (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 theprofiles/<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 wheneverarchinstall.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 hasgfx_driver_packages
which is nowarchinstall.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, normallogging.<level>
can be used. Next version will remove these old level definitions permanently. archinstall.Partition().mount()
now supports passing down mount options when called viaoptions=<string with mount flags>
archinstall.Filesystem(mode=<archinstall.GPT|archinstall.MBR>)
now supportsMBR
, allowing for older hardware to be used. This is still some what experimental, andarchinstall.Filesystem().use_entire_disk()
will honorGPT
if UEFI is detected but fall back onMBR
if EFI vars isn't present. Use manual formatting if you want to override and useMBR
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...
v2.2.0.RC1
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 kernelsarchinstall.Installer()
now supports modifying kernel parameters and othermkinitcpio
related stuffarchinstall.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 toarchinstall.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 toInstaller().MODULES
or.HOOKS
have been made.archinstall.Installer().minimal_installation()
now intalls Intel and AMDucode
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
andlocalectl 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 tolocalectl
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 toman 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
- Currently only
--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
anddmenu
- (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 theprofiles/<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 wheneverarchinstall.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, normallogging.<level>
can be used. Next version will remove these old level definitions permanently. archinstall.Partition().mount()
now supports passing down mount options when called viaoptions=<string with mount flags>
archinstall.Filesystem(mode=<archinstall.GPT|archinstall.MBR>)
now supportsMBR
, allowing for older hardware to be used. This is still some what experimental, andarchinstall.Filesystem().use_entire_disk()
will honorGPT
if UEFI is detected but fall back onMBR
if EFI vars isn't present. Use manual formatting if you want to override and useMBR
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 aRequirementError
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 calledSysCommandWorker()
- 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 justcmd
.callback
and.start_callback
has been merged into.callbacks
which now is a dictionary with two keys currently:on_start
andon_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 ...
v2.1.4
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
andboot_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 runpacstrap
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 ofargon2i
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 supportsallow_empty_input=False
which will loop over the choices until a valid is given as well as asort=True
which sorts the listing. Lastlyoptions_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 togeneric_select
, but these can be different from the output printed, enabling for more programatically understandable options returned fromgeneric_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 oflsblk
BlockDevice()
now has a .uuid property for easy access to the UUID oflsblk
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 theInstaller()
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 oneInstaller()
.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 ason_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 likebe-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...
v2.1.4-RC2
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
andboot_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 runpacstrap
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 ofargon2i
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 supportsallow_empty_input=False
which will loop over the choices until a valid is given as well as asort=True
which sorts the listing. Lastlyoptions_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 togeneric_select
, but these can be different from the output printed, enabling for more programatically understandable options returned fromgeneric_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 oflsblk
BlockDevice()
now has a .uuid property for easy access to the UUID oflsblk
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 theInstaller()
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 oneInstaller()
.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 ason_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 likebe-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 ...