feat(packages): add package installation module

Implement package installation in chroot environment to replace
void-installer dependency. Module installs minimal base system:
- Base-System: base-system, linux, linux-firmware, grub, cryptsetup, dracut
- Network: dhcpcd, iproute2, iputils
- Tools: vim, nano, sudo

Decision: Install conservative package set by default.
Base packages are sufficient for bootable CLI system with network.
Desktop environments can be added later via config file support.

Alternative considered: Interactive package selection rejected
(violates CLI-only requirement from requirements document).

Trade-off: Fixed package list means less flexibility but simpler
initial implementation. Future config file support will allow
customization.

Validation: Package verification after installation ensures
critical packages are present before continuing.
This commit is contained in:
Stefan Strobl 2025-12-24 20:43:54 +01:00
parent 667453596a
commit f295eb5684

97
src/packages.sh Normal file
View File

@ -0,0 +1,97 @@
#!/usr/bin/env bash
# === Motivation ===
# Install all required packages for a bootable Void Linux system.
# === Problem Statement ===
# The installer must provide a minimal base system without relying on void-installer.
# === Scope ===
# In scope: package installation, repository synchronization, dependency resolution.
# Out of scope: package selection UI, custom repository configuration.
# === Concepts ===
# XBPS: Void's package manager, handles installation and dependency resolution.
# chroot: Execute package installation in the target system environment.
# Repository sync: Update package index before installation.
# === Decisions ===
# Install minimal package set by default for base CLI system.
# Support optional package installation via config (future: config file support).
# Use xbps-install with sync (-S) and yes (-y) flags for non-interactive installation.
# Ensure network connectivity before package installation (handled by live environment).
# Package list is conservative: only essentials for boot + network + basic tools.
# === Alternatives Considered ===
# Interactive package selection rejected (violates CLI-only requirement).
# Separate kernel installation rejected (included in base-system dependency).
# systemd-based packages rejected (Void uses runit).
# === Constraints ===
# Target system must be mounted at $MOUNT_ROOT.
# Repository must be accessible via network.
# xbps must be available in live environment.
# === Open Questions ===
# Should firmware packages beyond linux-firmware be included (e.g., nvidia, AMD)?
# Should we validate package availability before installation?
# How to handle optional packages (desktop environments, development tools)?
# === Success Criteria ===
# All required packages are installed in the target system.
# Package manager can be used in the installed system post-reboot.
# System can boot with network connectivity and basic tools available.
packages_install() {
: "${MOUNT_ROOT:?Mount root is required}"
require_command xbps-install
log_info "Package installation: installing base system"
# Define minimal package set for bootable CLI system
local base_packages=(
"base-system" # Essential base packages (includes kernel via dependency)
"linux" # Linux kernel
"linux-firmware" # Firmware blobs for hardware
"grub" # Bootloader
"cryptsetup" # LUKS encryption tools
"dracut" # initramfs generator
)
local network_packages=(
"dhcpcd" # DHCP client for network
"iproute2" # ip command for network configuration
"iputils" # ping, traceroute, etc.
)
local system_tools=(
"vim" # Text editor
"nano" # Alternative text editor
"sudo" # Privilege escalation
)
# Combine all package arrays
local all_packages=("${base_packages[@]}" "${network_packages[@]}" "${system_tools[@]}")
log_info "Package list: ${all_packages[*]}"
log_info "Installing ${#all_packages[@]} packages (this may take several minutes)..."
# Ensure repository is accessible and synchronized
# Use chroot to install packages into target system
if ! chroot "$MOUNT_ROOT" xbps-install -Syu "${all_packages[@]}"; then
die "Package installation failed. Check network connectivity and repository status."
fi
log_info "Package installation complete."
# Verify critical packages are installed
log_info "Verifying package installation..."
local critical_packages=("base-system" "linux" "grub" "cryptsetup")
for pkg in "${critical_packages[@]}"; do
if ! chroot "$MOUNT_ROOT" xbps-query "$pkg" >/dev/null 2>&1; then
die "Critical package not found: $pkg"
fi
done
log_info "Package verification passed."
}