Pakete verwalten mit apt und dpkg unter Debian/Ubuntu
apt und dpkg sind die zentralen Werkzeuge zur Paketverwaltung unter Debian und Ubuntu. Diese Anleitung zeigt Installation, Updates, Suche, Paketquellen mit modernem GPG-Key-Management und Fehlerbehebung.

Pakete verwalten mit apt und dpkg ist eine Grundkompetenz für jeden Debian- und Ubuntu-Administrator. apt löst Abhängigkeiten automatisch auf und synchronisiert Paketlisten aus konfigurierten Quellen, während dpkg das darunterliegende Werkzeug für lokale .deb-Dateien und Status-Abfragen ist. Diese Anleitung führt dich durch alle wesentlichen Operationen: Updates einspielen, Pakete installieren und entfernen, Paketquellen mit modernem GPG-Key-Management hinzufügen, Pakete auf einer Version einfrieren und automatische Sicherheits-Updates mit unattended-upgrades einrichten.
Kurzfassung: sudo apt update && sudo apt upgrade hält das System aktuell. Neue Pakete installierst du mit sudo apt install PAKET, lokale .deb-Dateien mit sudo dpkg -i PAKET.deb gefolgt von sudo apt --fix-broken install. Neue Paketquellen richtest du mit signed-by=/etc/apt/keyrings/ ein – apt-key ist veraltet und nicht mehr verwenden.
Voraussetzungen
- Debian 11/12 oder Ubuntu 20.04/22.04/24.04 (als root oder mit sudo)
- Internetverbindung (für
apt updateund Paket-Downloads) - Sudo-Berechtigung oder direkter Root-Zugang
- Grundlegende Terminal-Kenntnisse
Schritt 1: Paketlisten aktualisieren und Updates einspielen
Bevor du Pakete installierst oder aktualisierst, holst du dir die aktuellen Metadaten von den konfigurierten Paketquellen. Ohne apt update arbeitet apt mit veralteten Paketlisten und findet neue Versionen nicht.
# Paketlisten von allen konfigurierten Quellen aktualisieren
sudo apt update
# Verfügbare Updates anzeigen (ohne Installation)
apt list --upgradable
# Sicherheits- und Stable-Updates installieren (entfernt keine Pakete)
sudo apt upgrade
# Major-Upgrade: Abhängigkeitskonflikte durch Paketentfernung auflösen
# Entspricht dem alten dist-upgrade – nur nach Prüfung einsetzen
sudo apt full-upgradeDer Unterschied zwischen upgrade und full-upgrade ist entscheidend: upgrade installiert nur Updates, bei denen keine Pakete entfernt werden müssen. full-upgrade (entspricht apt-get dist-upgrade) darf Pakete entfernen, wenn Abhängigkeitskonflikte es erfordern – das ist bei Major-Releases nötig, aber auf Produktionssystemen vorher zu prüfen.
Schritt 2: Pakete installieren, entfernen und bereinigen
Die häufigsten Operationen im Alltag: Pakete installieren, bei Bedarf inklusive einer bestimmten Version, und wieder entfernen – mit oder ohne Konfigurationsdateien.
# Paket installieren (mit automatischer Abhängigkeitsauflösung)
sudo apt install vim
# Mehrere Pakete auf einmal installieren
sudo apt install curl wget htop
# Bestimmte Version installieren (Version-Pinning)
sudo apt install nginx=1.24.0-1ubuntu1
# Installation simulieren ohne Änderungen (Folgen prüfen)
sudo apt install -s nginx
# Paket entfernen – Konfigurationsdateien bleiben erhalten
sudo apt remove nginx
# Paket vollständig entfernen inkl. Konfigurationsdateien
sudo apt purge nginx
# Nicht mehr benötigte Abhängigkeiten entfernen
sudo apt autoremove
# autoremove + Konfigurationsdateien der Waisen entfernen
sudo apt autoremove --purgeHinweis zu autoremove: Führe sudo apt autoremove immer erst ohne -y aus und lies die Liste der zu entfernenden Pakete – gelegentlich werden Pakete als „Waisen” markiert, die du noch brauchst. Erst nach Prüfung mit -y bestätigen.
Schritt 3: Pakete suchen und Informationen abfragen
Bevor du ein Paket installierst, kannst du es suchen und seine Details – Abhängigkeiten, Größe, Herkunft – anzeigen lassen.
# Paket-Suche nach Namen und Beschreibung (Regex möglich)
apt search vim
apt search '^vim' # nur Pakete, deren Name mit 'vim' beginnt
# Detailanzeige: Version, Größe, Abhängigkeiten, Homepage
apt show nginx
# Alle installierten Pakete auflisten
apt list --installed
# Installierte Pakete filtern
apt list --installed | grep php
# Alle verfügbaren Versionen eines Pakets in den Repos
apt list --all-versions nginx
# Pakete mit verfügbaren Updates anzeigen
apt list --upgradableSchritt 4: Lokale .deb-Dateien mit dpkg installieren
dpkg ist das Low-Level-Werkzeug unter apt. Du benötigst es direkt, wenn du .deb-Pakete installierst, die nicht in einem Repository verfügbar sind – zum Beispiel Software-Downloads vom Hersteller. dpkg löst dabei keine Abhängigkeiten automatisch auf; das erledigst du anschließend mit apt.
# Lokale .deb-Datei installieren
sudo dpkg -i /path/to/paket.deb
# Fehlende Abhängigkeiten nach dpkg -i automatisch nachinstallieren
sudo apt --fix-broken install
# Mehrere .deb-Dateien auf einmal installieren
sudo dpkg -i *.deb
# Status eines Pakets abfragen
dpkg -s nginx
# Alle installierten Pakete auflisten (mit Status-Codes)
dpkg -l
# Paketliste filtern (Wildcard)
dpkg -l 'nginx*'
# Alle Dateien eines installierten Pakets anzeigen
dpkg -L nginx
# Herkunfts-Paket einer Datei finden
dpkg -S /usr/bin/vim
# Paket entfernen (Konfigurationsdateien bleiben)
sudo dpkg -r nginx
# Paket vollständig entfernen inkl. Konfigurationsdateien
sudo dpkg -P nginx
# Alle unkonfigurierten Pakete zu Ende konfigurieren
# (nach abgebrochenem Install oder Systemfehler)
sudo dpkg --configure -aDie Statuscodes in dpkg -l bedeuten: ii = installiert und konfiguriert, rc = entfernt, aber Konfigurationsdateien noch vorhanden, un = entpackt, aber nicht konfiguriert. Mit dpkg -l | grep ^rc findest du Pakete, deren Konfigurationsdateien noch auf dem System liegen.
Schritt 5: Paketquellen und GPG-Keys modern einrichten
Externe Repositories – etwa für aktuelle Versionen von Node.js, Docker oder PostgreSQL – fügst du über /etc/apt/sources.list.d/ hinzu. Seit APT 2.4 (Ubuntu 22.04 / Debian 12) ist apt-key deprecated. Du verwendest stattdessen dedizierte GPG-Schlüsseldateien im Verzeichnis /etc/apt/keyrings/ mit dem signed-by-Parameter in der Quelldefinition.
# Verzeichnis für Schlüsseldateien anlegen (falls nicht vorhanden)
sudo install -m 0755 -d /etc/apt/keyrings
# ASCII-Armor-Schlüssel (.asc) in binäres .gpg-Format konvertieren
gpg --dearmor < KEYFILE.asc | sudo tee /etc/apt/keyrings/REPO.gpg > /dev/null
# Alternativ: Schlüssel direkt aus dem Web laden und konvertieren
curl -fsSL https://repo.example.com/gpg.key | \
gpg --dearmor | \
sudo tee /etc/apt/keyrings/example.gpg > /dev/null
# Berechtigungen setzen (lesbar für alle, nicht schreibbar)
sudo chmod a+r /etc/apt/keyrings/example.gpg
# Repository mit signed-by hinzufügen (Ubuntu 22.04 / jammy als Beispiel)
echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com jammy main' | \
sudo tee /etc/apt/sources.list.d/example.list
# Paketlisten nach dem Hinzufügen aktualisieren
sudo apt updateDie Schlüsseldatei in /etc/apt/keyrings/ gilt nur für das Repository, das sie über signed-by= referenziert. Das ist der entscheidende Unterschied zu /etc/apt/trusted.gpg.d/: Dort abgelegte Schlüssel vertrauen automatisch allen Repositories – das ist ein Sicherheitsrisiko. Die signed-by-Methode beschränkt das Vertrauen auf genau einen Anbieter.
# GPG-Key-Probleme beim apt update diagnostizieren
sudo apt update 2>&1 | grep 'NO_PUBKEY\|signed-by'
# Alte apt-key-Methode (NICHT mehr verwenden – nur zur Migration)
# sudo apt-key del KEYID -- deprecated, ersetzt durch keyringsFür die Datei /etc/apt/sources.list gilt: Bearbeite diese Datei lieber nicht direkt für neue Quellen. Lege stattdessen eigene .list-Dateien unter /etc/apt/sources.list.d/ an – das verhindert Konflikte bei Distribution-Upgrades.
Schritt 6: Pakete einfrieren (apt-mark hold) und Cache verwalten
Auf Produktionssystemen kommt es vor, dass du ein Paket auf einer bestimmten Version halten musst – zum Beispiel weil eine neue Kernel-Version ein Treiberproblem verursacht oder ein Anwendungs-Stack eine spezifische Bibliotheksversion erwartet.
# Paket gegen automatische Updates schützen
sudo apt-mark hold linux-image-generic
# Schutz aufheben
sudo apt-mark unhold linux-image-generic
# Alle gehaltenen Pakete auflisten
apt-mark showholdAchtung: Pakete auf Hold zu halten blockiert auch Sicherheits-Updates. Prüfe regelmäßig mit apt-mark showhold, ob noch Hold-Markierungen aktiv sind, und hebe sie auf, sobald das Problem behoben ist.
Der apt-Cache unter /var/cache/apt/archives/ kann nach längerer Betriebsdauer mehrere Gigabyte groß werden. Bereinige ihn gezielt:
# Kompletten Download-Cache löschen
sudo apt clean
# Nur veraltete Pakete aus dem Cache entfernen (neuere bleiben)
sudo apt autoclean
# Cache-Größe vor der Bereinigung prüfen
du -sh /var/cache/apt/archives/Schritt 7: Automatische Sicherheits-Updates mit unattended-upgrades
unattended-upgrades installiert Sicherheits-Updates automatisch im Hintergrund – ohne manuellen Eingriff. Auf Servern, die rund um die Uhr laufen, ist das die einfachste Methode, um kritische Patches zeitnah einzuspielen.
# Paket installieren
sudo apt install unattended-upgrades
# Dienst aktivieren und starten
sudo systemctl enable unattended-upgrades
sudo systemctl start unattended-upgrades
# Protokoll der automatischen Updates überwachen
tail -f /var/log/unattended-upgrades/unattended-upgrades.logDie wichtigsten Konfigurationsdateien:
/etc/apt/apt.conf.d/20auto-upgrades
– Steuert die Update-Häufigkeit (APT::Periodic::*)
/etc/apt/apt.conf.d/50unattended-upgrades
– Hauptkonfiguration: erlaubte Quellen, Auto-Reboot, E-Mail-Benachrichtigungen
/var/log/unattended-upgrades/
– Protokolldateien aller automatischen Update-LäufeAusschnitt aus /etc/apt/apt.conf.d/20auto-upgrades – die Standardwerte für tägliche Updates:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";Auto-Reboot: In /etc/apt/apt.conf.d/50unattended-upgrades kannst du automatische Neustarts nach Kernel-Updates konfigurieren. Setze den Zeitpunkt auf eine Wartungszeit (Off-Peak), damit laufende Dienste nicht unerwartet unterbrochen werden:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";Troubleshooting
- Broken Packages nach dpkg -i:
dpkginstalliert lokale.deb-Dateien ohne Abhängigkeitsauflösung. Fehlende Abhängigkeiten reparierst du sofort mitsudo apt --fix-broken install. - Abgebrochene Installation / unkonfigurierte Pakete: Wenn eine Installation unterbrochen wurde, konfiguriere alle ausstehenden Pakete nach:
sudo dpkg --configure -a && sudo apt --fix-broken install. - NO_PUBKEY-Fehler bei apt update: Ein GPG-Schlüssel fehlt oder ist falsch konfiguriert. Diagnose mit
sudo apt update 2>&1 | grep NO_PUBKEY. Schlüssel korrekt nach/etc/apt/keyrings/laden undsigned-by=in der Quelldatei setzen. - ASCII-armored Key (.asc) funktioniert nicht: APT erwartet binäres
.gpg-Format. Konvertieren mit:gpg --dearmor < KEYFILE.asc | sudo tee /etc/apt/keyrings/KEYFILE.gpg > /dev/null - apt upgrade entfernt Pakete nicht, die es sollte:
apt upgradeentfernt nie Pakete. Für Updates, die eine Paketentfernung erfordern, nutzesudo apt full-upgrade. - Paket auf Hold, aber Sicherheitslücke bekannt:
apt-mark showholdausführen, prüfen ob der Grund für den Hold noch besteht, und mitsudo apt-mark unhold PAKETaufheben. - apt update schlägt bei einem Mirror fehl: Netzwerkprobleme oder temporär nicht erreichbarer Mirror.
sudo apt updateerneut ausführen oder Mirror in/etc/apt/sources.listanpassen. - autoremove entfernt benötigtes Paket: Das Paket wurde als „automatisch installiert” markiert. Manuell als explizit installiert markieren mit
sudo apt-mark manual PAKET, dann taucht es nicht mehr in der autoremove-Liste auf.
Häufige Fragen
Was ist der Unterschied zwischen apt und apt-get?
apt ist die benutzerfreundliche Frontend-Schnittstelle mit Fortschrittsbalken und kompakter Ausgabe, gedacht für die interaktive Nutzung am Terminal. apt-get hat eine stabile, skriptfreundliche Ausgabe ohne Formatierungen. Für Automations-Skripte und CI/CD-Pipelines bevorzuge apt-get, da dessen Ausgabeformat garantiert stabil bleibt.
Wann nehme ich remove und wann purge?
apt remove entfernt die Binärdateien des Pakets, lässt aber Konfigurationsdateien auf dem System. Das ist nützlich, wenn du ein Paket vorübergehend deinstallierst, aber die Konfiguration behalten willst. apt purge löscht zusätzlich alle Konfigurationsdateien – sinnvoll bei einer vollständigen Neuinstallation mit sauberer Konfiguration. Mit dpkg -l | grep ^rc siehst du Pakete, deren Konfiguration nach einem remove noch vorhanden ist.
Warum sollte ich apt-key nicht mehr verwenden?
apt-key ist seit APT 2.4 (Ubuntu 22.04, Debian 12) deprecated und wird in zukünftigen Versionen entfernt. Das Problem: Ein mit apt-key hinzugefügter GPG-Schlüssel gilt für alle konfigurierten Repositories – ein kompromittierter Schlüssel könnte Pakete aus beliebigen Quellen signieren. Die moderne signed-by-Methode mit Schlüsseln in /etc/apt/keyrings/ beschränkt das Vertrauen auf genau das Repository, für das der Schlüssel gedacht ist.
Wie installiere ich eine bestimmte Paketversion und verhindere ein ungewolltes Upgrade?
Installiere die gewünschte Version mit sudo apt install PAKET=VERSION. Welche Versionen verfügbar sind, zeigt apt list --all-versions PAKET. Damit die Version beim nächsten apt upgrade nicht überschrieben wird, frierst du das Paket mit sudo apt-mark hold PAKET ein. Mit apt-mark showhold behältst du den Überblick über alle gehaltenen Pakete.
Was passiert, wenn dpkg -i wegen fehlender Abhängigkeiten scheitert?
dpkg installiert das Paket, hinterlässt es aber im Zustand „installiert, aber unkonfiguriert” wenn Abhängigkeiten fehlen. Das System meldet dann broken packages. Führe unmittelbar danach sudo apt --fix-broken install aus: apt lädt die fehlenden Abhängigkeiten nach und schließt die Konfiguration ab. Falls das nicht hilft, konfiguriere alle ausstehenden Pakete mit sudo dpkg --configure -a.
Wie richte ich automatische Sicherheits-Updates für einen Server ein?
Installiere unattended-upgrades mit sudo apt install unattended-upgrades und aktiviere den Dienst mit sudo systemctl enable --now unattended-upgrades. Die Konfiguration in /etc/apt/apt.conf.d/50unattended-upgrades legt fest, welche Paketquellen automatisch aktualisiert werden. Für Systeme mit Kernel-Updates empfiehlt sich die Konfiguration eines Wartungsfensters für automatische Neustarts, damit der Zeitpunkt planbar bleibt. Protokolle findest du unter /var/log/unattended-upgrades/.
Fazit
apt und dpkg decken gemeinsam die gesamte Paketverwaltung unter Debian und Ubuntu ab. Mit apt update && apt upgrade hältst du das System aktuell, full-upgrade setzt du für größere Versionssprünge ein. Lokale .deb-Pakete installierst du mit dpkg -i gefolgt von apt --fix-broken install. Neue Paketquellen richtest du ausschließlich mit dem modernen signed-by-Verfahren ein – apt-key ist abgekündigt und sicherheitsgefährlich. Mit apt-mark hold frierst du kritische Pakete ein, unattended-upgrades sorgt für automatische Sicherheits-Updates ohne manuelle Eingriffe. Wer diese Werkzeuge beherrscht, hat eine solide Grundlage für den sicheren Betrieb von Debian- und Ubuntu-Servern.
Weiterführende Anleitungen und Quellen
- systemd-Service erstellen und verwalten – Dienste nach der Paketinstallation als systemd-Unit konfigurieren und automatisch starten
- Benutzer, Gruppen, Rechte: chmod, chown und sudo – Dateiberechtigungen für GPG-Schlüsseldateien und Konfigurationsdateien korrekt setzen
- Logs lesen mit journalctl und /var/log – unattended-upgrades-Protokolle und dpkg-Logs auswerten
- Let's Encrypt mit certbot – TLS-Zertifikate einrichten – certbot via apt oder snap installieren und Paketquellen korrekt einbinden
Quellen: Ubuntu Manpage: apt (manpages.ubuntu.com), Debian FAQ: Chapter 8 – Package management tools (debian.org), dpkg manual page (man7.org), DigitalOcean Tutorial: How to Handle Apt Key and Add Repository Deprecation Using GPG (digitalocean.com).