#!/usr/bin/env bash # Instalación + configuración de Arch con KDE Plasma en UN comando desde el live. # # ./kde/setup.sh # # Dos fases en el mismo fichero: SETUP_PHASE=host (USB live) lanza archinstall # y se relanza dentro del chroot; SETUP_PHASE=chroot instala paquetes/tema/chezmoi. set -euo pipefail REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SETUP_PHASE="${SETUP_PHASE:-host}" GITEA="https://gitea.josevi.ovh/josevi" # --------------------------------------------------------------------------- # FASE 1 (USB live): archinstall + chroot # --------------------------------------------------------------------------- if [[ "$SETUP_PHASE" == "host" ]]; then [[ $EUID -eq 0 ]] || { echo "Ejecuta como root desde el live ISO."; exit 1; } read -rp "Usuario a crear: " INSTALL_USER read -rsp "Token de Gitea (repo arch-configs privado, Enter si es público): " GITEA_TOKEN; echo read -rp "Nombre para git [$INSTALL_USER]: " GIT_NAME; GIT_NAME="${GIT_NAME:-$INSTALL_USER}" read -rp "Email para git [josevisw@gmail.com]: " GIT_EMAIL; GIT_EMAIL="${GIT_EMAIL:-josevisw@gmail.com}" echo ">> Generando disk_config dimensionado a los discos reales..." # archinstall 4.x quitó "Percent": el layout se calcula aquí (ver shared/gen-disk-config.py) python3 "$REPO_DIR/shared/gen-disk-config.py" "$REPO_DIR/kde/archinstall-config.json" >/tmp/archinstall-merged.json echo ">> Lanzando archinstall (instala base + KDE en /mnt)..." archinstall --config /tmp/archinstall-merged.json --silent echo ">> Copiando arch-setup al sistema nuevo y entrando en chroot..." cp -r "$REPO_DIR" /mnt/root/arch-setup arch-chroot /mnt env \ SETUP_PHASE=chroot INSTALL_USER="$INSTALL_USER" GITEA_TOKEN="$GITEA_TOKEN" \ GIT_NAME="$GIT_NAME" GIT_EMAIL="$GIT_EMAIL" \ bash "/root/arch-setup/kde/setup.sh" echo ">> Listo. Quita el USB y reinicia: reboot" exit 0 fi # --------------------------------------------------------------------------- # FASE 2 (dentro del chroot) # --------------------------------------------------------------------------- : "${INSTALL_USER:?falta INSTALL_USER}" # Log de toda la fase chroot (pacman/paru/chezmoi) dentro del sistema nuevo, así # sobrevive al reinicio. archinstall ya tiene su propio log aparte. exec > >(tee -a /var/log/arch-setup.log) 2>&1 source "$(dirname "${BASH_SOURCE[0]}")/../shared/packages-common.sh" echo ">> Creando usuario $INSTALL_USER..." id "$INSTALL_USER" &>/dev/null || useradd -m -G wheel -s /bin/zsh "$INSTALL_USER" echo "Contraseña para $INSTALL_USER:"; passwd "$INSTALL_USER" echo '%wheel ALL=(ALL:ALL) ALL' >/etc/sudoers.d/10-wheel echo "$INSTALL_USER ALL=(ALL) NOPASSWD: ALL" >/etc/sudoers.d/99-setup-nopasswd echo ">> KDE Plasma mínimo + apps oficiales (pacman)..." # Plasma curado en vez del grupo 'plasma' completo (que mete discover, kwrited, # khelpcenter, drkonqi, juegos kde, etc.). archinstall solo instala la base; # el escritorio y los drivers gráficos open-source van aquí. # plasma-systemmonitor SÍ se instala explícito (se usa a diario), pese a que el # grupo 'plasma' completo se evita por el resto del bloat. install_pacman "${PACMAN_COMMON[@]}" \ plasma-desktop sddm sddm-kcm plasma-pa plasma-nm bluedevil powerdevil kscreen systemsettings kinfocenter \ kwallet-pam ksshaskpass xdg-desktop-portal-kde breeze-gtk kde-gtk-config kvantum appmenu-gtk-module \ konsole dolphin kate ark spectacle kcalc gwenview okular kdeconnect kdegraphics-thumbnailers \ plasma-systemmonitor \ adwaita-fonts \ packagekit-qt6 # Sin discover: se usa pamac-all + pamac-tray-plasma-git como gestor gráfico. # packagekit-qt6 lo requiere pamac-tray-plasma-git. echo ">> Bootloader (GRUB)..." install_bootloader echo ">> Bootstrapeando paru y paquetes AUR..." bootstrap_paru # Solo plasmoides que EXISTEN en AUR. Los de KDE Store/GitHub (gnome-pager, kMenu, # kvitals, windowtitlereborn, claudeusageswitcher, tt.launchpadPlasma) NO están en # AUR: viajan como dotfiles vía chezmoi (~/.local/share/plasma/plasmoids), capturados # con shared/capture-kde.sh. No los añadas aquí. install_aur "${AUR_COMMON[@]}" \ kwin-effects-glass-git tela-icon-theme \ plasma6-applets-appgrid plasma6-wallpapers-smart-video-wallpaper-reborn pamac-tray-plasma-git \ yin-yang kwin-decoration-sierra-breeze-enhanced-git run_optional "install_helpwire" install_helpwire run_optional "install_claude_code" install_claude_code run_optional "install_flatpaks" install_flatpaks "${FLATPAK_COMMON[@]}" enable_services() { systemctl enable sddm systemctl enable NetworkManager systemctl enable bluetooth systemctl enable "syncthing@$INSTALL_USER.service" systemctl enable tailscaled systemctl enable power-profiles-daemon systemctl enable cpupower } run_optional "enable_services" enable_services # Tema: look-and-feel propios Vampire-Light/Vampire-dark (ver PROJECT_CONTEXT.md) # + iconos Tela (tela-icon-theme de arriba) + cursores Bibata-Modern-Classic # (bibata-cursor-theme-bin en AUR_COMMON), vía AUR, instalan en /usr/share, sin # copiar binarios en dotfiles. El resto de la personalización (rc files, # layout de paneles, splash Animated-Abstract-Cube, los propios paquetes # look-and-feel Vampire-*) se captura del portátil con shared/capture-kde.sh # y se replica vía chezmoi. Single-monitor como base. # --- chezmoi: dotfiles personales (repo arch-configs) -------------------------- # chezmoi ya se instaló arriba (PACMAN_COMMON, repos oficiales desde 2.x). echo ">> chezmoi init --apply (repo arch-configs)..." REMOTE="$GITEA/arch-configs.git" [[ -n "${GITEA_TOKEN:-}" ]] && REMOTE="https://$INSTALL_USER:$GITEA_TOKEN@gitea.josevi.ovh/josevi/arch-configs.git" chezmoi_init_apply() { as_user "export GIT_NAME='$GIT_NAME' GIT_EMAIL='$GIT_EMAIL'; \ chezmoi init --apply '$REMOTE'" } run_optional "chezmoi init --apply" chezmoi_init_apply # --- pkgsync: sincronización de paquetes (repo arch-setup) ----------------- run_optional "install_pkgsync" install_pkgsync # Snapper AL FINAL, no tras install_bootloader: snap-pac crea un snapshot # pre+post por cada transacción de pacman/paru en cuanto existe el config de # snapper, y dentro del chroot no hay systemd corriendo para que el timer de # cleanup limite NUMBER_LIMIT -- ninguna limpieza puede correr hasta el primer # arranque real. Con snapper configurado antes de las ~30 instalaciones AUR # (cada una su propia transacción), se acumulan decenas de snapshots sin poda # posible; en una VM de prueba con disco pequeño esto llenó el disco entero # (visto en real). Configurándolo al final, ya con el sistema instalado, no se # snapshotea la propia instalación -- el primer snapshot legítimo será el de # un 'pacman -Syu' real ya con el sistema arrancado, que es para lo que existe # el rollback. echo ">> Configurando rollback de actualizaciones (snapper)..." run_optional "configure_btrfs_rollback" configure_btrfs_rollback rm -f /etc/sudoers.d/99-setup-nopasswd if ((${#FAILED_STEPS[@]})); then echo echo "⚠️ Instalación completada con avisos. Pasos que fallaron y necesitan revisión manual:" printf ' - %s\n' "${FAILED_STEPS[@]}" fi echo ">> Configuración de KDE completada."