Robusteres setup-base.sh: GPU-Fix zuerst, kein set -e, idempotent
- set -e entfernt (Script bricht nicht mehr bei einzelnen Fehlern ab) - GPU-Blacklist + hid_apple + Keyboard als SCHRITT 1 (vor apt install) - dpkg --configure -a VOR Paketinstallation (repariert unterbrochene Installs) - update-initramfs direkt nach Hardware-Fixes - cloud-init früh deaktivieren - Fehlerbehandlung mit || warn/fail statt Abbruch - Zusammenfassung am Ende mit nächsten Schritten
This commit is contained in:
parent
6f48c7fc3b
commit
b0202cb285
1 changed files with 102 additions and 89 deletions
191
setup-base.sh
191
setup-base.sh
|
|
@ -1,10 +1,9 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# macbook-setup/setup-base.sh
|
# macbook-setup/setup-base.sh
|
||||||
# System-Setup: Pakete, Konfiguration, Locale, Services
|
# System-Setup: Pakete, Konfiguration, Locale, Services
|
||||||
# Funktioniert in chroot (Autoinstall late-commands) UND standalone
|
# Verwendung: curl ... | sudo bash -s -- 16
|
||||||
# Verwendung: sudo bash setup-base.sh [13|16]
|
# Kann mehrfach ausgeführt werden (idempotent)
|
||||||
|
|
||||||
set -e
|
|
||||||
FORGEJO="https://git.motocamp.de"
|
FORGEJO="https://git.motocamp.de"
|
||||||
SETUP_RAW="$FORGEJO/rene/macbook-setup/raw/branch/main"
|
SETUP_RAW="$FORGEJO/rene/macbook-setup/raw/branch/main"
|
||||||
|
|
||||||
|
|
@ -12,7 +11,7 @@ SETUP_RAW="$FORGEJO/rene/macbook-setup/raw/branch/main"
|
||||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
||||||
ok() { echo -e "${GREEN}✓ $*${NC}"; }
|
ok() { echo -e "${GREEN}✓ $*${NC}"; }
|
||||||
warn() { echo -e "${YELLOW}⚠ $*${NC}"; }
|
warn() { echo -e "${YELLOW}⚠ $*${NC}"; }
|
||||||
err() { echo -e "${RED}✗ $*${NC}"; exit 1; }
|
fail() { echo -e "${RED}✗ $*${NC}"; }
|
||||||
|
|
||||||
# ── Modell ermitteln ─────────────────────────────────────────────────────
|
# ── Modell ermitteln ─────────────────────────────────────────────────────
|
||||||
if [[ "$1" == "13" || "$1" == "16" ]]; then
|
if [[ "$1" == "13" || "$1" == "16" ]]; then
|
||||||
|
|
@ -23,7 +22,7 @@ else
|
||||||
echo " 13 = MBP 13\" Late 2013"
|
echo " 13 = MBP 13\" Late 2013"
|
||||||
echo " 16 = MBP 16\" Mid 2014 (Intel + AMD Radeon)"
|
echo " 16 = MBP 16\" Mid 2014 (Intel + AMD Radeon)"
|
||||||
read -rp "Modell [13/16]: " MODEL
|
read -rp "Modell [13/16]: " MODEL
|
||||||
[[ "$MODEL" != "13" && "$MODEL" != "16" ]] && err "Ungültiges Modell: $MODEL"
|
[[ "$MODEL" != "13" && "$MODEL" != "16" ]] && { fail "Ungültiges Modell: $MODEL"; exit 1; }
|
||||||
fi
|
fi
|
||||||
ok "Modell: MacBook Pro $MODEL\""
|
ok "Modell: MacBook Pro $MODEL\""
|
||||||
|
|
||||||
|
|
@ -32,18 +31,62 @@ echo "════════════════════════
|
||||||
echo " setup-base.sh für MBP $MODEL\" startet"
|
echo " setup-base.sh für MBP $MODEL\" startet"
|
||||||
echo "════════════════════════════════════════════"
|
echo "════════════════════════════════════════════"
|
||||||
|
|
||||||
# ── 0. Sleep/Suspend verhindern während Installation ─────────────────────
|
# ── 1. Kritische Hardware-Fixes ZUERST (vor allem anderen) ───────────────
|
||||||
echo -e "\n=== 0/10 Sleep verhindern ==="
|
echo -e "\n=== 1/11 Hardware-Fixes ==="
|
||||||
|
|
||||||
|
# GPU: AMD Radeon blacklisten (MBP 16")
|
||||||
|
if [[ "$MODEL" == "16" ]]; then
|
||||||
|
cat > /etc/modprobe.d/blacklist-radeon.conf <<EOF
|
||||||
|
blacklist radeon
|
||||||
|
blacklist amdgpu
|
||||||
|
EOF
|
||||||
|
ok "AMD Radeon/amdgpu geblockt — nur Intel i915"
|
||||||
|
else
|
||||||
|
ok "MBP 13\": nur Intel-GPU, kein Blacklisting nötig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Fn-Tasten + ISO-Layout-Fix (iso_layout=0 verhindert ^/< Vertauschung)
|
||||||
|
echo 'options hid_apple fnmode=2 iso_layout=0' > /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 <<EOF
|
||||||
|
XKBMODEL="macbook79"
|
||||||
|
XKBLAYOUT="de"
|
||||||
|
XKBVARIANT="mac_nodeadkeys"
|
||||||
|
XKBOPTIONS="lv3:lalt_switch,terminate:ctrl_alt_bksp"
|
||||||
|
EOF
|
||||||
|
dpkg-reconfigure -f noninteractive keyboard-configuration 2>/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
|
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true
|
||||||
ok "Sleep/Suspend deaktiviert (für Installation)"
|
ok "Sleep/Suspend deaktiviert (für Installation)"
|
||||||
|
|
||||||
# ── 1. System aktualisieren ──────────────────────────────────────────────
|
# ── 3. Eventuelle unterbrochene Installationen reparieren ────────────────
|
||||||
echo -e "\n=== 1/10 System aktualisieren ==="
|
echo -e "\n=== 3/11 dpkg reparieren ==="
|
||||||
apt update && apt upgrade -y
|
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"
|
ok "System aktuell"
|
||||||
|
|
||||||
# ── 2. Pakete installieren ───────────────────────────────────────────────
|
# ── 5. Pakete installieren ───────────────────────────────────────────────
|
||||||
echo -e "\n=== 2/10 Pakete installieren ==="
|
echo -e "\n=== 5/11 Pakete installieren ==="
|
||||||
apt install -y \
|
apt install -y \
|
||||||
xubuntu-desktop \
|
xubuntu-desktop \
|
||||||
bcmwl-kernel-source \
|
bcmwl-kernel-source \
|
||||||
|
|
@ -70,69 +113,42 @@ apt install -y \
|
||||||
language-pack-de \
|
language-pack-de \
|
||||||
wngerman \
|
wngerman \
|
||||||
bc \
|
bc \
|
||||||
xfce4-terminal
|
xfce4-terminal \
|
||||||
|
|| { fail "apt install fehlgeschlagen"; dpkg --configure -a; apt install -f -y; }
|
||||||
ok "Pakete installiert (apt)"
|
ok "Pakete installiert (apt)"
|
||||||
|
|
||||||
# FreeCAD via Snap (nicht in Ubuntu 24.04 Repos verfügbar)
|
# FreeCAD via Snap
|
||||||
snap install freecad 2>/dev/null || warn "FreeCAD Snap übersprungen (chroot)"
|
snap install freecad 2>/dev/null || warn "FreeCAD Snap übersprungen"
|
||||||
|
|
||||||
# ── 3. GPU-Konfiguration ────────────────────────────────────────────────
|
# ── 6. Brave Browser ─────────────────────────────────────────────────────
|
||||||
if [[ "$MODEL" == "16" ]]; then
|
echo -e "\n=== 6/11 Brave Browser ==="
|
||||||
echo -e "\n=== 3/10 AMD Radeon blacklisten (MBP 16\") ==="
|
|
||||||
# MBP 15" Mid 2014 hat Intel HD 5200 + AMD Radeon R9 M370X
|
|
||||||
# Radeon verursacht Grafikartefakte — nur Intel-GPU nutzen
|
|
||||||
cat > /etc/modprobe.d/blacklist-radeon.conf <<AMDEOF
|
|
||||||
blacklist radeon
|
|
||||||
blacklist amdgpu
|
|
||||||
AMDEOF
|
|
||||||
ok "AMD Radeon geblockt — nur Intel i915 aktiv"
|
|
||||||
else
|
|
||||||
echo -e "\n=== 3/10 GPU (MBP 13\") — keine Änderung ==="
|
|
||||||
ok "MBP 13\" hat nur Intel-GPU"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── 4. Brave Browser ─────────────────────────────────────────────────────
|
|
||||||
echo -e "\n=== 4/10 Brave Browser ==="
|
|
||||||
curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg \
|
curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg \
|
||||||
https://brave-browser-apt-release.s3.brave.com/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 \
|
curl -fsSLo /etc/apt/sources.list.d/brave-browser-release.sources \
|
||||||
https://brave-browser-apt-release.s3.brave.com/brave-browser.sources
|
https://brave-browser-apt-release.s3.brave.com/brave-browser.sources
|
||||||
apt update && apt install -y brave-browser
|
apt update && apt install -y brave-browser || warn "Brave Browser fehlgeschlagen"
|
||||||
ok "Brave installiert"
|
ok "Brave installiert"
|
||||||
|
|
||||||
# ── 5. Konfigurationsdateien ─────────────────────────────────────────────
|
# ── 7. Systemkonfigurationen ─────────────────────────────────────────────
|
||||||
echo -e "\n=== 5/10 Systemkonfigurationen ==="
|
echo -e "\n=== 7/11 Systemkonfigurationen ==="
|
||||||
|
|
||||||
# Tastaturbelegung (mac_nodeadkeys: @=Alt+L, |=Alt+7, wie auf dem Mac)
|
|
||||||
tee /etc/default/keyboard > /dev/null <<EOF
|
|
||||||
XKBMODEL="macbook79"
|
|
||||||
XKBLAYOUT="de"
|
|
||||||
XKBVARIANT="mac_nodeadkeys"
|
|
||||||
XKBOPTIONS="lv3:lalt_switch,terminate:ctrl_alt_bksp"
|
|
||||||
EOF
|
|
||||||
dpkg-reconfigure -f noninteractive keyboard-configuration 2>/dev/null || true
|
|
||||||
|
|
||||||
# Fn-Tasten + ISO-Layout-Fix (iso_layout=0 verhindert ^/< Vertauschung)
|
|
||||||
echo 'options hid_apple fnmode=2 iso_layout=0' | tee /etc/modprobe.d/hid_apple.conf > /dev/null
|
|
||||||
|
|
||||||
# mbpfan (modellabhängig)
|
# mbpfan (modellabhängig)
|
||||||
wget -q -O /tmp/mbpfan.conf "$SETUP_RAW/mbpfan-${MODEL}.conf"
|
wget -q -O /tmp/mbpfan.conf "$SETUP_RAW/mbpfan-${MODEL}.conf" && \
|
||||||
cp /tmp/mbpfan.conf /etc/mbpfan.conf
|
cp /tmp/mbpfan.conf /etc/mbpfan.conf || warn "mbpfan.conf Download fehlgeschlagen"
|
||||||
|
|
||||||
# Temperatur-Watch-Skript
|
# Temperatur-Watch-Skript
|
||||||
wget -q -O /usr/local/bin/temp-watch.sh "$SETUP_RAW/temp-watch.sh"
|
wget -q -O /usr/local/bin/temp-watch.sh "$SETUP_RAW/temp-watch.sh" && \
|
||||||
chmod +x /usr/local/bin/temp-watch.sh
|
chmod +x /usr/local/bin/temp-watch.sh || warn "temp-watch.sh Download fehlgeschlagen"
|
||||||
|
|
||||||
update-initramfs -u
|
|
||||||
ok "Systemkonfigurationen gesetzt"
|
ok "Systemkonfigurationen gesetzt"
|
||||||
|
|
||||||
# ── 6. XFCE-Konfiguration (MBP 16": Compositor aus, Display-Skalierung) ─
|
# ── 8. XFCE-Konfiguration (MBP 16": Compositor aus, Display-Skalierung) ─
|
||||||
if [[ "$MODEL" == "16" ]]; then
|
if [[ "$MODEL" == "16" ]]; then
|
||||||
echo -e "\n=== 6/10 XFCE-Konfiguration (MBP 16\") ==="
|
echo -e "\n=== 8/11 XFCE-Konfiguration (MBP 16\") ==="
|
||||||
XFCE_XML_DIR="/home/rene/.config/xfce4/xfconf/xfce-perchannel-xml"
|
XFCE_XML_DIR="/home/rene/.config/xfce4/xfconf/xfce-perchannel-xml"
|
||||||
mkdir -p "$XFCE_XML_DIR"
|
mkdir -p "$XFCE_XML_DIR"
|
||||||
|
|
||||||
# Compositor deaktivieren (verursacht Probleme ohne GPU-Beschleunigung)
|
# Compositor deaktivieren
|
||||||
cat > "$XFCE_XML_DIR/xfwm4.xml" <<XFEOF
|
cat > "$XFCE_XML_DIR/xfwm4.xml" <<XFEOF
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<channel name="xfwm4" version="1.0">
|
<channel name="xfwm4" version="1.0">
|
||||||
|
|
@ -142,7 +158,7 @@ if [[ "$MODEL" == "16" ]]; then
|
||||||
</channel>
|
</channel>
|
||||||
XFEOF
|
XFEOF
|
||||||
|
|
||||||
# Display-Skalierung für Retina (2x, DPI 168)
|
# Display-Skalierung für Retina (2x, DPI 128)
|
||||||
cat > "$XFCE_XML_DIR/xsettings.xml" <<XSEOF
|
cat > "$XFCE_XML_DIR/xsettings.xml" <<XSEOF
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<channel name="xsettings" version="1.0">
|
<channel name="xsettings" version="1.0">
|
||||||
|
|
@ -155,18 +171,18 @@ XFEOF
|
||||||
</channel>
|
</channel>
|
||||||
XSEOF
|
XSEOF
|
||||||
|
|
||||||
# xfce4-display-settings deaktivieren (öffnet sich sonst in Endlosschleife)
|
# xfce4-display-settings deaktivieren (Endlosschleife)
|
||||||
dpkg-divert --local --rename --divert /usr/bin/xfce4-display-settings.real /usr/bin/xfce4-display-settings
|
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
|
ln -sf /usr/bin/true /usr/bin/xfce4-display-settings
|
||||||
|
|
||||||
chown -R 1000:1000 /home/rene/.config/xfce4
|
chown -R 1000:1000 /home/rene/.config/xfce4
|
||||||
ok "XFCE: Compositor aus, Retina-Skalierung, Display-Settings deaktiviert"
|
ok "XFCE: Compositor aus, Retina-Skalierung, Display-Settings deaktiviert"
|
||||||
else
|
else
|
||||||
echo -e "\n=== 6/10 XFCE-Konfiguration — Standard (MBP 13\") ==="
|
echo -e "\n=== 8/11 XFCE-Konfiguration — Standard (MBP 13\") ==="
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── 7. Netzwerk: NetworkManager statt netplan ─────────────────────────────
|
# ── 9. Netzwerk: NetworkManager statt netplan ─────────────────────────────
|
||||||
echo -e "\n=== 7/10 Netzwerk ==="
|
echo -e "\n=== 9/11 Netzwerk ==="
|
||||||
cat > /etc/netplan/01-network-manager.yaml <<NMEOF
|
cat > /etc/netplan/01-network-manager.yaml <<NMEOF
|
||||||
network:
|
network:
|
||||||
version: 2
|
version: 2
|
||||||
|
|
@ -179,8 +195,8 @@ systemctl disable systemd-networkd-wait-online.service 2>/dev/null || true
|
||||||
systemctl enable NetworkManager-wait-online.service 2>/dev/null || true
|
systemctl enable NetworkManager-wait-online.service 2>/dev/null || true
|
||||||
ok "NetworkManager als Netzwerk-Renderer"
|
ok "NetworkManager als Netzwerk-Renderer"
|
||||||
|
|
||||||
# ── 8. Energieeinstellungen (systemd) ────────────────────────────────────
|
# ── 10. Energieeinstellungen & Lokalisierung ─────────────────────────────
|
||||||
echo -e "\n=== 8/10 Energieeinstellungen ==="
|
echo -e "\n=== 10/11 Energie & Lokalisierung ==="
|
||||||
|
|
||||||
tee /etc/systemd/sleep.conf > /dev/null <<EOF
|
tee /etc/systemd/sleep.conf > /dev/null <<EOF
|
||||||
[Sleep]
|
[Sleep]
|
||||||
|
|
@ -192,45 +208,42 @@ HandleLidSwitch=suspend
|
||||||
HandleLidSwitchExternalPower=ignore
|
HandleLidSwitchExternalPower=ignore
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
ok "Energieeinstellungen gesetzt"
|
|
||||||
|
|
||||||
# ── 9. Lokalisierung ────────────────────────────────────────────────────
|
|
||||||
echo -e "\n=== 9/10 Lokalisierung ==="
|
|
||||||
locale-gen de_DE.UTF-8
|
locale-gen de_DE.UTF-8
|
||||||
update-locale LANG=de_DE.UTF-8 LC_ALL=de_DE.UTF-8
|
update-locale LANG=de_DE.UTF-8 LC_ALL=de_DE.UTF-8
|
||||||
timedatectl set-timezone Europe/Berlin 2>/dev/null || ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
|
timedatectl set-timezone Europe/Berlin 2>/dev/null || ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
|
||||||
ok "Lokalisierung: Deutsch / Berlin"
|
ok "Energie & Lokalisierung gesetzt"
|
||||||
|
|
||||||
# ── 10. Services aktivieren ──────────────────────────────────────────────
|
# ── 11. Services aktivieren ──────────────────────────────────────────────
|
||||||
echo -e "\n=== 10/10 Services aktivieren ==="
|
echo -e "\n=== 11/11 Services & Shell ==="
|
||||||
systemctl enable mbpfan
|
systemctl enable mbpfan 2>/dev/null || true
|
||||||
systemctl enable thermald
|
systemctl enable thermald 2>/dev/null || true
|
||||||
systemctl enable tlp
|
systemctl enable tlp 2>/dev/null || true
|
||||||
systemctl enable ssh
|
systemctl enable ssh 2>/dev/null || true
|
||||||
# --now nur wenn nicht in chroot
|
|
||||||
|
# Services starten (nur wenn nicht in chroot)
|
||||||
if [[ "$(stat -c %d:%i /)" == "$(stat -c %d:%i /proc/1/root/.)" ]] 2>/dev/null; then
|
if [[ "$(stat -c %d:%i /)" == "$(stat -c %d:%i /proc/1/root/.)" ]] 2>/dev/null; then
|
||||||
systemctl start mbpfan
|
systemctl start mbpfan 2>/dev/null || true
|
||||||
systemctl start thermald
|
systemctl start thermald 2>/dev/null || true
|
||||||
systemctl start ssh
|
systemctl start ssh 2>/dev/null || true
|
||||||
sensors-detect --auto 2>/dev/null || true
|
sensors-detect --auto 2>/dev/null || true
|
||||||
ok "mbpfan, thermald, tlp, ssh aktiv (gestartet)"
|
|
||||||
else
|
|
||||||
ok "mbpfan, thermald, tlp, ssh aktiviert (Start nach Reboot)"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ── cloud-init deaktivieren (kein Cloud-Provider, blockiert sonst den Boot) ──
|
# zsh als Standard-Shell
|
||||||
if command -v cloud-init &>/dev/null; then
|
|
||||||
touch /etc/cloud/cloud-init.disabled
|
|
||||||
ok "cloud-init deaktiviert"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ── zsh als Standard-Shell für rene ──────────────────────────────────────
|
|
||||||
chsh -s /bin/zsh rene 2>/dev/null || true
|
chsh -s /bin/zsh rene 2>/dev/null || true
|
||||||
|
|
||||||
# ── Sleep wieder erlauben ────────────────────────────────────────────────
|
# Sleep wieder erlauben
|
||||||
systemctl unmask sleep.target suspend.target hibernate.target hybrid-sleep.target 2>/dev/null || true
|
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 "════════════════════════════════════════════"
|
echo "════════════════════════════════════════════"
|
||||||
echo -e " ${GREEN}setup-base.sh abgeschlossen!${NC}"
|
echo -e " ${GREEN}setup-base.sh abgeschlossen!${NC}"
|
||||||
echo "════════════════════════════════════════════"
|
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"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue