Rozwiązywanie problemów z APT w Ubuntu: naprawa uszkodzonych pakietów, blokad i błędów GPG
Napraw Ubuntu APT bez zgadywania.
Błędy APT są powszechne w długoterminowo eksploatowanych maszynach z Ubuntu i zwykle pojawiają się po aktualizacji wydania, zmianie repozytorium stron trzecich, usunięciu PPA, ręcznej instalacji pakietu .deb lub przerwanej instalacji pakietów.
Komunikat o błędzie może wyglądać dramatycznie, ale większość problemów z APT nie jest tajemnicza — są to problemy stanowe, w których widok APT dotyczący repozytoriów, wersji i zainstalowanych pakietów przestaje być spójny.

APT próbuje odpowiedzieć na cztery pytania:
- Które repozytoria są włączone?
- Które wersje pakietów są dostępne?
- Które pakiety są już zainstalowane?
- Które zmiany pakietów są dozwolone?
Gdy te odpowiedzi są sprzeczne, otrzymujesz pakiety zatrzymane (kept back), uszkodzone zależności, brakujące klucze publiczne, błędy PPA lub pakiety, które nie zostały zaktualizowane podczas aktualizacji systemu. Ten przewodnik przedstawia praktyczną sekwencję rozwiązywania problemów z APT w Ubuntu, przeznaczoną dla deweloperów, inżynierów DevOps i użytkowników Linuksa, którzy chcą naprawić system, nie kopiując ślepie losowych komend z wątków na forach. Połącz go z naszym skrótem klawiszowym do Ubuntu APT i dpkg dla codziennych komend instalacji i aktualizacji oraz przeglądaj szerszą kolekcję Narzędzi Deweloperskich w celu uzyskania powiązanych przepływów pracy Linuksa.
Krótka wersja
Jeśli Twój system jest tylko lekko uszkodzony, zacznij tutaj:
sudo apt update
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo apt update
sudo apt upgrade
Jeśli pakiety są zatrzymane (kept back):
apt list --upgradable
apt-mark showhold
sudo apt full-upgrade
Jeśli PPA lub repozytorium stron trzecich nie działa:
ls /etc/apt/sources.list.d/
sudo apt update
Przeczytaj linię nieudanej aktualizacji repozytorium, a następnie wyłącz lub napraw to repozytorium. Jeśli zobaczysz NO_PUBKEY, nie importuj ślepe losowych kluczy z serwera kluczy — znajdź oficjalne instrukcje repozytorium, zainstaluj klucz repozytorium w /etc/apt/keyrings i powiąż go z tym repozytorium za pomocą signed-by.
Przed naprawą cokolwiek: Przeczytaj najpierw błąd APT
Najpierw uruchom:
sudo apt update
Nie pomijaj tego. apt update odświeża metadane pakietów. Nie aktualizuje pakietów. Informuje Cię, czy Ubuntu może odczytać wszystkie skonfigurowane repozytoria i zweryfikować ich metadane.
Następnie sprawdź swoją wersję Ubuntu i kryptonim — przestarzała nazwa wydania w /etc/apt/sources.list.d/ jest częstą przyczyną błędów 404 i błędów pliku Release. Jeśli nie jesteś pewien, które wydanie posiadasz, zobacz jak sprawdzić wersję Ubuntu:
lsb_release -a
Lub:
cat /etc/os-release
Sprawdź również, co można zaktualizować:
apt list --upgradable
I sprawdź, czy jakiś pakiet jest zatrzymany (held):
apt-mark showhold
Daje Ci to pierwszy podział w drzewie decyzyjnym — zidentyfikowanie klasy awarii na początku ułatwia rozwiązywanie problemów, ponieważ każda klasa ma inną pierwszą naprawę:
- Problem repozytorium:
apt updatenie powiodło się. - Problem zależności:
apt updatedziała, ale instalacja lub aktualizacja nie powiodła się. - Problem z zatrzymanym pakietem: APT odmawia zmiany określonych pakietów.
- Problem z mieszanym źródłem: PPA, ręczny
.deblub stare repozytorium dostarcza niezgodne wersje. - Problem z przerwana instalacja:
dpkgrozpakował pakiety, które nigdy nie zostały skonfigurowane.
Powszechne typy awarii Ubuntu APT
Pakiety zatrzymane (Kept Back)
Pakiet zatrzymany (kept back) nie jest zawsze błędem; oznacza to, że APT zdecydował się nie zaktualizować pakietu przy użyciu bieżącej komendy. Dzieje się tak często, gdy aktualizacja wymaga instalacji nowych zależności, usunięcia starych pakietów lub zmiany pakietu w sposób, którego zwykłe apt upgrade nie wykona.
Sprawdź szczegóły:
apt list --upgradable
apt-cache policy nazwa-pakietu
Spróbuj pełnej aktualizacji dopiero po przeczytaniu, co APT zamierza zrobić:
sudo apt full-upgrade
full-upgrade jest dozwolony do instalowania nowych pakietów i usuwania pakietów, jeśli jest to potrzebne do zakończenia aktualizacji. Jest to przydatne, ale jest to również powód, dla którego należy przeczytać proponowane zmiany przed ich zaakceptowaniem. Na stacji roboczej full-upgrade jest zwykle w porządku po przeglądzie; na serwerze przeczytaj usuwania dwa razy.
Zatrzymane pakiety (Held Packages)
Zatrzymany pakiet (held) jest inny niż pakiet, który jest jedynie zatrzymany (kept back). Zatrzymanie (hold) jest wyraźną instrukcją, która zapobiega automatycznej instalacji, aktualizacji lub usunięciu tego pakietu przez APT. Zatrzymania są przydatne do przypinania jądra, bazy danych, sterownika lub wersji środowiska uruchomieniowego, a także łatwo o nich zapomnieć.
Wyświetl listę zatrzymanych pakietów:
apt-mark showhold
Zatrzymaj pakiet:
sudo apt-mark hold nazwa-pakietu
Usuń zatrzymanie:
sudo apt-mark unhold nazwa-pakietu
Jeśli zobaczysz błędy zależności dotyczące zatrzymanego pakietu, zdecyduj, czy zatrzymanie jest nadal zamierzone. Nie usuwaj zatrzymań automatycznie. Mogą one chronić usługę produkcyjną, sterownik lub wrażliwy na zgodność łańcuch narzędzi.
Uszkodzone zależności
Uszkodzone zależności oznaczają, że APT nie może znaleźć prawidłowego zestawu pakietów, co zwykle wskazuje na konflikt wersji, a nie na uszkodzone pobranie.
Powszechne przyczyny obejmują:
- Pakiet wymaga wersji, która nie jest dostępna.
- PPA dostarcza nowszą bibliotekę, niż oczekuje Ubuntu.
- Ręcznie zainstalowany
.debzależy od pakietów z innego wydania. - Instalacja pakietu została przerwana.
- Repozytorium dla niewłaściwego wydania Ubuntu jest włączone.
- Przypinanie pakietów lub zatrzymania zapobiegają potrzebnej zmianie wersji.
Zacznij od:
sudo dpkg --configure -a
sudo apt --fix-broken install
Następnie zbadaj pakiet:
apt-cache policy nazwa-pakietu
apt-cache depends nazwa-pakietu
apt-cache rdepends nazwa-pakietu
Następnie użyj tych komend do znalezienia konfliktu wersji pakietu, który blokuje APT, zamiast uruchamiać każdą komendę naprawczą w sekwencji.
Błędy klucza GPG i NO_PUBKEY
Błąd NO_PUBKEY oznacza, że APT otrzymał metadane repozytorium, ale nie może zweryfikować podpisu, ponieważ wymagany klucz publiczny jest brakujący — jest to problem zaufania, a nie tylko problem pobierania.
Typowy błąd wygląda tak:
Następujące podpisy nie mogły zostać zweryfikowane, ponieważ klucz publiczny nie jest dostępny: NO_PUBKEY ABCD1234EF567890
Stare instrukcje często używały apt-key add, ale unikaj tego przy nowej konfiguracji repozytorium. Nowoczesne systemy Ubuntu powinny używać repozytorium-specyficznego pierścienia kluczy (keyring) i signed-by.
Lepszy wzorzec wygląda tak:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://example.com/repo-key.gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/apt stable main" \
| sudo tee /etc/apt/sources.list.d/example.list
sudo apt update
Zamień adres URL i linię repozytorium na oficjalne instrukcje dostawcy.
Ważną częścią jest ta:
signed-by=/etc/apt/keyrings/example.gpg
Ta linia signed-by wiąże klucz z jednym repozytorium, co jest czystsze i bezpieczniejsze niż umieszczanie każdego klucza stron trzecich w globalnej przechowalni zaufania.
Błędy złego PPA lub pliku Release
Awaria PPA często wygląda tak:
Repozytorium nie ma pliku Release.
Lub:
404 Nie znaleziono
Powszechne przyczyny:
- PPA nie obsługuje Twojego wydania Ubuntu.
- Zaktualizowałeś Ubuntu, ale PPA nadal wskazuje na stary kryptonim.
- PPA został usunięty.
- Administrator przestał publikować pakiety.
- Dodałeś PPA przeznaczony dla innej wersji Ubuntu.
Sprawdź swój kryptonim:
. /etc/os-release
echo "$VERSION_CODENAME"
Wyświetl listę plików źródłowych stron trzecich:
ls /etc/apt/sources.list.d/
Zbadaj je:
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/
Wyłącz podejrzane źródło, zmieniając jego nazwę:
sudo mv /etc/apt/sources.list.d/example.list /etc/apt/sources.list.d/example.list.disabled
sudo apt update
Jeśli APT działa po wyłączeniu pliku, znalazłeś problemowe źródło i możesz je naprawić lub trwale usunąć.
Bezpieczny przepływ pracy rozwiązywania problemów z APT
Krok 1: Odśwież metadane
sudo apt update
Jeśli to nie powiodło się, napraw repozytoria przed próbą naprawy pakietów. APT nie może poprawnie rozwiązać zależności, jeśli jego indeks pakietów jest przestarzały lub niekompletny.
Szukaj linii zawierających:
NO_PUBKEY
Plik Release
404 Nie znaleziono
nie ma pliku Release
Repozytorium nie jest podpisane
Są to problemy repozytorium lub zaufania i powinny zostać naprawione przed próbą jakichkolwiek napraw pakietów.
Krok 2: Zakończ przerwana konfigurację pakietów
Jeśli instalacja pakietu została przerwana, dpkg może mieć rozpakowane pliki, ale nie skonfigurowany pakiet.
Uruchom:
sudo dpkg --configure -a
Jeśli to się powiedzie, kontynuuj:
sudo apt --fix-broken install
Jeśli to nie powiodło się, ostrożnie przeczytaj nazwę pakietu i błąd. Pakiet wymieniony na dole błędu jest często ważniejszy niż pakiet, którego instalację pierwotnie próbowałeś.
Krok 3: Poproś APT o naprawę zależności
sudo apt --fix-broken install
Ta komenda prosi APT o poprawienie problemów z zależnościami poprzez instalację brakujących zależności lub usunięcie pakietów, których nie można spełnić. Ostrożnie przeczytaj proponowane działanie, zwłaszcza wszelkie usuwania.
Bądź ostrożny, jeśli APT chce usunąć:
ubuntu-desktopubuntu-serverlinux-generic- pakiety menedżera wyświetlania
- pakiety sieciowe
- pakiety baz danych
- pakiety środowiska uruchomieniowego kontenerów
- pakiety środowiska pulpitu
Czasami usuwanie metapakietu jest bezszkodowe. Czasami jest to sygnał ostrzegawczy, że Twoje źródła pakietów są źle zmieszane. Nie akceptuj dużych usunięć, nie rozumiejąc ich.
Krok 4: Sprawdź zatrzymane pakiety
apt-mark showhold
Jeśli zatrzymany pakiet blokuje aktualizację, zbadaj go:
apt-cache policy nazwa-pakietu
Jeśli zatrzymanie nie jest już potrzebne:
sudo apt-mark unhold nazwa-pakietu
sudo apt update
sudo apt upgrade
Jeśli zatrzymanie jest zamierzone, nie walcz z APT — napraw repozytorium lub wybór pakietów wokół zatrzymania zamiast usuwania ochrony.
Krok 5: Zbadaj wersje pakietów
Dla pakietu z problemami z zależnościami:
apt-cache policy nazwa-pakietu
To pokazuje:
- Zainstalowaną wersję
- Wersję kandydata
- Dostępne wersje
- Które repozytorium dostarcza każdą wersję
apt-cache policy jest jedną z najprzydatniejszych komend debugowania APT, ponieważ pokazuje, skąd pochodzi każda dostępna wersja.
Przykład:
apt-cache policy docker-ce
Jeśli wersja kandydata pochodzi z nieoczekiwanego PPA lub starego repozytorium, znalazłeś prawdopodobną przyczynę konfliktu zależności.
Krok 6: Szukaj mieszanych repozytoriów
Wyświetl listę włączonych źródeł:
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/
Szukaj:
- Starych kryptonimów Ubuntu
- Repozytoriów Debian na Ubuntu
- PPA dla innego wydania Ubuntu
- Zduplikowanych repozytoriów dostawców
- Mieszania instrukcji Snap i APT dla tego samego narzędzia
- Starych plików
.listpozostałych po odinstalowaniu oprogramowania
Powszechnym antywzorcem jest instalacja narzędzia z repozytorium dostawcy, a następnie późniejsze dodanie PPA lub ręcznego .deb, które dostarcza nakładające się biblioteki. APT może obsłużyć wiele źródeł, ale nie może pogodzić sprzecznych intencji, chyba że sam zsynchronizujesz repozytoria.
Krok 7: Spróbuj symulowanej instalacji lub aktualizacji
Przed wprowadzeniem zmian, symuluj:
apt -s install nazwa-pakietu
Lub:
apt -s full-upgrade
Opcja -s symuluje operację. Jest przydatna, gdy chcesz zobaczyć, co APT by zrobił, bez zmiany systemu.
Naprawa zatrzymanych pakietów
Wyświetl listę zatrzymanych pakietów
apt-mark showhold
Jeśli nic nie jest wyświetlone, żadne pakiety nie są zatrzymane za pomocą apt-mark i możesz przejść do sprawdzenia zależności lub repozytoriów.
Zamierzona blokada pakietu
sudo apt-mark hold nazwa-pakietu
Dobre powody do zatrzymania pakietu:
- Wersja jądra jest znana jako działająca z Twoim sprzętem.
- Aktualizacja bazy danych wymaga planowania.
- Aktualizacja sterownika psuje Twoją kartę graficzną.
- Wersja środowiska uruchomieniowego musi pasować do produkcji.
- Pakiet dostawcy nie jest zgodny z najnowszą zależnością.
Złe powody do zatrzymania pakietu:
- Skopiowałeś komendę ze starego przewodnika.
- Zapomniałeś, dlaczego był zatrzymany.
- Unikasz błędu zależności, nie rozumiejąc go.
Usuń blokadę
sudo apt-mark unhold nazwa-pakietu
Następnie zaktualizuj i zaktualizuj:
sudo apt update
sudo apt upgrade
Jeśli pakiet nadal nie zostanie zaktualizowany, nie był to tylko problem blokady. Sprawdź politykę:
apt-cache policy nazwa-pakietu
Naprawa uszkodzonych zależności
Standardowa sekwencja naprawy
Użyj tej sekwencji, gdy instalacja lub aktualizacja pakietu nie powiodła się w połowie:
sudo apt update
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo apt upgrade
Ta kolejność ma znaczenie, ponieważ każdy krok przygotowuje grunt dla następnego: apt update odświeża metadane repozytorium, dpkg --configure -a kończy konfigurację rozpakowanych pakietów, apt --fix-broken install pozwala APT na pogodzenie brakujących lub sprzecznych zależności, a apt upgrade wznowi normalne aktualizacje pakietów.
Usuń źle zainstalowany lokalny pakiet
Jeśli problem zaczął się po instalacji pobranego .deb, zbadaj go:
dpkg -l | grep nazwa-pakietu
apt-cache policy nazwa-pakietu
Usuń go:
sudo apt remove nazwa-pakietu
Jeśli pliki konfiguracyjne również powodują problemy:
sudo apt purge nazwa-pakietu
Następnie napraw:
sudo apt --fix-broken install
Ponowna instalacja uszkodzonego pakietu
Jeśli pakiet jest zainstalowany, ale uszkodzony:
sudo apt install --reinstall nazwa-pakietu
Jest to przydatne, gdy pliki są brakujące lub uszkodzone, ale źródła pakietów są w inny sposób zdrowe i chcesz odświeżyć zainstalowane pliki bez zmiany wersji.
Naprawa problemów z PPA i repozytoriami stron trzecich
Znajdź PPA i repozytoria stron trzecich
ls /etc/apt/sources.list.d/
Wyświetl aktywne linie repozytorium:
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/
W nowszych systemach Ubuntu możesz również zobaczyć pliki .sources używające formatu deb822:
ls /etc/apt/sources.list.d/*.sources
Wyświetl je:
cat /etc/apt/sources.list.d/*.sources
Bezpieczne wyłączenie PPA
Zmień nazwę pliku źródłowego:
sudo mv /etc/apt/sources.list.d/example.list /etc/apt/sources.list.d/example.list.disabled
sudo apt update
Dla plików deb822:
sudo mv /etc/apt/sources.list.d/example.sources /etc/apt/sources.list.d/example.sources.disabled
sudo apt update
Zmiana nazwy pliku źródłowego jest odwracalna i bezpieczniejsza niż natychmiastowe usuwanie konfiguracji repozytorium, ponieważ możesz zmienić nazwę z powrotem, jeśli wyłączyłeś złe źródło.
Usuń pakiety z PPA
Wyłączenie PPA zatrzymuje przyszłe pobierania pakietów z niego. Nie automatycznie obniża wersji pakietów już zainstalowanych z tego PPA.
Jeśli PPA spowodował konflikty bibliotek, możesz musieć obniżyć wersje pakietów z powrotem do wersji Ubuntu.
Zainstaluj ppa-purge:
sudo apt install ppa-purge
Następnie oczyść PPA:
sudo ppa-purge ppa:owner/name
Używaj ppa-purge ostrożnie i czytaj proponowane zmiany przed zaakceptowaniem, ponieważ może usunąć lub obniżyć wersję kilku powiązanych pakietów.
Po aktualizacji wydania
Po aktualizacji Ubuntu, stare PPA są powszechnym źródłem błędów.
Sprawdź stare kryptonimy:
grep -R "jammy\|noble\|oracular\|plucky" /etc/apt/sources.list /etc/apt/sources.list.d/
Dostosuj kryptonimy do swojego rzeczywistego systemu. Na przykład, jeśli posiadasz Ubuntu 24.04, Twój kryptonim to noble. Jeśli źródło stron trzecich nadal wskazuje na starszy kryptonim, zweryfikuj, czy ten dostawca obsługuje Twoje bieżące wydanie Ubuntu. Jeśli konfigurujesz nowy komputer zamiast naprawiać aktualizację, nasz przewodnik instalacji Ubuntu 24.04 przechodzi przez dodawanie repozytoriów dostawców z signed-by od początku.
Nie edytuj tylko kryptonimu i nie licz na najlepsze — niektóre repozytoria nie publikują pakietów dla każdej wersji Ubuntu, więc najpierw zweryfikuj wsparcie dostawcy dla Twojego wydania.
Naprawa błędów GPG i NO_PUBKEY
Co oznacza NO_PUBKEY
Repozytoria APT publikują podpisane metadane, a Twój komputer potrzebuje odpowiadającego klucza publicznego, aby zweryfikować te metadane. Jeśli klucz jest brakujący, APT odmawia zaufania repozytorium, co jest zachowaniem, którego chcesz — nie wyłączaj sprawdzania podpisów, tylko po to, aby usunąć błąd.
Nowoczesny wzorzec pierścienia kluczy
Utwórz katalog pierścienia kluczy:
sudo install -d -m 0755 /etc/apt/keyrings
Pobierz i zdearmoruj klucz dostawcy:
curl -fsSL https://example.com/repository-key.gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
Ustaw uprawnienia do odczytu:
sudo chmod 0644 /etc/apt/keyrings/example.gpg
Dodaj repozytorium z signed-by:
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/linux/ubuntu noble stable" \
| sudo tee /etc/apt/sources.list.d/example.list
Następnie zaktualizuj:
sudo apt update
Zamień noble swoim kryptonimem Ubuntu, jeśli jest to potrzebne:
. /etc/os-release
echo "$VERSION_CODENAME"
Dlaczego apt-key to zły nawyk
Stare przewodniki często używają:
curl -fsSL https://example.com/key.gpg | sudo apt-key add -
Unikaj apt-key add dla nowych konfiguracji. Stary styl apt-key dodaje klucze do szerokiej strefy zaufania, co utrudnia rozumowanie, który klucz jest zaufany dla którego repozytorium, podczas gdy nowoczesny styl signed-by ogranicza klucz do konkretnego repozytorium i jest podstawową higieną łańcucha dostaw.
Znajdź dziedziczone zaufane klucze
Możesz nadal mieć stare klucze w:
/etc/apt/trusted.gpg
/etc/apt/trusted.gpg.d/
Wyświetl pliki:
ls -l /etc/apt/trusted.gpg.d/
Nie usuwaj kluczy losowo — najpierw mapuj każdy klucz do repozytorium, a następnie migruj jedno repozytorium na raz do /etc/apt/keyrings i signed-by.
Powszechne błędy GPG
Nie używaj losowych serwerów kluczy jako pierwszego wyboru przy naprawie błędów NO_PUBKEY.
Lepsza kolejność:
- Użyj oficjalnej dokumentacji instalacyjnej dostawcy.
- Pobierz klucz z oficjalnego adresu URL HTTPS dostawcy.
- Przechowuj go w
/etc/apt/keyrings. - Powiąż go za pomocą
signed-by. - Uruchom
sudo apt update.
Unikaj tych skrótu:
sudo apt update --allow-unauthenticated
sudo apt install --allow-unauthenticated nazwa-pakietu
Mogą one działać tymczasowo, ale usuwają weryfikację podpisu, która chroni Cię przed manipulowanymi metadanymi repozytorium.
Naprawa “Repozytorium nie jest podpisane”
Ten błąd zwykle oznacza jedną z tych rzeczy:
- Repozytorium nie publikuje podpisanych metadanych.
- Adres URL repozytorium jest błędny.
- Repozytorium już nie obsługuje Twojej wersji Ubuntu.
- Proxy lub lustro zwraca błędną zawartość.
- Używasz HTTP, gdzie dostawca oczekuje teraz HTTPS.
- Plik źródłowy ma błędną suitę lub komponent.
Znajdź nieudane źródło:
sudo apt update
APT wydrukuje adres URL. Następnie wyszukaj go:
grep -R "example.com" /etc/apt/sources.list /etc/apt/sources.list.d/
Wyłącz go tymczasowo:
sudo mv /etc/apt/sources.list.d/example.list /etc/apt/sources.list.d/example.list.disabled
sudo apt update
Jeśli APT znów działa po wyłączeniu pliku, zainstaluj ponownie to repozytorium z aktualnymi oficjalnymi instrukcjami dostawcy zamiast ponownie włączać starą konfigurację.
Naprawa ostrzeżeń o zduplikowanym repozytorium
APT może ostrzec, że cel jest skonfigurowany wielokrotnie.
Wyświetl listę odpowiadających wpisów:
grep -R "repo-url-or-domain" /etc/apt/sources.list /etc/apt/sources.list.d/
Zduplikowane repozytoria często pojawiają się po wielokrotnym uruchamianiu skryptów instalacyjnych dostawcy.
Zachowaj jeden plik źródłowy. Wyłącz pozostałe:
sudo mv /etc/apt/sources.list.d/duplicate.list /etc/apt/sources.list.d/duplicate.list.disabled
sudo apt update
Ostrzeżenia o duplikatach nie są zawsze śmiertelne, ale są znakiem beztroskiej konfiguracji, więc zachowaj jeden plik źródłowy i wyłącz duplikaty.
Naprawa pakietów z niewłaściwego wydania Ubuntu
Jednym z najgorszych problemów z APT jest mieszanie wydań Ubuntu — na przykład, maszyna z Ubuntu 24.04 nie powinna swobodnie pobierać pakietów z Ubuntu 22.04 lub Debian testing. Czasami działa to przez chwilę, ale ostatecznie graf zależności staje się zagadką, której APT nie może rozwiązać czysto.
Sprawdź swoje wydanie:
. /etc/os-release
echo "$VERSION_CODENAME"
Przeszukaj źródła:
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/
Szukaj obcych kryptonimów w włączonych źródłach, a następnie zbadaj affected package:
apt-cache policy nazwa-pakietu
Jeśli zainstalowana wersja pochodzi ze starego lub obcego repozytorium, wyłącz to repozytorium i obniż wersję lub zainstaluj ponownie affected package z repozytoriów Ubuntu.
Konserwatywna ścieżka naprawy to:
sudo apt update
sudo apt install --reinstall nazwa-pakietu
W przypadku głębszych konfliktów możesz musieć usunąć pakiet i zainstalować go ponownie ze właściwego źródła zamiast wymuszać aktualizację nad obcą wersją.
Czyszczenie pamięci podręcznej APT i nieużywanych pakietów
Czyszczenie pamięci podręcznej APT nie jest naprawą zależności samo w sobie, ale może pomóc po wielu nieudanych instalacjach, odzyskując miejsce na dysku i czyszcząc przestarzałe pliki pakietów.
Usuń pakiety, które zostały zainstalowane automatycznie i nie są już potrzebne:
sudo apt autoremove
Oczyść pobrane pliki pakietów:
sudo apt clean
Lub usuń tylko przestarzałe pliki pakietów:
sudo apt autoclean
Używaj autoremove ostrożnie na serwerach i pulpitach z ręcznie zainstalowanymi stacjami sterowników i czytaj listę usuwania przed zaakceptowaniem.
Praktyczne przepisy rozwiązywania problemów z APT
Przepis: Pakiet jest zatrzymany (Kept Back)
sudo apt update
apt list --upgradable
apt-mark showhold
sudo apt full-upgrade
Jeśli APT proponuje rozsądne zmiany po symulacji, zaakceptuj je. Jeśli proponuje duże usuwania, zatrzymaj się i zbadaj:
apt-cache policy nazwa-pakietu
Przepis: Zatrzymany pakiet blokuje aktualizację
apt-mark showhold
apt-cache policy nazwa-pakietu
sudo apt-mark unhold nazwa-pakietu
sudo apt upgrade
Odblokuj pakiet tylko wtedy, gdy blokada nie jest już zamierzona, ponieważ usunięcie blokady chroniącej oprogramowanie produkcyjne może spowodować łamiącą aktualizację.
Przepis: Przerwana instalacja
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo apt upgrade
Przepis: Błąd NO_PUBKEY
- Zidentyfikuj repozytorium z
sudo apt update. - Znajdź aktualne oficjalne instrukcje instalacji dostawcy.
- Zainstaluj klucz w
/etc/apt/keyrings. - Użyj
signed-byw pliku źródłowym. - Uruchom
sudo apt update.
Przykładowa struktura:
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://example.com/key.gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
sudo chmod 0644 /etc/apt/keyrings/example.gpg
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/ubuntu noble main" \
| sudo tee /etc/apt/sources.list.d/example.list
sudo apt update
Przepis: PPA nie ma pliku Release
sudo apt update
ls /etc/apt/sources.list.d/
grep -R "ppa.launchpadcontent.net\|launchpad" /etc/apt/sources.list.d/
Wyłącz PPA:
sudo mv /etc/apt/sources.list.d/example.list /etc/apt/sources.list.d/example.list.disabled
sudo apt update
Następnie zdecyduj, czy usunąć, zastąpić, czy oczyścić pakiety z tego PPA.
Przepis: Ręczny .deb zepsuł zależności
dpkg -l | grep nazwa-pakietu
apt-cache policy nazwa-pakietu
sudo apt remove nazwa-pakietu
sudo apt --fix-broken install
Jeśli nadal potrzebujesz oprogramowania, preferuj aktualne repozytorium APT dostawcy zamiast powtarzanych ręcznych instalacji .deb, które mają tendencję do gromadzenia konfliktów zależności z czasem.
Podstawowe komendy rozwiązywania problemów z APT
Repozytorium i metadane
sudo apt update
grep -R "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/
ls /etc/apt/sources.list.d/
Stan pakietu
apt list --installed
apt list --upgradable
apt-mark showhold
dpkg -l | grep nazwa-pakietu
Polityka pakietu i zależności
apt-cache policy nazwa-pakietu
apt-cache depends nazwa-pakietu
apt-cache rdepends nazwa-pakietu
Naprawa
sudo dpkg --configure -a
sudo apt --fix-broken install
sudo apt install --reinstall nazwa-pakietu
sudo apt full-upgrade
Czyszczenie
sudo apt autoremove
sudo apt autoclean
sudo apt clean
Symulacja
apt -s install nazwa-pakietu
apt -s full-upgrade
Czego nie robić
Nie usuwaj losowo /var/lib/dpkg
Jeśli zobaczysz poradę dotyczącą usuwania plików stanu dpkg, bądź sceptyczny. Baza danych dpkg jest rejestrze zainstalowanych pakietów, a usuwanie jej fragmentów może zamienić naprawialny problem z pakietem w projekt odzyskiwania całego systemu.
Nie wyłączaj weryfikacji podpisu
Unikaj:
--allow-unauthenticated
Jeśli repozytorium nie może zostać zweryfikowane, napraw klucz lub wyłącz repozytorium zamiast omijać uwierzytelnianie.
Nie mieszaj wydań Ubuntu beztrosko
Nie dodawaj repozytoriów dla innego wydania Ubuntu, chyba że rozumiesz przypinanie APT i konsekwencje zależności.
Dotyczy to szczególnie:
- środowisk pulpitu
- sterowników graficznych
- staków Python
- środowisk uruchomieniowych kontenerów
- pakietów Kubernetes
- pakietów baz danych
Nie traktuj PPA jako bezszkodowych
PPA są przydatne, ale nadal są repozytoriami pakietów, które mogą zastąpić biblioteki i pakiety systemowe — co może być dokładnie tym, czego chcesz, lub dokładnie powodem, dla którego Twoja następna aktualizacja się psuje. Preferuj PPA dla konkretnych aplikacji, a nie dla szerokich fundamentów systemowych, chyba że ufasz administratorowi i rozumiesz ścieżkę aktualizacji.
Drzewo decyzyjne rozwiązywania problemów z APT
Użyj tego modelu mentalnego:
Większość problemów z APT staje się zarządzalna, gdy przestaniesz traktować je jako jeden wielki błąd i zaczniesz oddzielać zdrowie repozytorium, stan pakietu, rozwiązywanie zależności i konfigurację zaufania — drzewo decyzyjne powyżej jest skrótem tej dyscypliny.
Rekomendowana baza dla maszyn deweloperskich
Dla czystej stacji roboczej dewelopera Ubuntu, preferuję tę bazę:
- Zachowaj repozytoria Ubuntu standardowe.
- Używaj repozytoriów APT dostawców tylko wtedy, gdy są oficjalne i utrzymywane.
- Używaj
/etc/apt/keyringsisigned-bydla repozytoriów stron trzecich. - Unikaj starych instrukcji
apt-key. - Unikaj mieszania PPA, które zastępują kluczowe biblioteki systemowe.
- Używaj kontenerów,
uv,pipx,asdf,miselub natywnych narzędzi językowych dla szybko rozwijających się zależności deweloperskich. - Zachowaj APT odpowiedzialnym za system operacyjny, sterowniki, usługi i stabilne narzędzia CLI.
Dla oprogramowania pulpitu, preferuj Flatpak lub Snap zamiast PPA, gdy sandomowany uniwersalny pakiet pasuje do Twoich potrzeb. APT jest doskonały, gdy zarządza systemem bazowym, ale staje się bolesny, gdy jest zmuszany do zachowywania się jak uniwersalny menedżer zależności deweloperskich dla szybko rozwijających się ekosystemów językowych.
Ostateczna lista kontrolna rozwiązywania problemów z APT
Gdy APT jest uszkodzony w Ubuntu, przejdź przez tę listę kontrolną:
[ ] Uruchom sudo apt update i przeczytaj pierwszy rzeczywisty błąd.
[ ] Sprawdź kryptonim Ubuntu z /etc/os-release.
[ ] Zakończ przerwane instalacje z dpkg --configure -a.
[ ] Napraw zależności z apt --fix-broken install.
[ ] Sprawdź zatrzymane pakiety z apt-mark showhold.
[ ] Zbadaj wersje pakietów z apt-cache policy.
[ ] Wyłącz uszkodzone PPA lub repozytoria stron trzecich.
[ ] Zastąp repozytoria w stylu apt-key pierścieniami kluczy signed-by.
[ ] Symuluj ryzykowne operacje z apt -s.
[ ] Przeczytaj usuwania przed zaakceptowaniem full-upgrade lub autoremove.
APT nie jest kruchy, ale jest rygorystyczny, a ten rygor jest cechą: zapobiega unsigned repozytoriom, niemożliwym zestawom zależności i przypadkowym zastąpieniom pakietów od cichej zmiany Twojego systemu. Spokojny sposób naprawy APT to zachowanie tego rygoru, znalezienie sprzecznego stanu i naprawa najmniejszej rzeczy, która jest naprawdę zła.