Streamline the installer for fresh Arch installs

This commit is contained in:
SirBlob committed 2026-09-24 12:00:22 -04:00
1 parent 501d066e64
commit d59725f193
14 files changed
+234 -44

No files matched your search

+22 -6
View File
@@ -8,8 +8,10 @@ with `--check`.
| Path | Role |
| --- | --- |
| `bootstrap.sh` | one-command install on a bare machine: installs git, clones, runs `install.sh` |
| `install.sh` | flags and the order the steps run in |
| `install/helpers/lib.sh` | reporting, file copies, unit queries |
| `install/helpers/lib.sh` | reporting, sections, the warning summary, file copies, unit queries |
| `install/steps/preflight.sh` | the checks that stop a run early, and the sudo keepalive |
| `install/helpers/as-root.sh` | `as_root`, a no-op when already root |
| `install/steps/directories.sh` | the directories the shell and scripts expect |
| `install/steps/packages.sh` | repo and AUR packages, and the yay bootstrap |
@@ -23,6 +25,16 @@ with `--check`.
## Steps
0. **Preflight** stops before anything is written when the installer is run as
root (it installs into `$HOME`, and `makepkg` refuses to build as root), when
`pacman` is missing, when `sudo` does not accept the user, or when
`archlinux.org` cannot be reached and packages are wanted. It warns when
`systemd-networkd`, `iwd`, `dhcpcd` or `netctl` is enabled, because
NetworkManager is enabled below and two network managers fight over the same
interface after a reboot. `archinstall`'s "copy ISO network config" option
leaves exactly that behind. Once sudo is accepted it is refreshed every
minute in the background, so a long AUR build does not stop halfway for a
password.
1. **Directories** are created first, because nothing below can write into a
directory that is not there: `~/.config/blob`, `~/.config/systemd/user/app.slice.d`,
`~/.local/state/blob`, `~/.local/share` and `~/.cache/blob`. A fresh Arch
@@ -32,9 +44,10 @@ with `--check`.
create the parent of a link, so this step makes `~/.local/share` itself rather
than assuming step 1 ran.
3. **Packages** come from `packages/blob.packages` and
`packages/blob-aur.packages`. A machine with no AUR helper gets `yay-bin`
built once with `makepkg`. A failed batch refreshes the databases and retries,
then falls back to one package at a time, so a single name that no longer
`packages/blob-aur.packages`. Repo packages go in with a full
`pacman -Syu`, never a partial upgrade. A machine with no AUR helper gets
`yay-bin` built once with `makepkg`. A failed batch upgrades the system on
its own, then falls back to one package at a time, so a single name that no longer
resolves cannot cost you the other hundred and the config, service and login
steps below. See [packages.md](packages.md).
4. **Config** is copied into `~/.config`: `hypr/`, the themed app configs,
@@ -152,8 +165,11 @@ with `--check`.
11. **Launch.** `sddm`, `hyprland`, `quickshell` and `uwsm` are checked one last
time and any that are missing are named, because that is the whole difference
between a desktop and a console. Then, when the installer was run from a
console and nothing graphical is running, it starts `sddm.service` so the
desktop appears without a reboot. `--no-launch` prints the command instead.
console and nothing graphical is running, it offers a reboot, which brings
up NetworkManager, the boot splash and any new kernel modules together.
Declining starts `sddm.service` so the desktop appears without one.
`--no-launch` prints the command instead. Every warning from the run is
listed again just before this step.
`--autologin` writes `/etc/sddm.conf.d/zzz-blob-autologin.conf` for the
current user.
+6 -4
View File
@@ -84,10 +84,12 @@ packages pulled in under a different name no longer come back on every run. AUR
packages are built one at a time, so a build that fails is reported at the end
instead of stopping the install.
Repo packages go in one `pacman` call. If that call fails the databases are
refreshed with `pacman -Sy` and it is tried again, because a stale database is
what turns an installed-and-present package into `target not found`. If it still
fails the packages are installed one at a time, so one unresolvable name does not
Repo packages go in one `pacman -Syu --needed` call, so the databases are
fresh and the system is upgraded in the same transaction. Refreshing the
databases without upgrading (`-Sy` then `-S`) is a partial upgrade, which Arch
does not support and which breaks libraries on a fresh install whose ISO is a
few weeks old. If that call fails the system is upgraded on its own and the
packages are installed one at a time, so one unresolvable name does not
block the other hundred - which is how a missing `sddm` used to turn into a
machine with no login screen. `install.sh` ends by naming any of `sddm`,
`hyprland`, `quickshell` and `uwsm` that are still not installed.