Ricerca nel sito web

Come bloccare gli aggiornamenti dei pacchetti e del kernel in Debian/Ubuntu


Su questa pagina

  1. Prerequisiti
  2. Metodo 1 (apt-mark)
  3. Metodo 2 (/etc/apt/preferences)
    1. Salta una versione ma consenti l'altra
    2. Modifica la preferenza Repository

    1. Metodo 1 (apt-mark)
    2. Metodo 2 (/etc/apt/apt.conf.d/50unattended-upgrades)
    3. Metodo 3 (dpkg)
    4. Metodo 4 (/etc/apt/preferences)

    APT è probabilmente lo strumento più utile per un utente Linux. Puoi installare, aggiornare e rimuovere qualsiasi software/pacchetto dal tuo sistema Linux con un solo comando. Ma a volte, è necessario un controllo granulare su quale pacchetto si desidera installare o aggiornare e su quale pacchetto bloccare l'aggiornamento automatico. Perché vorresti farlo? A volte scopri che una versione aggiornata dei pacchetti è difettosa. Non vuoi che quel pacchetto venga aggiornato la prossima volta che esegui sudo apt upgrade. Ed è una seccatura aggiornare ogni pacchetto individualmente.

    Questo tutorial spiegherà come bloccare l'installazione o l'aggiornamento di determinati pacchetti e come bloccare l'installazione di versioni specifiche di pacchetti o kernel.

    Nota: dopo un po' di tempo è facile dimenticare quali pacchetti si sono tenuti, anche quando sono uscite le loro versioni prive di bug. Quindi rimani in allerta poiché tenere a lungo i pacchi può introdurre problemi di sicurezza.

    Discuteremo due metodi qui. Il primo metodo bloccherà tutte le installazioni e gli aggiornamenti per un determinato pacchetto. Il secondo metodo offre un controllo più granulare, consentendo di bloccare versioni specifiche di un pacchetto.

    Prerequisiti

    • Un server con sistema operativo Ubuntu o Debian. Ubuntu 22.04 è stato utilizzato per questo tutorial, ma i comandi qui dovrebbero funzionare bene anche con altri sistemi operativi basati su Debian e versioni precedenti.
    • Un utente non root con privilegi sudo.

    Metodo 1 (apt-mark)

    Per bloccare l'installazione, l'aggiornamento o la rimozione di un pacchetto, possiamo usare il comando apt-mark.

    Se vuoi impedire l'installazione, l'aggiornamento o la rimozione di un pacchetto, ad esempio htop, usa il seguente comando.

    $ sudo apt-mark hold htop
    

    Dovresti vedere il seguente output.

    htop set on hold.
    

    Il pacchetto bloccato rimarrà sulla stessa versione anche se aggiorni il tuo sistema. Ciò è particolarmente utile per trattenere i driver grafici.

    Per rimuovere il blocco sul pacchetto, immetti il seguente comando.

    $ sudo apt-mark unhold htop
    

    Dovresti vedere il seguente output.

    Canceled hold on htop.
    

    C'è un avvertimento importante con questo. Sebbene il pacchetto non venga aggiornato automaticamente utilizzando il comando sudo apt upgrade o durante l'aggiornamento del sistema, è comunque possibile rimuovere il pacchetto manualmente. sudo apt remove funzionerà ancora sui pacchetti bloccati.

    Questo metodo impedisce solo che vengano modificati automaticamente. Mantenerli in attesa li manterrà alle loro versioni correnti, qualunque cosa accada, a meno che tu non decida di rimuoverli manualmente.

    Metodo 2 (/etc/apt/preferences)

    Questo metodo comporta la modifica del file /etc/apt/preferences in cui è possibile specificare esattamente quale versione di quale pacchetto da quale repository è installato.

    Ogni pacchetto ottiene una priorità numerica in base alla quale APT decide se installare il pacchetto o meno e, in caso affermativo, da quale repository deve prelevarlo.

    Ad esempio, controlliamo alcuni dettagli sul pacchetto nginx. Immetti il seguente comando.

    $ apt-cache policy nginx
    

    Dovresti vedere un output simile.

    nginx:
      Installed: (none)
      Candidate: 1.22.1-1~jammy
      Version table:
         1.22.1-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    Vedrai che ci sono due repository da cui si installa nginx. Il primo è il repository Ubuntus e il secondo è il repository nginxs.

    Puoi vedere 500 scritti su tutti i repository. Questo numero specifica la priorità dei pacchetti. Poiché è lo stesso per tutti i repository, le possibilità che nginx provenga da uno dei repository sono le stesse. Quindi, in che modo il sistema deciderà quale pacchetto scegliere? Sceglierà la versione più alta disponibile. In questo caso, è 1.22.1. Per Ubuntu, il numero di versione completo diventa 1.22.1-1~jammy.

    Se non vuoi aggiornare alla versione 1.22.1 e vuoi bloccarlo, devi modificare il file /etc/apt/preferences.

    Apri il file nell'editor nano.

    $ sudo nano /etc/apt/preferences
    

    Questo comando ti aiuterà anche a creare il file se non esisteva precedentemente nel sistema.

    Incollare il seguente codice nel file.

    Package: nginx
    Pin: version 1.22.1-1~jammy
    Pin-Priority: -1
    

    Impostare la priorità su un valore inferiore a 0 significa che il pacchetto non verrà installato. Se vuoi che un pacchetto venga sempre installato, imposta la sua priorità su 1000 o superiore.

    Salva il file premendo Ctrl + X e immettendo Y quando richiesto.

    Ricontrolliamo il pacco.

    $ apt-cache policy nginx
    

    Vedrai il seguente output.

    nginx:
      Installed: (none)
      Candidate: 1.22.0-1~jammy
      Version table:
         1.22.1-1~jammy -1
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    Notate qualche differenza? La versione di rilascio Candidate è passata da 1.22.1 a 1.22.0. Ciò significa che la prossima versione successiva che il sistema installerà ora è la 1.22.0. Noterai anche -1 scritto contro l'ultima versione, il che significa che il sistema dovrebbe saltare quella versione.

    Salta una versione ma consenti l'altra

    È possibile aggiungere più voci per lo stesso pacchetto nel file. Ad esempio, aggiungi il codice seguente al file.

    Package: nginx
    Pin: version 1.22.1-1~jammy
    Pin-Priority: -1
    
    Package: nginx
    Pin: version 1.20.2-1~jammy
    Pin-Priority: 1000
    

    Qui stiamo dicendo al sistema di saltare la versione 1.22.1 ma di installare sempre la versione 1.20.2.

    Ricontrolliamo usando il comando apt-cache policy.

    nginx:
      Installed: (none)
      Candidate: 1.20.2-1~jammy
      Version table:
         1.22.1-1~jammy -1
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.22.0-1~jammy 500
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.20.2-1~jammy 1000
            500 http://nginx.org/packages/ubuntu jammy/nginx amd64 Packages
         1.18.0-6ubuntu14.3 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
         1.18.0-6ubuntu14 500
            500 http://us.archive.ubuntu.com/ubuntu jammy/main amd64 Packages
    

    La versione candidata è ora passata a 1.20.2 invece di 1.22.0.

    Modificare la preferenza Repository

    Consideriamo un altro caso. E se volessimo bloccare l'installazione di Nginx dal suo repository e scegliere invece il repository Ubuntu? Un modo sarebbe rimuovere il repository Nginx ma puoi nuovamente utilizzare il file delle preferenze per scegliere il repository per te.

    Immettere il seguente codice nel file.

    Package: nginx
    Pin: release o=nginx
    Pin-Priority: -1
    

    La parola chiave release specifica solo la successiva versione superiore. o=nginx fa riferimento all'origine del pacchetto. Ecco nginx. Ciò significa che il sistema non dovrebbe installare il pacchetto nginx dal suo repository. Un altro modo per ottenere lo stesso risultato è utilizzare il seguente codice.

    Package: nginx
    Pin: release o=jammy
    Pin-Priority: 1000
    

    Questa volta abbiamo impostato la priorità 1000 del pacchetto repository Ubuntu (jammy). Ciò garantirà che Nginx sia sempre installato dal repository Ubuntu e non da nessun'altra parte.

    Non solo puoi specificare l'origine del pacchetto, ma puoi anche aggiungere l'archivio, il componente, l'etichetta e l'architettura del pacchetto che il sistema dovrebbe selezionare utilizzando le seguenti parole chiave nella sezione Pin.

    • c -> Componente
    • a -> Archivio
    • o -> Origine
    • l -> Etichetta
    • n -> Architettura

    Blocco di specifici aggiornamenti del kernel

    Vediamo come possiamo bloccare specifici aggiornamenti del kernel. Elenca tutti i pacchetti relativi al kernel sul tuo sistema.

    $ dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'
    

    Vedrai un output simile.

    linux-headers-5.15.0-33-generic
    linux-image-5.15.0-33-generic
    linux-modules-5.15.0-33-generic
    linux-modules-extra-5.15.0-33-generic
    

    I seguenti metodi dovranno essere ripetuti per tutti i pacchetti ottenuti qui.

    Metodo 1 (apt-mark)

    Innanzitutto, controlliamo quale versione del kernel è attiva. Per fare ciò, esegui il seguente comando.

    $ uname -r
    

    Dovresti vedere un output simile.

    5.15.0-53-generic
    

    Per evitare che il kernel venga ulteriormente aggiornato, possiamo semplicemente usare il comando apt-mark.

    $ sudo apt-mark hold linux-image-$(uname -r)
    

    Dovresti vedere un output simile.

    linux-image-5.15.0-53-generic set on hold.
    

    Puoi seguire lo stesso metodo per bloccare le intestazioni del kernel bloccando il pacchetto linux-headers-$ (uname -r).

    Metodo 2 (/etc/apt/apt.conf.d/50unattended-upgrades)

    Il secondo metodo prevede il file /etc/apt/apt.conf.d/50unattended-upgrades.

    Aprilo per la modifica.

    $ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
    

    Scorri verso il basso fino alla sezione Unattended-Upgrade::Package-Blacklist e modifica come segue.

    Unattended-Upgrade::Package-Blacklist {
    "linux-generic";
    "linux-image-generic";
    "linux-headers-generic";
    "linux-modules-generic";
    "linux-modules-extra-generic";
    };
    

    Salva il file premendo Ctrl + X e immettendo Y quando richiesto.

    Metodo 3 (dpkg)

    Per mantenere l'aggiornamento del kernel usando dpkg, immetti il seguente comando. Questo comando manterrà tutti i pacchetti relativi al kernel contemporaneamente.

    $ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i hold | dpkg --set-selections; done
    

    Per rimuovere il blocco, utilizzare il seguente comando.

    $ for i in $(dpkg -l "*$(uname -r)*" | grep kernel | awk '{print $2}'); do echo $i install | dpkg --set-selections; done
    

    Metodo 4 (/etc/apt/preferences)

    Controlliamo prima i dettagli riguardanti la versione corrente del kernel.

    $ apt-cache policy linux-image-$(uname -r)
    

    Dovresti vedere il seguente output.

    linux-image-5.15.0-53-generic:
      Installed: 5.15.0-53.59
      Candidate: 5.15.0-53.59
      Version table:
     *** 5.15.0-53.59 500
            500 http://us.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
            500 http://us.archive.ubuntu.com/ubuntu jammy-security/main amd64 Packages
            100 /var/lib/dpkg/status
    

    Anche se il kernel 5.15.0.53 è alla sua ultima versione al momento della stesura di questo tutorial, supponiamo che la versione successiva sia già disponibile (5.15.0.56 è l'attuale versione stabile del kernel Linux).

    Per bloccare la prossima versione del kernel, inserisci il seguente codice nel file /etc/apt/preferences.\\

    Package: linux-image-5.15.0-53-generic linux-headers-5.15.0-33-generic linux-modules-5.15.0-33-generic linux-modules-extra-5.15.0-33-generic
    Pin: version 5.15.0-53.59
    Pin-Priority: -1
    

    Il codice sopra bloccherà Ubuntu dall'installazione di uno o tutti gli aggiornamenti al kernel.

    Puoi seguire i metodi 2 e 3 per qualsiasi pacchetto normale, non solo per il kernel.

    Conclusione

    Questo è tutto per questo tutorial. Ora dovresti essere in grado di bloccare qualsiasi versione specifica di qualsiasi pacchetto che non desideri installare o aggiornare sul tuo sistema Ubuntu o Debian. Se hai domande, pubblicale nei commenti qui sotto.