Files
void-installer/installer/install.sh

119 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# Void Linux unattended-friendly installer for the XPS 17 (xps9700).
# Runs inside the Void live ISO. Reads /etc/installer-secrets.env for passwords
# and /usr/local/share/installer/install.conf for everything else.
set -Eeuo pipefail
# Resolve the real script path so this works whether invoked directly or via
# the /usr/local/sbin/install-void symlink.
INSTALLER_DIR="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
SHARE_DIR="${INSTALLER_SHARE_DIR:-/usr/local/share/installer}"
# shellcheck source=lib/common.sh
source "$INSTALLER_DIR/lib/common.sh"
# ---------- load config ----------
CONFIG_FILE="${CONFIG_FILE:-$SHARE_DIR/install.conf}"
[[ -r "$CONFIG_FILE" ]] || die "config file $CONFIG_FILE missing"
# shellcheck disable=SC1090
source "$CONFIG_FILE"
log "loaded config from $CONFIG_FILE"
# Drop-in overrides (used by the QEMU test harness).
if [[ -d "${CONFIG_FILE}.d" ]]; then
for f in "${CONFIG_FILE}.d"/*.conf; do
[[ -r "$f" ]] || continue
# shellcheck disable=SC1090
source "$f"
log "loaded override $f"
done
fi
PKG_LIST_FILE="${PKG_LIST_FILE:-$SHARE_DIR/packages.list}"
export PKG_LIST_FILE
[[ -r "$PKG_LIST_FILE" ]] || die "packages.list $PKG_LIST_FILE missing"
# ---------- profile ----------
PROJECT_DIR="${PROJECT_DIR:-$SHARE_DIR}"
PROFILES_DIR="${PROFILES_DIR:-$SHARE_DIR/profiles}"
export PROJECT_DIR PROFILES_DIR
# shellcheck source=lib/profiles.sh
source "$INSTALLER_DIR/lib/profiles.sh"
load_profile || die "could not load profile '${PROFILE:-stable-cinnamon}'"
# Profile may override the package list.
[[ -r "$PROFILE_PACKAGES_FILE" ]] && PKG_LIST_FILE="$PROFILE_PACKAGES_FILE"
log "using packages list: $PKG_LIST_FILE"
load_secrets
# ---------- pre-flight ----------
require_root
# Default DEFAULT_ROOT_PART/EFI from config; will be confirmed/overridden by TUI.
ROOT_PART="${ROOT_PART:-$DEFAULT_ROOT_PART}"
EFI_PART="${EFI_PART:-$DEFAULT_EFI_PART}"
TARGET="${TARGET:-/mnt}"
export TARGET
# ---------- modules ----------
# shellcheck source=lib/tui.sh
source "$INSTALLER_DIR/lib/tui.sh"
# shellcheck source=lib/partition.sh
source "$INSTALLER_DIR/lib/partition.sh"
# shellcheck source=lib/bootstrap.sh
source "$INSTALLER_DIR/lib/bootstrap.sh"
# shellcheck source=lib/grub.sh
source "$INSTALLER_DIR/lib/grub.sh"
# shellcheck source=lib/postinstall.sh
source "$INSTALLER_DIR/lib/postinstall.sh"
# shellcheck source=lib/customizations.sh
source "$INSTALLER_DIR/lib/customizations.sh"
# ---------- run ----------
banner() {
cat <<'EOF'
╔══════════════════════════════════════════════════════════════╗
║ Void Linux Installer (xps9700) ║
║ target: btrfs on a single partition, dual-boot Windows ║
║ desktop: cinnamon | docker | vscode | nvidia PRIME ║
╚══════════════════════════════════════════════════════════════╝
EOF
}
main() {
banner
log "starting installer (UNATTENDED=${UNATTENDED:-0}, TEST_MODE=${TEST_MODE:-0})"
tui_select_install_target
setup_filesystems
bootstrap_base
generate_fstab
mount_pseudo_fs
configure_system
configure_users
configure_ssh_config
configure_nvidia_prime
configure_zram
configure_nix
install_vscode_real
install_customizations
enable_services
install_grub
reconfigure_all
unmount_target
ok "Installation complete."
log "Log file: $LOG_FILE"
if [[ "${TEST_MODE:-0}" != "1" && "${UNATTENDED:-0}" != "1" ]]; then
if confirm "Reboot now?"; then
systemctl reboot 2>/dev/null || reboot
fi
fi
}
main "$@"