#!/bin/bash # macbook-setup/setup-base.sh # System-Setup: Pakete, Konfiguration, Locale, Services # Verwendung: curl ... | sudo bash -s -- 16 # Kann mehrfach ausgeführt werden (idempotent) FORGEJO="https://git.motocamp.de" SETUP_RAW="$FORGEJO/rene/macbook-setup/raw/branch/main" # ── Farben ────────────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' ok() { echo -e "${GREEN}✓ $*${NC}"; } warn() { echo -e "${YELLOW}⚠ $*${NC}"; } fail() { echo -e "${RED}✗ $*${NC}"; } # ── Modell ermitteln ───────────────────────────────────────────────────── if [[ "$1" == "13" || "$1" == "16" ]]; then MODEL="$1" else echo "" echo "Welches MacBook Pro?" echo " 13 = MBP 13\" Late 2013" echo " 16 = MBP 16\" Mid 2014 (Intel + AMD Radeon)" read -rp "Modell [13/16]: " MODEL [[ "$MODEL" != "13" && "$MODEL" != "16" ]] && { fail "Ungültiges Modell: $MODEL"; exit 1; } fi ok "Modell: MacBook Pro $MODEL\"" echo "" echo "════════════════════════════════════════════" echo " setup-base.sh für MBP $MODEL\" startet" echo "════════════════════════════════════════════" # ── 1. Kritische Hardware-Fixes ZUERST (vor allem anderen) ─────────────── echo -e "\n=== 1/11 Hardware-Fixes ===" # GPU: AMD Radeon blacklisten (MBP 16") if [[ "$MODEL" == "16" ]]; then cat > /etc/modprobe.d/blacklist-radeon.conf < /etc/modprobe.d/hid_apple.conf ok "hid_apple: fnmode=2, iso_layout=0" # Tastaturbelegung (mac_nodeadkeys: @=Alt+L, |=Alt+7, wie auf dem Mac) cat > /etc/default/keyboard </dev/null || true ok "Tastatur: mac_nodeadkeys" # cloud-init deaktivieren (blockiert Boot ohne Cloud-Provider) if command -v cloud-init &>/dev/null; then touch /etc/cloud/cloud-init.disabled ok "cloud-init deaktiviert" fi # initramfs aktualisieren (GPU-Blacklist + hid_apple wirksam machen) update-initramfs -u 2>/dev/null || true ok "initramfs aktualisiert" # ── 2. Sleep/Suspend verhindern während Installation ───────────────────── echo -e "\n=== 2/11 Sleep verhindern ===" systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true ok "Sleep/Suspend deaktiviert (für Installation)" # ── 3. Eventuelle unterbrochene Installationen reparieren ──────────────── echo -e "\n=== 3/11 dpkg reparieren ===" dpkg --configure -a 2>/dev/null || true apt install -f -y 2>/dev/null || true ok "dpkg/apt repariert" # ── 4. System aktualisieren ────────────────────────────────────────────── echo -e "\n=== 4/11 System aktualisieren ===" apt update && apt upgrade -y || warn "apt upgrade hatte Probleme" ok "System aktuell" # ── 5. Pakete installieren ─────────────────────────────────────────────── echo -e "\n=== 5/11 Pakete installieren ===" apt install -y \ xubuntu-desktop \ bcmwl-kernel-source \ mbpfan thermald \ lm-sensors xfce4-sensors-plugin \ tlp tlp-rdw \ git curl wget stow \ zsh neovim \ build-essential \ python3 python3-pip python3-venv \ nodejs npm \ wireguard wireguard-tools \ openssh-server \ libheif-examples imagemagick \ pipx \ zoxide \ micro \ libreoffice libreoffice-l10n-de \ thunderbird thunderbird-locale-de \ keepassxc \ htop btop \ timeshift \ vlc \ language-pack-de \ wngerman \ bc \ xfce4-terminal \ || { fail "apt install fehlgeschlagen"; dpkg --configure -a; apt install -f -y; } ok "Pakete installiert (apt)" # FreeCAD via Snap snap install freecad 2>/dev/null || warn "FreeCAD Snap übersprungen" # ── 6. Brave Browser ───────────────────────────────────────────────────── echo -e "\n=== 6/11 Brave Browser ===" curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg \ https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg curl -fsSLo /etc/apt/sources.list.d/brave-browser-release.sources \ https://brave-browser-apt-release.s3.brave.com/brave-browser.sources apt update && apt install -y brave-browser || warn "Brave Browser fehlgeschlagen" ok "Brave installiert" # ── 7. Systemkonfigurationen ───────────────────────────────────────────── echo -e "\n=== 7/11 Systemkonfigurationen ===" # mbpfan (modellabhängig) wget -q -O /tmp/mbpfan.conf "$SETUP_RAW/mbpfan-${MODEL}.conf" && \ cp /tmp/mbpfan.conf /etc/mbpfan.conf || warn "mbpfan.conf Download fehlgeschlagen" # Temperatur-Watch-Skript wget -q -O /usr/local/bin/temp-watch.sh "$SETUP_RAW/temp-watch.sh" && \ chmod +x /usr/local/bin/temp-watch.sh || warn "temp-watch.sh Download fehlgeschlagen" ok "Systemkonfigurationen gesetzt" # ── 8. XFCE-Konfiguration (MBP 16": Compositor aus, Display-Skalierung) ─ if [[ "$MODEL" == "16" ]]; then echo -e "\n=== 8/11 XFCE-Konfiguration (MBP 16\") ===" XFCE_XML_DIR="/home/rene/.config/xfce4/xfconf/xfce-perchannel-xml" mkdir -p "$XFCE_XML_DIR" # Compositor deaktivieren cat > "$XFCE_XML_DIR/xfwm4.xml" < XFEOF # Display-Skalierung für Retina (2x, DPI 128) cat > "$XFCE_XML_DIR/xsettings.xml" < XSEOF # xfce4-display-settings deaktivieren (Endlosschleife) dpkg-divert --local --rename --divert /usr/bin/xfce4-display-settings.real /usr/bin/xfce4-display-settings 2>/dev/null || true ln -sf /usr/bin/true /usr/bin/xfce4-display-settings chown -R 1000:1000 /home/rene/.config/xfce4 ok "XFCE: Compositor aus, Retina-Skalierung, Display-Settings deaktiviert" else echo -e "\n=== 8/11 XFCE-Konfiguration — Standard (MBP 13\") ===" fi # ── 9. Netzwerk: NetworkManager statt netplan ───────────────────────────── echo -e "\n=== 9/11 Netzwerk ===" cat > /etc/netplan/01-network-manager.yaml </dev/null || true systemctl enable NetworkManager-wait-online.service 2>/dev/null || true ok "NetworkManager als Netzwerk-Renderer" # ── 10. Energieeinstellungen & Lokalisierung ───────────────────────────── echo -e "\n=== 10/11 Energie & Lokalisierung ===" tee /etc/systemd/sleep.conf > /dev/null < /dev/null </dev/null || ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime ok "Energie & Lokalisierung gesetzt" # ── 11. Services aktivieren ────────────────────────────────────────────── echo -e "\n=== 11/11 Services & Shell ===" systemctl enable mbpfan 2>/dev/null || true systemctl enable thermald 2>/dev/null || true systemctl enable tlp 2>/dev/null || true systemctl enable ssh 2>/dev/null || true # Services starten (nur wenn nicht in chroot) if [[ "$(stat -c %d:%i /)" == "$(stat -c %d:%i /proc/1/root/.)" ]] 2>/dev/null; then systemctl start mbpfan 2>/dev/null || true systemctl start thermald 2>/dev/null || true systemctl start ssh 2>/dev/null || true sensors-detect --auto 2>/dev/null || true fi # zsh als Standard-Shell chsh -s /bin/zsh rene 2>/dev/null || true # Sleep wieder erlauben systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true ok "Services aktiviert, zsh als Standard-Shell" # ── Zusammenfassung ────────────────────────────────────────────────────── echo "" echo "════════════════════════════════════════════" echo -e " ${GREEN}setup-base.sh abgeschlossen!${NC}" echo "════════════════════════════════════════════" echo "" echo "Nächste Schritte:" echo " 1. sudo reboot" echo " 2. In XFCE einloggen" echo " 3. Terminal öffnen und setup-desktop.sh starten:" echo " curl -fsSL $SETUP_RAW/setup-desktop.sh | bash"