Files
omarchy-iso/configs/airootfs/root/.automated_script.sh
T
Ryan Hughes ca2b58fa4d Install omarchy-installer + omarchy-settings into the live ISO
Two motivations:

1. Plymouth: the omarchy plymouth theme + /etc/plymouth/plymouthd.conf
   ship from omarchy-settings (theme at /usr/share/plymouth/themes/omarchy,
   plymouthd.conf via the package's post_install etc-overrides hook).
   Without omarchy-settings on the live ISO, mkarchiso builds the initrd
   with plymouth pointing at the default theme instead of Omarchy's. Now
   it picks up the Omarchy theme on boot like the installed system does.

2. Drops the .pkg.tar.zst extraction hack in .automated_script.sh:
   OMARCHY_PATH=/usr/share/omarchy is the real package install path, so
   use_omarchy_helpers no longer needs to bsdtar pieces out of the
   offline mirror into /tmp/omarchy-iso.
2026-05-21 00:13:05 -04:00

206 lines
6.9 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
use_omarchy_helpers() {
# omarchy-installer + omarchy-settings are installed into the live ISO (see
# build-iso.sh arch_packages), so /usr/share/omarchy is the real tree.
export OMARCHY_MIRROR="$(cat /root/omarchy_mirror)"
export OMARCHY_PATH=/usr/share/omarchy
export OMARCHY_INSTALL=$OMARCHY_PATH/install
export OMARCHY_INSTALL_LOG_FILE=/var/log/omarchy-install.log
source "$OMARCHY_INSTALL/helpers/all.sh"
}
run_configurator() {
set_tokyo_night_colors
./configurator
export OMARCHY_USER="$(jq -r '.users[0].username' user_credentials.json)"
}
install_arch() {
clear_logo
gum style --foreground 3 --padding "1 0 0 $PADDING_LEFT" "Installing..."
echo
touch /var/log/omarchy-install.log
start_log_output
CURRENT_SCRIPT="install_base_system"
install_base_system > >(sed -u 's/\x1b\[[0-9;]*[a-zA-Z]//g' >>/var/log/omarchy-install.log) 2>&1
unset CURRENT_SCRIPT
stop_log_output
}
install_omarchy() {
# archinstall pacstrap'd omarchy + omarchy-installer (which pulls
# omarchy-settings + omarchy-limine) and created the user. The user's
# home is missing /etc/skel content though, because archinstall creates
# the user BEFORE installing the additional packages list (we saw user
# creation at "Creating user $OMARCHY_USER" then omarchy-settings
# installing /etc/skel/.config/... much later). Seed it now.
arch-chroot /mnt bash -c "
cp -rT /etc/skel /home/$OMARCHY_USER/
chown -R $OMARCHY_USER:$OMARCHY_USER /home/$OMARCHY_USER/
"
# Install the rest of the default Omarchy install set (everything in
# omarchy-base.packages that isn't already a hard dep of omarchy).
arch-chroot /mnt bash -c '
mapfile -t pkgs < <(grep -v "^#\|^$" /usr/share/omarchy/install/omarchy-base.packages)
pacman -S --noconfirm --needed "${pkgs[@]}"
'
# Run the installer's offline path. omarchy-install execs /usr/share/omarchy/
# install.sh; OMARCHY_INSTALL_MODE=offline tells it the chroot install rules.
chroot_run_as_user "OMARCHY_INSTALL_MODE=offline omarchy-install"
configure_login_for_unencrypted_install
if [[ -f /mnt/var/tmp/omarchy-install-completed ]]; then
reboot
fi
}
# Tokyo Night palette so the live VT matches the installed look.
set_tokyo_night_colors() {
if [[ $(tty) == /dev/tty* ]]; then
echo -en "\e]P01a1b26"; echo -en "\e]P1f7768e"; echo -en "\e]P29ece6a"
echo -en "\e]P3e0af68"; echo -en "\e]P47aa2f7"; echo -en "\e]P5bb9af7"
echo -en "\e]P67dcfff"; echo -en "\e]P7a9b1d6"; echo -en "\e]P8414868"
echo -en "\e]P9f7768e"; echo -en "\e]PA9ece6a"; echo -en "\e]PBe0af68"
echo -en "\e]PC7aa2f7"; echo -en "\e]PDbb9af7"; echo -en "\e]PE7dcfff"
echo -en "\e]PFc0caf5"
echo -en "\033[0m"
clear
fi
}
install_disk() {
jq -er 'first(.disk_config.device_modifications[]? | select(.wipe == true) | .device)' user_configuration.json
}
cleanup_install_disk() {
local disk="$1"
[[ -n $disk && -b $disk ]] || { echo "Could not determine install disk for cleanup" >&2; return 1; }
echo "Cleaning up existing holders on install disk: $disk"
findmnt -R /mnt >/dev/null && umount -R /mnt || true
while read -r dev; do
[[ -b $dev ]] || continue
swapoff "$dev" 2>/dev/null || true
while read -r target; do
[[ -n $target ]] && umount "$target" 2>/dev/null || true
done < <(findmnt -rn -S "$dev" -o TARGET 2>/dev/null || true)
done < <(lsblk -rnpo PATH "$disk")
while read -r dev type; do
[[ $type == disk || $type == part || $type == crypt ]] || continue
while read -r vg; do
[[ -n $vg ]] && vgchange -an "$vg" 2>/dev/null || true
done < <(pvs --noheadings -o vg_name "$dev" 2>/dev/null | awk '{$1=$1; print}' | sort -u)
done < <(lsblk -rnpo PATH,TYPE "$disk")
while read -r dev type; do
[[ $type == crypt ]] && cryptsetup close "$dev" 2>/dev/null || true
done < <(lsblk -rnpo PATH,TYPE "$disk")
blockdev --flushbufs "$disk" 2>/dev/null || true
partprobe "$disk" 2>/dev/null || true
udevadm settle || true
}
install_base_system() {
pacman-key --init
pacman-key --populate archlinux
pacman-key --populate omarchy
pacman -Sy --noconfirm
cleanup_install_disk "$(install_disk)"
# archinstall 4.2 / Python 3.14 workarounds (matches upstream-main install
# behavior; carry forward until upstream lands the fixes).
sed -i \
-e 's|logfile_target = self\.target / absolute_logfile$|logfile_target = self.target / absolute_logfile.relative_to("/")|' \
-e 's|(limine_path / file)\.copy(efi_dir_path)|(limine_path / file).copy(efi_dir_path / file)|' \
-e "s|(limine_path / 'limine-bios.sys')\.copy(boot_limine_path)|(limine_path / 'limine-bios.sys').copy(boot_limine_path / 'limine-bios.sys')|" \
/usr/lib/python3.14/site-packages/archinstall/lib/installer.py
archinstall \
--config user_configuration.json \
--creds user_credentials.json \
--silent \
--skip-ntp \
--skip-wkd \
--skip-wifi-check
# Use the offline pacman.conf for the target so it pulls from the bundled
# mirror, not from the network.
cp /etc/pacman.conf /mnt/etc/pacman.conf
# Bind-mount the offline mirror + the /opt/packages tarballs into the target
# so chroot pacman / installer scripts can see them.
mkdir -p /mnt/var/cache/omarchy/mirror/offline /mnt/opt/packages
mount --bind /var/cache/omarchy/mirror/offline /mnt/var/cache/omarchy/mirror/offline
mount --bind /opt/packages /mnt/opt/packages
# Temporary passwordless sudo for the install user (cleaned up by
# omarchy's first-run flow).
mkdir -p /mnt/etc/sudoers.d
cat >/mnt/etc/sudoers.d/99-omarchy-installer <<EOF
root ALL=(ALL:ALL) NOPASSWD: ALL
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
$OMARCHY_USER ALL=(ALL:ALL) NOPASSWD: ALL
EOF
chmod 440 /mnt/etc/sudoers.d/99-omarchy-installer
}
configure_login_for_unencrypted_install() {
if [[ $(<user_encrypt_installation.txt) != "false" ]]; then
return
fi
mkdir -p /mnt/etc/sddm.conf.d
rm -f /mnt/etc/sddm.conf.d/autologin.conf
cat >/mnt/etc/sddm.conf.d/99-omarchy-login.conf <<EOF
[Theme]
Current=omarchy
[Users]
RememberLastUser=true
RememberLastSession=true
EOF
mkdir -p /mnt/var/lib/sddm
cat >/mnt/var/lib/sddm/state.conf <<EOF
[Last]
Session=omarchy.desktop
User=$OMARCHY_USER
EOF
rm -f /mnt/etc/systemd/system/getty@tty1.service.d/autologin.conf
arch-chroot /mnt chown sddm:sddm /var/lib/sddm /var/lib/sddm/state.conf >/dev/null 2>&1 || true
arch-chroot /mnt systemctl enable sddm.service >/dev/null 2>&1 || true
}
# Run a bash command inside the chroot as the install user, with the env the
# offline installer expects.
chroot_run_as_user() {
HOME=/home/$OMARCHY_USER \
arch-chroot -u "$OMARCHY_USER" /mnt/ \
env OMARCHY_INSTALL_MODE=offline \
OMARCHY_USER_NAME="$(<user_full_name.txt)" \
OMARCHY_USER_EMAIL="$(<user_email_address.txt)" \
OMARCHY_MIRROR="$OMARCHY_MIRROR" \
USER="$OMARCHY_USER" \
HOME="/home/$OMARCHY_USER" \
/bin/bash -lc "$1"
}
if [[ $(tty) == /dev/tty1 ]]; then
use_omarchy_helpers
run_configurator
install_arch
install_omarchy
fi