Condividi tramite


Risolvere i problemi comuni negli strumenti di gestione dei pacchetti yum e dnf per Linux

Si applica a: ✔️ macchine virtuali Linux

Questo articolo illustra e risolve i problemi comuni che possono verificarsi quando si usano yum gli strumenti di gestione dei pacchetti e dnf per installare o aggiornare applicazioni in macchine virtuali di Microsoft Azure.

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux che ha raggiunto la fine del supporto (EOL). Prendere in considerazione l'uso e la pianificazione di conseguenza. Per ulteriori informazioni, consultare la Guida alla fine del ciclo di vita di CentOS.

Panoramica

Lo strumento di gestione dei pacchetti della riga di comando yum viene usato nelle distribuzioni Linux che usano il Gestione pacchetti RPM. Il nome dello strumento è l'acronimo di "Yellowdog Updater Modified" ed è stato originariamente sviluppato per Yellow Dog Linux. Lo yum strumento ha acquisito un uso diffuso, in particolare nelle distribuzioni basate su RPM, ad esempio Red Hat Enterprise Linux (RHEL), CentOS, Oracle Linux, Mariner e Fedora.

Lo strumento di gestione dei pacchetti da riga di comando dnf o "Dandified Yum" è uno strumento di gestione pacchetti moderno e avanzato per le distribuzioni Linux basate su RPM.

Scenario 1: Problema di accesso al repository

Si verificano errori che si applicano ai certificati o alla connettività di rete.

Eseguire uno script di convalida

Azure fornisce lo script di controllo del repository RHUI (Red Hat Update Infrastructure) in GitHub. Questo script Python include le funzionalità seguenti:

  • Convalida il certificato client RHUI.
  • Convalida la coerenza rpm RHUI.
  • Verifica la coerenza tra le configurazioni del repository EUS (Extended Update Support) e non EUS e i relativi requisiti.
  • Convalida la connettività ai repository RHUI.
  • Segnala la connettività corretta del repository se non vengono rilevati errori.
  • Verifica la connettività SSL ai repository RHUI.
  • Si concentra esclusivamente sui repository RHUI.
  • Verifica un errore trovato usando le condizioni definite e fornisce raccomandazioni per una correzione.

Immagini Red Hat supportate

Questa versione dello script check supporta attualmente solo le macchine virtuali Red Hat seguenti distribuite dall'immagine di Azure Marketplace:

  • RHEL 7.x macchine virtuali con pagamento in base al consumo
  • RHEL 8.x macchine virtuali con pagamento in base al consumo
  • RHEL 9.x macchine virtuali con pagamento in base al consumo
  • RHEL 10.x macchine virtuali PAYG

Come eseguire lo script di controllo RHUI

Per eseguire lo script check, immettere i comandi della shell seguenti in una macchina virtuale Red Hat:

  1. Se la macchina virtuale ha accesso a Internet, eseguire lo script direttamente dalla macchina virtuale usando il comando seguente:

    curl -sL https://raw.githubusercontent.com/Azure/azure-support-scripts/refs/heads/master/Linux_scripts/rhui-check/rhui-check.py | sudo python2 -
    
  2. Se la macchina virtuale non ha accesso diretto a Internet, scaricare lo script dall'URL seguente: RHUI check script, trasferire lo script alla macchina virtuale e quindi eseguire il comando seguente:

    sudo python2 ./rhui-check.py 
    
  3. Lo script genera un report che include eventuali problemi rilevati. L'output dello script viene salvato anche in /var/log/rhuicheck.log dopo l'esecuzione.

Soluzione 1

Per un sistema RHEL, vedere Risolvere i problemi di certificato RHUI di Red Hat in Azure o risolvere i problemi di connettività RHUI di Red Hat in Azure.

Per altre distribuzioni linux, assicurarsi che la comunicazione con il repository corrispondente sia consentita tramite la porta 443. Assicurarsi inoltre che il sistema operativo usi un certificato valido se è necessario un certificato valido.

Scenario 2: Problema di dipendenza

È possibile che si verifichino diversi errori quando si verifica un conflitto di dipendenza durante un aggiornamento. Nelle sottosezioni seguenti vengono visualizzati i sintomi di output dei tipici errori di dipendenza.

Sintomo 2a

Error: 
 Problem: package leapp-0.16.0-2.el8.noarch requires python3-leapp = 0.16.0-2.el8, but none of the providers can be installed
  - package python2-leapp-0.16.0-1.el7_9.noarch conflicts with python3-leapp provided by python3-leapp-0.16.0-2.el8.noarch
  - package python3-leapp-0.16.0-2.el8.noarch conflicts with python2-leapp provided by python2-leapp-0.16.0-1.el7_9.noarch
  - cannot install the best update candidate for package leapp-0.16.0-1.el7_9.noarch
  - problem with installed package python2-leapp-0.16.0-1.el7_9.noarch
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

Sintomo 2b

Error: 
 Problem 1: package systemd-udev-239-78.el8.x86_64 requires systemd(x86-64) = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-udev-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 2: package systemd-container-239-78.el8.x86_64 requires systemd(x86-64) = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-container-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 3: package systemd-pam-239-78.el8.x86_64 requires systemd = 239-78.el8, but none of the providers can be installed
  - cannot install the best update candidate for package systemd-pam-239-74.el8_8.5.x86_64
  - package systemd-239-78.el8.i686 is filtered out by exclude filtering
  - package systemd-239-78.el8.x86_64 is filtered out by exclude filtering
 Problem 4: systemd-libs-239-74.el8_8.5.i686 has inferior architecture
  - package systemd-239-74.el8_8.5.x86_64 requires systemd-libs = 239-74.el8_8.5, but none of the providers can be installed
  - cannot install both systemd-libs-239-78.el8.x86_64 and systemd-libs-239-74.el8_8.5.x86_64
  - cannot install the best update candidate for package systemd-libs-239-74.el8_8.5.x86_64
  - problem with installed package systemd-239-74.el8_8.5.x86_64
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

Soluzione 2

Quando si verifica un problema di dipendenza, iniziare identificando la combinazione specifica di pacchetto e versione mancante o incompatibile. Il yum messaggio di errore indica in genere quale combinazione di versione del pacchetto è necessaria ma non è disponibile.

Soluzione per il sintomo 2a: Eliminare il pacchetto precedente

Per Sintomo 2a rifiuta yum una transazione e restituisce un messaggio di errore. L'errore è causato da incompatibilità tra il python2-leapp pacchetto da una versione precedente e la versione più recente.

Per correggere questo errore, è necessario rimuovere il pacchetto precedente che causa il conflitto (in questo caso python2-leapp-0.16.0-1.el7_9.noarch) eseguendo il comando seguente yum remove :

sudo yum remove python2-leapp-0.16.0-1.el7_9.noarch

È quindi possibile continuare l'aggiornamento o l'installazione del pacchetto richiesto.

Soluzione per il sintomo 2b: Rimuovere l'esclusione del pacchetto dal file di configurazione

Per il sintomo 2b, yum rifiuta una transazione e restituisce un messaggio di errore. Un filtro di esclusione causa l'errore.

Per correggere questo errore in modo che sia possibile riprendere l'aggiornamento o installare il pacchetto necessario, assicurarsi che il systemd pacchetto non sia escluso nel file di configurazione /etc/yum.conf o /etc/dnf.conf . Per verificare se si verifica l'esclusione del systemd pacchetto, eseguire un comando come la combinazione seguentecat/grep:

sudo cat /etc/yum.conf | grep -i exclude

Se il systemd pacchetto viene escluso, viene visualizzato l'output seguente:

exclude=systemd

Per terminare l'esclusione del pacchetto, usare un editor di testo (ad esempio , o ) per rimuovere o impostare come commento la voce per la riga "exclude" nel vi o vim.nano

Scenario 3: Versione errata di Python

Gli yumstrumenti , dnfe rpm sono scritti in Python e dipendono dall'interprete Python per funzionare correttamente. In particolare, si basano su alcune funzionalità e librerie fornite dall'interprete Python per eseguire il codice e interagire con il sistema. La modifica della versione predefinita di Python installata nel sistema può causare problemi all'interno yum o dnf a causa di una dipendenza da specifiche versioni e configurazioni python.

Ad esempio, è possibile che si verifichi uno degli errori seguenti se non è installata la versione corretta di Python:

  • "Sintassi non valida"

    yum list all
      File "/usr/bin/yum", line 30
        except KeyboardInterrupt, e:
                                ^
    SyntaxError: invalid syntax
    
  • "Nessun modulo denominato yum"

    yum repolist
    There was a problem importing one of the Python modules
    required to run yum. The error leading to this problem was:
    
       No module named yum
    
  • "Interprete non valido: nessun file o directory di questo tipo"

    bash: /usr/bin/yum: /usr/bin/pythonX.X: bad interpreter: No such file or directory
    

Soluzione 3

Consultando la documentazione ufficiale per la distribuzione Linux, è possibile verificare con sicurezza la versione predefinita di Python e confrontarla con la versione installata nel sistema. Questo processo consente di garantire coerenza e compatibilità tra le dipendenze software e le configurazioni di sistema.

Dopo aver identificato la versione predefinita di Python per la distribuzione Linux, è possibile determinare la versione attualmente installata eseguendo uno dei comandi seguenti:

sudo ls -al `which python`
sudo ls -lrth /usr/bin/python*
sudo rpm -V python

Se si verifica che sia in uso una versione non supportata di Python, sono disponibili diverse opzioni per risolvere il problema.

Rimuovere il collegamento simbolico alla versione non supportata di Python e creare un collegamento simbolico alla versione supportata di Python eseguendo i comandi seguenti:

sudo cd /usr/bin
sudo unlink python
sudo ln -s python2.7 python  # Modify if necessary.

Soluzione 3b: Reinstallare Python usando RPM

Reinstallare il pacchetto Python eseguendo il comando seguente rpm :

sudo rpm -ivh python-<release>.<arch>.rpm --replacepkgs --replacefiles

Soluzione 3c: Reinstallare Python da una macchina virtuale di ripristino

Reinstallare il pacchetto Python da una macchina virtuale di ripristino. Per istruzioni, vedere Missing important system core libraries and packages (Librerie e pacchetti di base di sistema mancanti).

Scenario 4: Pacchetti duplicati

Se si verifica un'interruzione durante yum l'aggiornamento, yum è possibile conservare le versioni precedenti del pacchetto insieme ai nuovi pacchetti da installare. I pacchetti duplicati possono causare confusione nelle operazioni di sistema durante l'uso successivo dello strumento e alla fine causano errori "multilib protetti" o problemi di dipendenza fuorvianti.

Gli scenari seguenti sono tipici:

  • Esecuzione yum update su Secure Shell (SSH) e si verificano interruzioni della connettività durante il processo di aggiornamento

  • Invio di un SIGINT segnale e kill -2 al yum processo o selezione di CTRL+C per terminare il processo durante l'esecuzione attiva yum

  • Si è verificato un riavvio del sistema a metà del processo di aggiornamento

Soluzione 4

Esistono due possibili soluzioni: provare a completare la transazione o rimuovere manualmente i pacchetti duplicati. I passaggi per completare questi approcci variano a seconda della distribuzione e della versione dell'installazione di Linux.

Soluzione 4a: Provare a completare la transazione

  1. Provare a completare la transazione eseguendo il comando yum-complete-transaction seguente:

    sudo yum-complete-transaction
    

    Se l'operazione ha esito positivo senza lasciare altri duplicati, andare al passaggio 2.

  2. Se sono presenti duplicati, risolvere questa transazione specificando il --cleanup-only parametro nel yum-complete-transaction comando :

    sudo yum-complete-transaction --cleanup-only
    

Soluzione 4b: rimuovere manualmente i duplicati

  1. Rimuovere manualmente i pacchetti duplicati eseguendo i comandi seguenti. Il yum check comando potrebbe richiedere molto tempo, ma ottenere l'output è fondamentale per procedere con questi passaggi:

    sudo tar -cjf /tmp/rpm_dbbkp.tar.bz2 /var/lib/{rpm,yum}
    sudo yum check &> /tmp/yumcheck
    grep "duplicate" /tmp/yumcheck | awk '{ print $NF }' | egrep -v "\:" > /tmp/duplicaterpms
    grep "duplicate" /tmp/yumcheck | awk '{ print $NF }' | egrep ":" | awk -F':' '{ print $NF }' >> /tmp/duplicaterpms
    for i in $(cat /tmp/duplicaterpms); do sudo rpm -e --justdb --nodeps $i; done
    sudo yum update
    
  2. Dopo aver rimosso i duplicati, se è stato incluso un nuovo kernel nella transazione non riuscita, reinstallare il kernel per assicurarsi che sia installata la generazione corretta di voci GRUB (Grand Unified Bootloader), il disco RAM iniziale (initrd) e il file system RAM iniziale (initramfs).

    sudo yum remove kernel-<newversion>-<release>.<arch>
    sudo yum install kernel-<newversion>-<release>.<arch>
    

Scenario 5: Yum non funziona e mostra un errore '404 Non trovato'

Un messaggio di errore "404 Non trovato" nell'output yum indica che yum non è stato possibile trovare il pacchetto o la risorsa nel server. Questo problema si verifica in genere se yum tenta di scaricare o accedere a un pacchetto da un repository, ma il file del pacchetto o i metadati associati a esso non è disponibile o mancante nel server. Questo scenario presenta varie cause, tra cui le seguenti:

  • Il pacchetto o la risorsa è stato rimosso dal repository.

  • L'URL o la configurazione del repository non è corretta.

  • I problemi di rete impediscono yum l'accesso al server del repository.

  • Si è verificato un tempo di inattività temporaneo del server o manutenzione.

Esempi di questo errore vengono visualizzati nell'output di esempio per varie distribuzioni linux.

Red Hat Enterprise Linux 9 for x86_64 - Supplem  46  B/s |  14  B     00:00    
Errors during downloading metadata for repository 'rhel-9-for-x86_64-supplementary-rhui-rpms':
  - Status code: 404 for https://rhui4-1.microsoft.com/pulp/repos/content/dist/rhel9/rhui/9.1/x86_64/supplementary/os/repodata/repomd.xml (IP: 52.142.4.99)
Error: Failed to download metadata for repo 'rhel-9-for-x86_64-

Soluzione 5

Le possibili soluzioni seguenti si applicano a varie distribuzioni di Linux.

Assicurarsi di seguire il processo corretto quando si passa tra repository del ciclo di vita eus (Extended Update Support) e repository non EUS o da eus a EUS. Per altre informazioni, vedere Comportamento di aggiornamento delle immagini.

Se l'errore si verifica in genere perché viene usato un valore non corretto per /etc/yum/vars/releasever e /etc/dnf/vars/releasever oppure perché il valore deve essere assente (per i repository non EUS), seguire questa procedura:

  1. Controllare se il sistema usa repository EUS o non EUS. A tale scopo, eseguire la combinazione di comandi seguente rpm/grep :

    sudo rpm -qa | grep -i rhui
    

    Il formato del nome file generato dal comando dipende dal tipo di repository, come illustrato nella tabella seguente.

    Tipo di repository Formato nome file
    EUS rhui-azure-rhelX-eus-new-version-release.noarch<><>
    non EUS rhui-azure-rhelX-new-version-release.noarch<><>
  2. Determinare il valore corrente per la versione di rilascio eseguendo il comando seguente cat .

    Versione di RHEL Comando
    RHEL 7 sudo cat /etc/yum/vars/releasever
    RHEL 8 e 9 sudo cat /etc/dnf/vars/releasever
  3. Modificare e usare il valore corretto per la versione di rilascio:

    • Se il sistema usa repository EUS, assicurarsi che venga applicato il blocco della versione appropriato. Nell'esempio seguente viene aggiunto il blocco della versione per RHEL 9.2 perché RHUI EUS vengono usati i repository:

      sudo sh -c 'echo 9.2 > /etc/dnf/vars/releasever'
      

      Annotazioni

      Il supporto per RHEL7 EUS è terminato il 30 agosto 2021. È consigliabile non usare più repository EUS in RHEL7.

      RHEL 8.Sono disponibili x versioni per EUS. Queste versioni includono RHEL 8.8, 8.6, 8.4, 8.2 e 8.1.

      RHEL 9.Sono disponibili x versioni per EUS. Attualmente, queste versioni includono RHEL 9.2 e 9.0.

      Per altre informazioni sulla disponibilità delle versioni, vedere Red Hat Enterprise Linux Life Cycle.

    • Se il sistema usa repository non EUS, assicurarsi di rimuovere il blocco della versione per il file /etc/yum/vars/releasever o /etc/dnf/vars/releasever eseguendo il comando seguente.

      Versione di RHEL Comando
      RHEL 7 sudo echo "" > /etc/yum/vars/releasever
      RHEL 8 e 9 sudo echo "" > /etc/dnf/vars/releasever

Scenario 6: problema del database RPM

Se si esegue il rpmcomando , up2date, yum, dnf, o tdnf vengono visualizzati gli errori seguenti:

error: rpmdb: BDB0113 Thread/process 24669/140693557245760 failed: BDB1507 Thread died in Berkeley DB library
error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db5 - (-30973)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:

Questi errori possono verificarsi per uno dei motivi seguenti:

  • Database RPM interrotti
  • Un'altra applicazione che usa il database
  • Spazio insufficiente nella directory /var/lib/rpm

Soluzione 6

Ricompilare il database RPM seguendo questa procedura:

Importante

Prima di eseguire questi passaggi, assicurarsi che sia disponibile spazio su disco sufficiente.

  1. Creare un backup della directory /var/lib/rpm eseguendo il tar comando :

    sudo tar zcvf /var/lib/rpm-backup.tar.gz /var/lib/rpm
    
  2. Per evitare blocchi non aggiornati, rimuovere i file __db* e verificare l'integrità del file Packages :

    sudo cd /var/lib/rpm
    sudo rm -f __db.*
    sudo /usr/lib/rpm/rpmdb_verify Packages
    
  3. Ricompilare il database RPM eseguendo il rpm comando :

    sudo rpm -vv --rebuilddb
    

Scenario 7: Il comando Yum ha esito negativo e restituisce "[Errno 14] Errore HTTPS 403 --Accesso negato"

Se si esegue il comando in red hat 7, vengono visualizzati gli yum errori seguenti.x macchina virtuale connessa a RHUI.

https://rhui4-1.microsoft.com/pulp/repos/content/dist/rhel/rhui/server/7/7Server/x86_64/rh-common/os/repodata/repomd.xml: [Errno 14] HTTPS Error 403 - Forbidden

Soluzione 7

  1. Verificare se nella macchina virtuale è installato un pacchetto curl di terze parti:

    sudo rpm -qa | grep -i curl
    
    rpm -q --queryformat '%{VENDOR}\n' curl libcurl
    
    curl-7.73.0-2.0.cf.rhel7.x86_64 
    libcurl-7.73.0-2.0.cf.rhel7.x86_64
    libcurl-devel-7.73.0-2.0.cf.rhel7.x86_64 
    
    city-fan.org repo http://www.city-fan.org/ftp/contrib/
    

    Se è installato un pacchetto di terze parti, andare al passaggio 2.

    Importante

    I pacchetti curl di origini di terze parti vengono forniti insieme ai propri file binari e certificati non riconosciuti da Red Hat. Questa incompatibilità causa problemi di yum to experience.

  2. Usare uno dei metodi seguenti per scaricare la versione più recente dei curlpacchetti , libcurle libcurl-devel forniti per RHEL 7.9:

    • Scaricare manualmente i pacchetti accedendo a Red Hat Download e quindi caricando i file rpms nella macchina virtuale interessata.

    • Accedere a una macchina virtuale (PAYGO)RHEL 7.9 funzionante, scaricare i pacchetti necessari usando il yumdownloader comando e quindi copiare i file rpms nella macchina virtuale interessata:

      sudo yumdownloader curl.x86_64 libcurl.x86_64 libcurl-devel.x86_64
      
  3. Effettuare il downgrade dei pacchetti curl usando i file rpms del passaggio 2:

    sudo cd /path/location/of/rpms/downloaded
    sudo yum downgrade curl-X.XX.0-XX.el7_9.X.x86_64.rpm libcurl-X.XX.X-XX.el7_9.X.x86_64.rpm libcurl-devel-X.XX.X-XX.el7_9.X.x86_64.rpm --disablerepo=*
    

Dichiarazione di non responsabilità sulle informazioni di terze parti

I prodotti di terzi citati in questo articolo sono prodotti da società indipendenti da Microsoft. Microsoft non rilascia alcuna garanzia implicita o esplicita relativa alle prestazioni o all'affidabilità di tali prodotti

Dichiarazione di non responsabilità di contatti di terze parti

Microsoft fornisce informazioni di contatto di terze parti per aiutarti a trovare ulteriori informazioni su questo argomento. Queste informazioni di contatto sono soggette a modifica senza preavviso. Microsoft non garantisce l'accuratezza delle informazioni di contatto di terze parti.

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.