Debmirror (Linux Repository Spiegel erstellen)

dieses Script erstellt einen Spiegel vom Ubuntu Repository und beinhaltet jammy und noble

das Script versteht sich mit etwas Grundwissen fast von selbst, es kann leicht auf andere Spiegelserver oder Repository und Distribution angepasst werden, das Script erstellt einen Linux Repository Spiegel, bei Fehler wird einmal wiederholt und anschließend Beendet, es werden Logs erstellt.

erforderlich
apt install debmirror gnupg xz-utils rsync

je nach Repository und Distribution müssen noch die GPG Key installiert werden falls solche Fehlermeldungen kommen

[GNUPG:] NEWSIG
[GNUPG:] ERRSIG 0E98404D386FA1D9 1 8 00 1754729630 9 A7236886F3CCCAAD148A27F80E98404D386FA1D9
[GNUPG:] NO_PUBKEY 0E98404D386FA1D9
[GNUPG:] NEWSIG
[GNUPG:] ERRSIG 6ED0E7B82643E131 1 8 00 1754729631 9 4CB50190207B4758A3F73A796ED0E7B82643E131
[GNUPG:] NO_PUBKEY 6ED0E7B82643E131
[GNUPG:] NEWSIG
[GNUPG:] ERRSIG F8D2585B8783D481 22 8 00 1754731538 9 4D64FEC119C2029067D6E791F8D2585B8783D481
[GNUPG:] NO_PUBKEY F8D2585B8783D481
gpgv: Signature made Sa 09 Aug 2025 10:53:50 CEST
gpgv: using RSA key A7236886F3CCCAAD148A27F80E98404D386FA1D9
gpgv: Can’t check signature: No public key
gpgv: Signature made Sa 09 Aug 2025 10:53:51 CEST
gpgv: using RSA key 4CB50190207B4758A3F73A796ED0E7B82643E131
gpgv: Can’t check signature: No public key
gpgv: Signature made Sa 09 Aug 2025 11:25:38 CEST
gpgv: using EDDSA key 4D64FEC119C2029067D6E791F8D2585B8783D481
gpgv: Can’t check signature: No public key

die Methode ist zwar veraltet, funktioniert aber noch, auf diese weise muss jeder fehlende Key importiert werden

gpg --keyserver keyserver.ubuntu.com --recv-key  0E98404D386FA1D9
gpg -a --export 0E98404D386FA1D9 | sudo apt-key add -
gpg --no-default-keyring -a --keyring /root/.gnupg/pubring.gpg --export 0E98404D386FA1D9 | gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg --import -

debmirror-ubuntu.sh

#!/bin/bash
# Einfaches debmirror Script
# Autor: AB
# ==========================================================
# Konfiguration Anfang
# -----------------------------
LOG_DIR=/var/log/debmirror
mkdir -p "$LOG_DIR"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
LOG_MAIN="$LOG_DIR/${DATE}_debmirror-Status.log"
LOG_MIRROR="$LOG_DIR/${DATE}_debmirror-ubuntu.log"

# Lokales Spiegelverzeichnis
DEB_MIRROR_DIR=/mnt/linux-mirror/ubuntu

# Mirror-Server
# --host         = Remote Server (z.B. ftp.uni-stuttgart.de)
DEB_HOST=ftp.uni-stuttgart.de
# --root         = Root-Verzeichnis auf dem Server (z.B. :ubuntu/)
DEB_ROOT=:ubuntu/

# Distributionen (kommagetrennt!)
# --dist         = Distributionen (z.B. noble,noble-updates,...)
DEB_DIST="jammy,jammy-updates,jammy-backports,jammy-security,noble,noble-updates,noble-backports,noble-security"

# Sections
# --section      = Paketbereiche (main,restricted,universe,multiverse)
DEB_SECT="main,restricted,universe,multiverse"

# Architekturen
# --arch         = Architekturen (amd64, i386, arm64, all, source)
DEB_ARCH="amd64"

# nützliche debmirror Optionen – Übersicht
#
# --method       			= Protokoll (rsync, ftp, http)
# --i18n         			= Übersetzungen mitziehen (empfohlen)
# --nosource     			= Quellpakete weglassen
# --checksums    			= Prüfsummen prüfen
# --progress     			= Fortschritt anzeigen
# --diff         			= Pdiffs für schnellere Updates nutzen: 'use' aktiviert, 'none' deaktiviert
# --rsync-extra  			= Zusätzliche Daten bei rsync mitziehen: 'trace' (Meta-Dateien), 'pool' (alle Pakete), 'none' (keine Extras)
# --exclude      			= Dateien oder Muster vom Spiegel ausschließen (z.B. --exclude=*.deb)
# --ignore-missing-release 	= fehlende Release-Dateien ignorieren
# --ignore-small-errors 	= Kleinere Fehler ignorieren, der Spiegelprozess läuft weiter
# --no-check-gpg 			= Keine GPG-Signaturprüfung der Release-Dateien durchführen
DEB_OPT="-v --method=rsync --passive --progress --i18n --nosource --diff=use --rsync-extra=trace"

# Statusmeldungen im Log aktivieren (on/off)
MESG=on
# -----------------------------
# Konfiguration Ende
# ==========================================================

run_debmirror() {
    debmirror "$DEB_MIRROR_DIR" \
        --host="$DEB_HOST" \
        --root="$DEB_ROOT" \
        --arch="$DEB_ARCH" \
        --dist="$DEB_DIST" \
        --section="$DEB_SECT" \
        $DEB_OPT
}

# -----------------------------
# Mirror starten 
# -----------------------------
(
if [ "$MESG" = on ]; then
    echo ""
    echo "--- $(date) --- debmirror Aktualisierung gestartet..."
    echo ""
fi

(
    ATTEMPT=1
    MAX_ATTEMPTS=2
    STATUS=1

    while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
        if [ "$MESG" = on ]; then
            echo "$(date) Starte Versuch $ATTEMPT von $MAX_ATTEMPTS..."
        fi

        run_debmirror
        STATUS=$?

        if [ $STATUS -eq 0 ]; then
            if [ "$MESG" = on ]; then
                echo "$(date) Mirror erfolgreich aktualisiert."
                echo ""
            fi
            break
        else
            echo "$(date) FEHLER: debmirror wurde mit Status $STATUS beendet!"
            if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
                echo "Erneuter Versuch in 60 Sekunden..."
                sleep 60
            fi
        fi

        ATTEMPT=$((ATTEMPT+1))
    done

) 2>&1 | tee "$LOG_MIRROR" >/dev/null

if [ "$MESG" = on ]; then
    echo "--- $(date) --- debmirror Aktualisierung abgeschlossen."
    echo ""
fi

# Logs älter als 7 Tage löschen
find "$LOG_DIR" -type f -mtime +7 -name "*.log" -delete

) | tee "$LOG_MAIN" >/dev/null 2>&1 &

exit 0

Cron Täglich um 22 Uhr

0 22 * * * root /root/debmirror-ubuntu.sh