15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți
08.10.2024

Cum să Remediați Erorile de Actualizare și Upgrade Ubuntu: Un Ghid Complet de Depanare

Sistemul de gestionare a pachetelor APT al Ubuntu este unul dintre cele mai fiabile din ecosistemul Linux, dar nu este imun la erori. Când `apt-get upgrade`, `apt-get dist-upgrade` sau `do-release-upgrade` generează o eroare, cauza principală se încadrează aproape întotdeauna în una dintre cele cinci categorii: un index de pachete învechit sau corupt, lanțuri de dependențe nerezolvate, un fișier de blocare învechit lăsat de un proces care s-a blocat, spațiu insuficient pe partiția rădăcină sau un pachet parțial configurat lăsat într-o stare defectă de o tranzacție anterioară întreruptă.

Acest ghid oferă un flux de lucru de diagnosticare sistematic, la nivel de inginer, pentru a identifica și rezolva permanent fiecare clasă majoră de erori de actualizare Ubuntu — inclusiv cazurile limită pe care tutorialele generice le omit în mod obișnuit.

Înțelegerea a ceea ce se întâmplă de fapt în timpul unei actualizări Ubuntu

Înainte de a rula comenzi orbește, merită să înțelegeți mecanica internă. Când invocați `sudo apt-get upgrade`, APT efectuează o trecere de rezolvare a dependențelor față de memoria cache locală a pachetelor din `/var/lib/apt/lists/`. Dacă acea memorie cache este învechită, malformată sau nesincronizată cu depozitele configurate din `/etc/apt/sources.list` și `/etc/apt/sources.list.d/`, rezolvatorul fie eșuează complet, fie propune un set inconsistent de pachete.

Stratul dpkg de sub APT își menține propria bază de date de stare la `/var/lib/dpkg/`. Dacă o instalare sau actualizare anterioară a fost întreruptă — de o pană de curent, o deconectare a sesiunii SSH sau un `Ctrl+C` manual — dpkg poate lăsa unul sau mai multe pachete într-o stare `half-installed` sau `triggers-awaiting`. APT nu poate continua până când starea dpkg nu este curată.

Cele cinci cauze principale dintr-o privire

Cauza principalăSimptomRemediere principală
Index de pachete învechit„404 Not Found” pentru URL-uri de pachete`apt-get update`
Dependențe defecte/nesatisfăcute„Unmet dependencies” sau „held broken packages”`apt-get install -f`
Fișier de blocare învechit„Could not get lock /var/lib/dpkg/lock”Eliminați manual fișierele de blocare
Spațiu insuficient pe disc„No space left on device”Eliberați spațiu pe partiția `/`
Pachet parțial configurat„dpkg was interrupted”`dpkg –configure -a`

Soluția 1: Reîmprospătați indexul de pachete și rulați o actualizare completă

Acesta este primul pas corect în orice flux de lucru de diagnosticare. Rulați întotdeauna `update` înainte de `upgrade` — acestea nu sunt interschimbabile.

“`bash

sudo apt-get update

sudo apt-get upgrade

“`

Ce face de fapt fiecare comandă:

  • `apt-get update` — Descarcă metadate proaspete ale pachetelor din fiecare depozit definit în `sources.list`. Nu instalează nimic. Rescrie fișierele de index din `/var/lib/apt/lists/`.
  • `apt-get upgrade` — Rezolvă și instalează versiuni mai noi ale tuturor pachetelor instalate în prezent. Nu va elimina niciodată un pachet instalat sau nu va instala unul nou pentru a satisface o dependență — aceasta este o constrângere de siguranță deliberată.

Dacă `apt-get upgrade` este reținut de pachete care necesită dependențe noi sau eliminarea celor conflictuale, escaladați la:

“`bash

sudo apt-get dist-upgrade

“`

`dist-upgrade` utilizează un rezolvator mai agresiv care are permisiunea de a instala pachete noi și de a le elimina pe cele obsolete pentru a satisface graficul de dependențe. Este instrumentul corect pentru actualizările de versiune punctuală în cadrul aceleiași versiuni Ubuntu (de ex., de la 22.04.1 la 22.04.4).

Nuanță critică: Pe serverele de producție, revizuiți întotdeauna planul `dist-upgrade` înainte de a confirma. Rulați mai întâi `apt-get dist-upgrade –dry-run` pentru a vedea exact ce va fi instalat, actualizat sau eliminat fără a atinge sistemul.

Soluția 2: Remediați dependențele defecte și nesatisfăcute

O stare de dependență defectă este unul dintre cele mai frecvente motive pentru care actualizările eșuează la mijlocul procesului. Remedierea canonică este:

“`bash

sudo apt-get install -f

“`

Indicatorul `-f` (`–fix-broken`) instruiește APT să încerce să corecteze un grafic de dependențe defect prin descărcarea și instalarea dependențelor lipsă sau prin eliminarea pachetelor care nu pot fi satisfăcute. După finalizare, rulați din nou actualizarea.

Când `-f` nu este suficient: Dacă ați instalat manual pachete `.deb` din afara depozitelor oficiale (o practică obișnuită la instalarea software-ului terț), acele pachete pot fixa dependențele la versiuni specifice care intră în conflict cu versiunile din depozit. Identificați-le cu:

“`bash

apt-cache policy <package_name>

dpkg -l | grep "^ii" | grep -v "^ii lib"

“`

Verificați versiunile „Installed” față de „Candidate”. Un pachet fixat va afișa un candidat mai mic decât ceea ce oferă depozitul sau niciun candidat. Poate fi necesar să eliminați pachetul conflictual, să finalizați actualizarea și apoi să reinstalați o versiune compatibilă.

Soluția 3: Reconfigurați pachetele parțial instalate cu dpkg

Dacă o actualizare anterioară a fost întreruptă, baza de date de stare a dpkg va conține pachete marcate ca `half-configured` sau `half-installed`. APT refuză să continue până când acestea sunt rezolvate.

“`bash

sudo dpkg –configure -a

“`

Indicatorul `-a` înseamnă „all” — dpkg va încerca să ruleze scripturile de configurare post-instalare (`postinst`) pentru fiecare pachet lăsat într-o stare incompletă. Aceasta rezolvă adesea erori precum:

“`

dpkg was interrupted, you must manually run 'sudo dpkg –configure -a' to correct the problem.

“`

Urmați imediat cu o actualizare proaspătă a indexului și o nouă încercare de actualizare:

“`bash

sudo apt-get update && sudo apt-get upgrade

“`

Caz limită — bază de date dpkg coruptă: În scenarii rare, baza de date dpkg în sine devine coruptă (cel mai frecvent după o defecțiune a discului sau o eroare de sistem de fișiere). Simptomele includ `dpkg: error: parsing file '/var/lib/dpkg/status'`. Procedura de recuperare implică restaurarea din backup-ul pe care dpkg îl menține automat la `/var/backups/dpkg.status*`. Copiați cel mai recent backup peste fișierul de stare corupt:

“`bash

sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status

sudo dpkg –configure -a

“`

Soluția 4: Eliminați fișierele de blocare învechite

APT și dpkg utilizează fișiere de blocare pentru a preveni ca operațiunile concurente de pachete să corupă baza de date. Când un proces care deține o blocare se blochează sau este oprit, fișierul de blocare rămâne pe disc. Orice invocare ulterioară a APT va eșua cu:

“`

E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarily unavailable)

“`

Înainte de a elimina fișierele de blocare, verificați întotdeauna că niciun proces legitim nu le deține:

“`bash

sudo lsof /var/lib/dpkg/lock-frontend

sudo lsof /var/lib/dpkg/lock

sudo lsof /var/cache/apt/archives/lock

“`

Dacă `lsof` nu returnează niciun rezultat, blocarea este învechită și poate fi eliminată în siguranță:

“`bash

sudo rm /var/lib/dpkg/lock-frontend

sudo rm /var/lib/dpkg/lock

sudo rm /var/cache/apt/archives/lock

sudo dpkg –configure -a

sudo apt-get update

“`

Avertisment: Nu eliminați niciodată fișierele de blocare în timp ce un alt proces `apt`, `apt-get`, `dpkg` sau `unattended-upgrades` rulează activ. Procedând astfel pe un proces activ va corupe baza de date a pachetelor. Dacă `lsof` afișează un PID activ, așteptați finalizarea procesului sau investigați de ce este blocat înainte de a lua măsuri.

Soluția 5: Eliberați spațiu pe disc pe partiția rădăcină

Actualizările Ubuntu — în special actualizările majore de versiune — necesită spațiu liber substanțial pe partiția rădăcină. Un punct de eșec frecvent este umplerea `/boot` cu imagini vechi de kernel, ceea ce blochează complet instalarea noilor kernel-uri.

Verificați utilizarea curentă a discului:

“`bash

df -h

“`

Verificați specific ce consumă spațiu în `/boot`:

“`bash

du -sh /boot/*

ls /boot/vmlinuz-*

“`

Procedura sistematică de recuperare a spațiului:

“`bash

Remove packages installed as dependencies that are no longer needed

sudo apt-get autoremove –purge

Remove cached .deb files from the local package archive

sudo apt-get clean

Remove old kernel images (keeps the two most recent)

sudo apt-get autoremove –purge

“`

Dacă `/boot` este în continuare plin după `autoremove`, identificați și eliminați manual kernel-urile vechi. Mai întâi, găsiți kernel-ul care rulează în prezent pentru a nu-l elimina:

“`bash

uname -r

“`

Apoi listați kernel-urile instalate și eliminați-le explicit pe cele vechi:

“`bash

dpkg -l 'linux-image-*' | grep '^ii'

sudo apt-get purge linux-image-X.X.X-XX-generic

“`

Înlocuiți șirul de versiune cu o versiune mai veche de kernel — niciodată cea returnată de `uname -r`.

Dacă rulați un mediu de VPS Hosting cu o dimensiune fixă a partiției rădăcină, acest scenariu este deosebit de frecvent. Provizionarea VPS-ului cu o alocare adecvată de disc de la început — sau utilizarea unei partiții `/boot` separate — previne complet această clasă de erori.

Soluția 6: Curățați pachetele redundante și memoria cache APT

Memoria cache acumulată a pachetelor și pachetele orfane degradează atât performanța sistemului, cât și fiabilitatea actualizărilor.

“`bash

sudo apt-get autoremove

sudo apt-get autoclean

sudo apt-get clean

“`

Distincția dintre `autoclean` și `clean`:

  • `autoclean` elimină fișierele `.deb` din cache doar pentru pachetele care nu mai pot fi descărcate din depozitele configurate (adică sunt obsolete). Păstrează fișierele din cache pentru pachetele disponibile în prezent.
  • `clean` elimină toate fișierele `.deb` din cache necondiționat, indiferent dacă sunt încă disponibile. Utilizați aceasta când trebuie să recuperați cantitatea maximă de spațiu pe disc.

Pe serverele unde spațiul pe disc este o resursă gestionată — cum ar fi Serverele Dedicate care rulează mai multe servicii — automatizarea curățării periodice a cache-ului printr-un cron job sau un timer systemd este o practică operațională solidă.

Soluția 7: Rezolvați manual conflictele specifice de pachete

Când `apt-get upgrade` raportează conflicte specifice de pachete mai degrabă decât o eroare generală de dependențe, este necesară o intervenție țintită.

“`bash

sudo apt-get upgrade –fix-missing

“`

Acest indicator îi spune APT să omită pachetele care nu pot fi recuperate (de ex., din cauza unui mirror temporar indisponibil) și să actualizeze tot restul. Este util când un singur pachet indisponibil blochează întreaga actualizare.

Pentru a elimina și reinstala un pachet conflictual specific:

“`bash

sudo apt-get remove –purge <package_name>

sudo apt-get install <package_name>

“`

Utilizarea `–purge` cu `remove` șterge atât binarul pachetului, cât și fișierele sale de configurare, ceea ce este important când un fișier de configurare corupt este sursa reală a conflictului.

Identificarea sursei exacte a conflictului: Când APT raportează un conflict, mesajul de eroare numește de obicei pachetele implicate. Pentru o analiză mai aprofundată:

“`bash

apt-cache show <package_name>

apt-cache depends <package_name>

apt-cache rdepends <package_name>

“`

`rdepends` (dependențe inverse) vă arată ce alte pachete instalate depind de pachetul în cauză — informații critice înainte de a elimina orice.

Soluția 8: Efectuați o actualizare majoră de versiune cu do-release-upgrade

Actualizarea între versiunile Ubuntu LTS (de ex., de la 20.04 Focal la 22.04 Jammy sau de la 22.04 la 24.04 Noble) necesită un instrument dedicat. Utilizarea `apt-get dist-upgrade` singur pentru o actualizare majoră de versiune nu este acceptată și va produce un sistem inconsistent.

Procedura corectă:

“`bash

sudo apt-get update

sudo apt-get dist-upgrade

sudo apt-get autoremove

sudo do-release-upgrade

“`

De ce contează `dist-upgrade` pre-actualizare: `do-release-upgrade` verifică că sistemul dvs. curent este complet actualizat înainte de a iniția tranziția de versiune. Dacă aveți pachete reținute sau dependențe nerezolvate, va refuza să continue. Rularea `dist-upgrade` mai întâi asigură o bază de pornire curată.

Considerații specifice serverului pentru `do-release-upgrade`:

  • Pe serverele headless accesate prin SSH, rulați întotdeauna `do-release-upgrade` într-o sesiune `tmux` sau `screen`. Dacă conexiunea SSH se întrerupe în mijlocul actualizării, procesul continuă în fundal în loc să fie oprit, ceea ce ar lăsa sistemul într-o stare intermediară defectă.
  • Utilizați indicatorul `-d` doar când actualizați la o versiune de dezvoltare (nu încă stabilă LTS). Pentru sistemele de producție, nu utilizați niciodată `-d`.
  • Instrumentul vă va solicita să revizuiți modificările aduse fișierelor de configurare modificate față de valorile implicite. Citiți cu atenție aceste solicitări — acceptarea orbește a versiunii maintainer-ului poate suprascrie configurațiile personalizate ale serverului.

“`bash

Start a persistent session before upgrading

tmux new -s upgrade

sudo do-release-upgrade

“`

Dacă gestionați mai multe servere Ubuntu — de exemplu, o flotă de instanțe VPS cu cPanel — testați mai întâi calea de actualizare pe un nod non-producție. cPanel și panouri de control similare au adesea ferestre specifice de suport pentru versiunile Ubuntu care rămân în urmă față de ciclul oficial de lansare.

Soluția 9: Remediați problemele cu depozitele terțe

O cauză frecvent trecută cu vederea a erorilor de actualizare este un PPA (Personal Package Archive) sau depozit terț defect sau incompatibil. Când un PPA este adăugat pentru o versiune Ubuntu și actualizați la următoarea, PPA-ul poate să nu aibă pachete pentru noul nume de cod al versiunii, determinând `apt-get update` să genereze erori precum:

“`

E: The repository 'http://ppa.launchpad.net/…' does not have a Release file.

“`

Listați toate depozitele configurate:

“`bash

ls /etc/apt/sources.list.d/

cat /etc/apt/sources.list

“`

Dezactivați temporar PPA-urile problematice prin comentarea sau eliminarea fișierelor lor `.list` din `/etc/apt/sources.list.d/`, finalizați actualizarea sistemului, apoi reactivați-le sau înlocuiți-le cu versiuni compatibile cu noua versiune.

“`bash

sudo add-apt-repository –remove ppa:<ppa_name>/<ppa_name>

“`

Soluția 10: Reporniți pentru a elimina interferența la nivel de proces

Anumite eșecuri de actualizare sunt cauzate de starea din memorie mai degrabă decât de problemele la nivel de disc — de exemplu, un serviciu care rulează și deține un handle de fișier pe o bibliotecă pe care APT trebuie să o înlocuiască sau un modul de kernel care intră în conflict cu o versiune nou instalată.

“`bash

sudo reboot

“`

După repornire, rulați secvența completă de actualizare dintr-o stare curată:

“`bash

sudo apt-get update && sudo apt-get upgrade

“`

Pe serverele la distanță unde o repornire prezintă riscuri operaționale, utilizați `needrestart` pentru a identifica ce servicii trebuie repornite fără o repornire completă a sistemului:

“`bash

sudo apt-get install needrestart

sudo needrestart

“`

`needrestart` inspectează procesele care rulează și le identifică pe cele care utilizează biblioteci partajate obsolete, permițându-vă să reporniți doar serviciile afectate în loc de întregul sistem.

Prevenirea erorilor de actualizare Ubuntu: Bune practici operaționale

Depanarea reactivă este necesară, dar igiena proactivă a sistemului elimină majoritatea acestor erori înainte să apară.

Listă de verificare pentru întreținerea serverelor Ubuntu:

  • Rulați `sudo apt-get update && sudo apt-get upgrade` în mod regulat — săptămânal cel puțin pentru sistemele de producție.
  • Monitorizați spațiul pe disc pe `/`, `/boot` și `/var` cu praguri de alertare (85% utilizare este un declanșator rezonabil).
  • Auditați PPA-urile terțe înainte de fiecare ciclu major de actualizare.
  • Rulați întotdeauna actualizările majore în interiorul `tmux` sau `screen` pe sistemele la distanță.
  • Păstrați un snapshot sau backup înainte de orice operațiune `do-release-upgrade`. Pe un Server Dedicat sau VPS, aceasta înseamnă realizarea unei imagini complete a discului sau a unui snapshot al sistemului de fișiere înainte de inițierea actualizării.
  • Testați procedurile de actualizare într-un mediu de staging înainte de a le aplica în producție.
  • Utilizați `unattended-upgrades` doar pentru patch-uri de securitate, nu pentru actualizări complete de pachete, pentru a evita modificări neașteptate ale dependențelor pe sistemele de producție.

Pentru echipele care gestionează infrastructură web — inclusiv medii de Găzduire Web Partajată sau servere de aplicații multi-tenant — stabilirea unui runbook documentat de actualizare care include pași de verificare pre-actualizare, proceduri de rollback și teste de validare post-actualizare este o practică operațională esențială.

Matrice de decizie: Ce remediere să aplicați mai întâi

Mesaj de eroarePrima acțiuneA doua acțiune
„Could not get lock”Verificați `lsof`, eliminați fișierele de blocare învechite`dpkg –configure -a`
„Unmet dependencies”`apt-get install -f``dpkg –configure -a`
„No space left on device”`apt-get autoremove –purge && apt-get clean`Eliminați manual kernel-urile vechi
„dpkg was interrupted”`dpkg –configure -a``apt-get update && apt-get upgrade`
„404 Not Found” pentru pachete`apt-get update` (verificați disponibilitatea mirror-ului)Dezactivați PPA-urile defecte
„held broken packages”`apt-get dist-upgrade –dry-run`Eliminați/reinstalați pachetul conflictual
Deconectare SSH în timpul actualizăriiReconectați-vă și atașați-vă la sesiunea `tmux`/`screen``dpkg –configure -a` dacă sesiunea a fost pierdută

Întrebări frecvente

De ce `apt-get upgrade` lasă unele pachete ca „held back”?

Pachetele sunt reținute când actualizarea lor ar necesita instalarea de pachete noi sau eliminarea celor existente — acțiuni pe care `apt-get upgrade` nu are permisiunea să le efectueze prin design. Utilizați `apt-get dist-upgrade` pentru a rezolva pachetele reținute, dar revizuiți întotdeauna modificările propuse cu `–dry-run` mai întâi pe sistemele de producție.

Este sigur să eliminați fișierele de blocare din `/var/lib/dpkg/`?

Doar dacă niciun proces APT sau dpkg nu rulează activ. Verificați cu `sudo lsof /var/lib/dpkg/lock-frontend` înainte de eliminare. Dacă un proces activ deține blocarea și eliminați fișierul, veți corupe baza de date a pachetelor, care necesită recuperare manuală din backup-ul de stare dpkg.

Care este diferența dintre `apt-get upgrade` și `apt-get dist-upgrade`?

`apt-get upgrade` nu elimină niciodată pachetele instalate sau nu instalează altele noi pentru a rezolva dependențele — actualizează doar pachetele care pot fi satisfăcute fără modificări structurale. `apt-get dist-upgrade` utilizează un rezolvator mai inteligent care poate instala pachete noi și elimina cele obsolete. Pentru actualizările de versiune punctuală și actualizările majore de versiune, `dist-upgrade` este instrumentul corect.

De ce eșuează `do-release-upgrade` imediat după rularea sa?

Cel mai frecvent motiv este că sistemul curent are dependențe nerezolvate sau pachete reținute. Rulați `sudo apt-get dist-upgrade` și `sudo apt-get autoremove` pentru a aduce sistemul la o stare complet consistentă înainte de a invoca `do-release-upgrade`. Verificați de asemenea că toate PPA-urile terțe sunt fie dezactivate, fie compatibile cu versiunea țintă.

Cât spațiu liber pe disc este necesar pentru o actualizare majoră de versiune Ubuntu?

Ca minim practic, aveți nevoie de cel puțin 2–3 GB liberi pe partiția rădăcină și cel puțin 200–300 MB liberi pe `/boot`. Cerința reală variază în funcție de numărul de pachete instalate. Rulați `sudo do-release-upgrade` cu sistemul la sau peste aceste praguri; dacă spațiul este limitat, rulați `sudo apt-get autoremove –purge && sudo apt-get clean` imediat înainte de inițierea actualizării.

15%

Economisește 15% la toate serviciile de găzduire

Testează-ți abilitățile și obține Reducere la orice plan de găzduire

Utilizați codul:

Skills
Începeți