#!/usr/bin/env bash set -euo pipefail # debian-minimal-tty.sh # Fresh Debian netinst -> minimal Plasma desktop, NetworkManager Wi-Fi, firmware, # codecs, Discover, Flatpak, Flathub, and nicer Debian GRUB. # # Run from TTY: # chmod +x debian-minimal-tty.sh # sudo ./debian-minimal-tty.sh if [[ "${EUID}" -ne 0 ]]; then echo "Run with sudo:" echo " sudo ./debian-minimal-tty.sh" exit 1 fi export DEBIAN_FRONTEND=noninteractive timestamp() { date +%Y%m%d-%H%M%S } enable_debian_nonfree_sources() { echo "==> Enabling Debian contrib/non-free/non-free-firmware repositories" . /etc/os-release codename="${VERSION_CODENAME:-trixie}" stamp="$(timestamp)" mkdir -p /etc/apt/sources.list.d if [[ -f /etc/apt/sources.list ]]; then cp -a /etc/apt/sources.list "/etc/apt/sources.list.bak-${stamp}" sed -i -E 's/^[[:space:]]*(deb|deb-src|cdrom:)/# disabled by debian-minimal-tty: &/' /etc/apt/sources.list fi if [[ -f /etc/apt/sources.list.d/debian.sources ]]; then cp -a /etc/apt/sources.list.d/debian.sources "/etc/apt/sources.list.d/debian.sources.bak-${stamp}" fi cat > /etc/apt/sources.list.d/debian.sources </dev/null 2>&1; then echo "==> Installing optional package: $pkg" apt-get install -y --no-install-recommends "$pkg" else echo "==> Skipping unavailable package: $pkg" fi done } purge_if_installed() { local installed=() local pkg for pkg in "$@"; do if dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q "install ok installed"; then installed+=("$pkg") fi done if (( ${#installed[@]} > 0 )); then echo "==> Purging unwanted packages: ${installed[*]}" apt-get purge -y "${installed[@]}" fi } force_networkmanager_managed() { echo "==> Making NetworkManager own Wi-Fi/Ethernet" local stamp stamp="$(timestamp)" if [[ -f /etc/network/interfaces ]]; then cp -a /etc/network/interfaces "/etc/network/interfaces.bak-${stamp}" fi cat > /etc/network/interfaces <<'EOF' auto lo iface lo inet loopback EOF mkdir -p /etc/NetworkManager/conf.d cat > /etc/NetworkManager/conf.d/99-force-managed.conf <<'EOF' [main] plugins=ifupdown,keyfile [ifupdown] managed=true [keyfile] unmanaged-devices=none EOF } setup_pretty_grub() { echo "==> Setting up prettier Debian GRUB theme" if [[ -f /usr/share/grub/themes/starfield/theme.txt ]]; then if grep -q '^GRUB_THEME=' /etc/default/grub; then sed -i 's|^GRUB_THEME=.*|GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"|' /etc/default/grub else echo 'GRUB_THEME="/usr/share/grub/themes/starfield/theme.txt"' >> /etc/default/grub fi else echo "==> Starfield GRUB theme not found; skipping GRUB_THEME setting" fi if command -v update-grub >/dev/null 2>&1; then update-grub elif command -v grub-mkconfig >/dev/null 2>&1; then grub-mkconfig -o /boot/grub/grub.cfg else echo "==> Could not find update-grub or grub-mkconfig; skipping GRUB update" fi } echo "==> Starting minimal Debian Plasma install" enable_debian_nonfree_sources echo "==> Updating apt" apt-get update echo "==> Installing minimal Plasma base" apt-get install -y --no-install-recommends \ sddm \ sddm-theme-breeze \ plasma-desktop \ plasma-workspace \ kwin-wayland \ kwin-x11 \ systemsettings \ dolphin \ konsole \ network-manager \ plasma-nm \ wpasupplicant \ wireless-regdb \ rfkill \ plasma-pa \ pipewire \ pipewire-bin \ pipewire-pulse \ wireplumber \ rtkit \ powerdevil \ power-profiles-daemon \ upower \ bluedevil \ bluez \ polkit-kde-agent-1 \ dbus-user-session \ xdg-desktop-portal \ xdg-desktop-portal-kde \ kde-config-gtk-style \ breeze \ breeze-gtk-theme \ desktop-base \ grub-theme-starfield \ qt6-wayland \ xwayland \ kscreen \ udisks2 \ ntfs-3g \ exfatprogs \ dosfstools \ fonts-noto-core \ fonts-noto-mono \ fonts-noto-color-emoji \ ark \ kde-spectacle \ gwenview \ okular \ mpv \ zip \ unzip \ 7zip \ ffmpeg \ libavcodec-extra \ gstreamer1.0-libav \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ plasma-discover \ plasma-discover-backend-fwupd \ packagekit \ packagekit-tools \ flatpak \ plasma-discover-backend-flatpak echo "==> Installing firmware, microcode, and laptop extras" install_if_available \ firmware-linux \ firmware-linux-nonfree \ firmware-misc-nonfree \ firmware-iwlwifi \ firmware-realtek \ firmware-brcm80211 \ firmware-mediatek \ firmware-amd-graphics \ unrar if grep -qi "GenuineIntel" /proc/cpuinfo; then install_if_available intel-microcode thermald fi if grep -qi "AuthenticAMD" /proc/cpuinfo; then install_if_available amd64-microcode fi echo "==> Adding Flathub" flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo || true echo "==> Removing stuff this setup intentionally avoids" purge_if_installed \ task-desktop \ task-kde-desktop \ kde-standard \ kde-full \ kde-plasma-desktop \ kde-baseapps \ kmail \ kontact \ korganizer \ kaddressbook \ akregator \ konqueror \ konq-plugins \ kdeconnect \ plasma-welcome \ kup-backup \ libreoffice-common \ libreoffice-core \ libreoffice-writer \ libreoffice-calc \ libreoffice-impress \ libreoffice-draw \ libreoffice-math \ libreoffice-base-core \ xterm \ zutty apt-get autoremove -y --purge setup_pretty_grub force_networkmanager_managed echo "==> Enabling services" systemctl disable --now networking.service 2>/dev/null || true systemctl enable --now NetworkManager.service systemctl enable sddm.service if systemctl list-unit-files | grep -q '^thermald.service'; then systemctl enable --now thermald.service 2>/dev/null || true fi echo "==> Unblocking Wi-Fi" rfkill unblock all 2>/dev/null || true nmcli networking on 2>/dev/null || true nmcli radio wifi on 2>/dev/null || true echo "==> Forcing visible devices to managed" while IFS=: read -r dev type; do if [[ "$type" == "wifi" || "$type" == "ethernet" ]]; then nmcli device set "$dev" managed yes 2>/dev/null || true fi done < <(nmcli -t -f DEVICE,TYPE device status 2>/dev/null || true) systemctl restart NetworkManager.service echo echo "==> Done." echo echo "Current NetworkManager device status:" nmcli device status || true echo echo "To connect from TTY:" echo " nmtui" echo echo "Then reboot:" echo " sudo reboot"