Rozwiązywanie problemów z APT w Ubuntu: naprawa uszkodzonych pakietów, blokad i błędów GPG

Napraw Ubuntu APT bez zgadywania.

Page content

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.

laptop ubuntu apt packages

APT próbuje odpowiedzieć na cztery pytania:

  1. Które repozytoria są włączone?
  2. Które wersje pakietów są dostępne?
  3. Które pakiety są już zainstalowane?
  4. 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 update nie powiodło się.
  • Problem zależności: apt update dział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 .deb lub stare repozytorium dostarcza niezgodne wersje.
  • Problem z przerwana instalacja: dpkg rozpakował 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 .deb zależ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-desktop
  • ubuntu-server
  • linux-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 .list pozostał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ść:

  1. Użyj oficjalnej dokumentacji instalacyjnej dostawcy.
  2. Pobierz klucz z oficjalnego adresu URL HTTPS dostawcy.
  3. Przechowuj go w /etc/apt/keyrings.
  4. Powiąż go za pomocą signed-by.
  5. 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

  1. Zidentyfikuj repozytorium z sudo apt update.
  2. Znajdź aktualne oficjalne instrukcje instalacji dostawcy.
  3. Zainstaluj klucz w /etc/apt/keyrings.
  4. Użyj signed-by w pliku źródłowym.
  5. 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:

flowchart TD A["Czy sudo apt update nie powiodło się?"] -->|tak| B["Napraw repozytoria, klucze GPG, PPA, sieć lub pliki release"] A -->|nie| C["Czy instalacja lub aktualizacja została przerwana?"] C -->|tak| D["Uruchom dpkg --configure -a, a następnie apt --fix-broken install"] C -->|nie| E["Czy pakiety są zatrzymane (held)?"] E -->|tak| F["Zbadaj apt-mark showhold i zdecyduj, czy odblokować"] E -->|nie| G["Czy pakiety są zatrzymane (kept back)?"] G -->|tak| H["Zbadaj symulację apt full-upgrade i politykę pakietu"] G -->|nie| I["Czy zaangażowane jest źródło stron trzecich?"] I -->|tak| J["Zbadaj apt-cache policy i pliki źródłowe"] I -->|nie| K["Zbadaj konkretny błąd zależności pakietu"]

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/keyrings i signed-by dla 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, mise lub 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.

Subskrybuj

Otrzymuj nowe wpisy o systemach, infrastrukturze i inżynierii AI.