Sebbene la mia conoscenza di Debian risalga ormai a cinque anni fa, in questi giorni mi sono trovato in una situazione per me del tutto nuova e cioè mi sono visto nella necessità di dover installare – o meglio, reinstallare – diversi pacchetti con versione minore rispetto a quelli installati. In parole povere: avevo un sistema misto basato su Testing e Unstable e la necessità di riportarlo completamente a Testing. Questa operazione, l’ inverso dell’ upgrade, viene chiamata con un grosso sforzo di fantasia downgrade.
Synaptic permette di fare il downgrade di un pacchetto con una certa scioltezza: si seleziona il pacchetto e quindi si seleziona la voce apposita `Forza Versione` dal menu `Pacchetto`.
Ovviamente questo funziona solo per quei pacchetti che non hanno dipendenze da soddisfare. Io però mi trovavo nella situazione in cui la maggior parte della tool-chain, il sistema X e diversi pacchetti definiti `essenziali` provenivano da unstable. Come fare?
Nel mio caso, avendo utilizzato il pinning per poter disporre di un sistema misto con ragionevole sicurezza, la prima cosa da fare è stata metter mano ai file di configurazione del sistema APT: /etc/apt/preferences e /etc/apt/apt.conf
Per quel che riguarda preferences ho provveduto a eliminare qualsiasi altra impostazione diversa dalla sottostante:
$ cat /etc/apt/preferences
Package: *
Pin: release o=testing
Pin-Priority: 1001
Questa impostazione ci garantisce che gli unici pacchetti che avranno la precedenza su tutti gli altri sono quelli provenienti dal ramo `testing`.
Nel file apt.conf, invece, ho provveduto a verificare che `testing` fosse indicata come versione predefinita per il sistema.
$ cat /etc/apt/apt.conf APT::Default-Release "testing"; APT::Cache-Limit 15000000; Apt::Get::Purge; APT::Clean-Installed; APT::Get::Fix-Broken; APT::Get::Fix-Missing; APT::Get::Show-Upgraded "true";
Ora eliminiamo qualsiasi sorgente diversa da `testing` dal nostro sources.list e aggiorniamo il database dei pacchetti nel solito modo:
$ sudo apt-get update $ sudo apt-get dist-upgrade
È fondamentale comprendere che la rimozione di programmi essenziali senza le dovute cautele e accorgimenti porta inevitabilmente ad una serie di anomalie di grave entità (non funzionamento dell’ interfaccia, della rete ecc…), a ritrovarsi ad avere un sistema operativo inusabile o addirittura nemmeno in grado di bootstrapare. Mentre stiamo facendo il downgrade concentriamoci esclusivamente su questo compito, non utilizziamo programmi non indispensabili, leggiamo sempre 4 volte l’ output a video e nel dubbio evitiamo di rimuovere qualsiasi cosa.
Assicuriamoci di avere a portata di mano alcuni programmi fondamentali:
$ sudo apt-get install wget apt-show-versions
Il primo è indispensabile per scaricare (anche in situazioni di emergenza) alcuni pacchetti che potranno servirci ed il secondo ci permette di individuare i pacchetti installati con versione più recente rispetto a quella presente nel ramo testing (e quindi provenienti da unstable).
In un terminale individuiamo i pacchetti di cui vogliamo effettuare il downgrade. Nell’ esempio io utilizzo un unico pacchetto, ma la lista è molto più lunga.
$ apt-show-versions |grep newer [...] pciutils 1:2.2.4-1 newer than version in archive [...]
Il grep filtra l’ output del comando e ci mostra unicamente i pacchetti che volevamo.
la prima mossa consiste nel tentare di rimuovere il pacchetto tramite apt: se non è elencato tra le dipendenze di altri programmi l’ operazione andrà a buon fine, mentre in caso contrario otterremo un grandissimo aiuto nel passo successivo. Se apt non riesce a disinstallare il pacchetto, infatti, ci informerà di quali altri pacchetti lo tengono bloccato.
$ sudo apt-get remove pciutils Lettura della lista dei pacchetti in corso... Fatto Generazione dell'albero delle dipendenze in corso Reading state information... Fatto I seguenti pacchetti saranno RIMOSSI: alsa-utils glide2-bin gnome-mount gnome-power-manager gnome-volume-manager hal libglide2 network-manager network-manager-gnome pciutils update-notifier 0 aggiornati, 0 installati, 12 da rimuovere e 0 non aggiornati. E' necessario prendere 0B di archivi. Dopo l'estrazione, verranno liberati 31,0MB di spazio su disco. Continuare [S/n]?
Dall’ output notiamo che, sebbene apt sia in grado di rimuovere il pacchetto, la disinstallazione porta anche alla rimozione di altri pacchetti, con effetti imprevedibili. in questo caso è molto meglio andare a rimuovere direttamente il pacchetto desiderato senza toccare gli altri.
Nel caso tra le dipendenze del pacchetto ci sia anche apt, oppure che si tratti di un programma che lo stesso apt evidenzia come ESSENZIALE, prima di procedere alla sua rimozione, assicuriamoci di scaricarne la versione corretta direttamente da internet, in modo da essere comunque in grado di reinstallarlo tramite dpkg. Per questo scopo si rivela utilissima la pagina di ricerca dei pacchetti ospitata sul sito di Debian.
Per disinstallare il pacchetto senza coinvolgere le sue dipendenze, possiamo utilizzare uno strumento un strumento meno sofisticato di apt, ma più potente: dpkg.
$ sudo dpkg --force-depends -r pciutils dpkg: pciutils: problemi con le dipendenze, ma lo rimuovo comunque come richiesto: libglide2 dipende da pciutils. alsa-utils dipende da pciutils (>= 1:2.1.11-4). hal dipende da pciutils. (Lettura del database ... 119085 file e directory attualmente installati.) Rimuovo pciutils ...
Siamo riusciti a disinstallare il programma evitando che Debian tenti risolvere le dipendenze. Dobbiamo prestare attenzione ora: il sistema operativo si trova in uno stato molto delicato e dobbiamo provvedere a soddisfare quelle dipendenze che abbiamo bellamente ignorato proprio un attimo fa. Avendo rimosso qualsiasi sorgente relativa a `unstable`, però, il pacchetto che andremo a installare sarà proprio la versione proveniente da `testing` di cui abbiamo bisogno!
Reinstalliamo pciutils tramite apt, che lo scaricherà dall’ unico archivio disponibile: testing.
$ sudo apt-get install pciutils Lettura della lista dei pacchetti in corso... Fatto Generazione dell'albero delle dipendenze in corso Reading state information... Fatto I seguenti pacchetti NUOVI (NEW) saranno installati: pciutils 0 aggiornati, 1 installati, 0 da rimuovere e 0 non aggiornati. E' necessario prendere 206kB di archivi. Dopo l'estrazione, verranno occupati 680kB di spazio su disco. Get:1 http://debian.fastweb.it testing/main pciutils 1:2.2.4~pre4-1 [206kB] Scaricato 206kB in 1s (106kB/s) Selezionato il pacchetto pciutils, che non lo era. (Lettura del database ... 119066 file e directory attualmente installati.) Spacchetto pciutils (da .../pciutils_1%3a2.2.4~pre4-1_i386.deb) ... Configuro pciutils (1:2.2.4~pre4-1) ...
Se apt non riuscisse a installarlo a causa di qualche conflitto con altri pacchetti già installati o di configurazioni residue possiamo semplicemente scaricarlo (tramite wget o un browser) e quindi installarlo tramite dpkg nel modo seguente:
dpkg -i --force-overwrite /percorso/del/PACCHETTO
Happy Debian!
x me è turco !!!
un po’ anche per me … it’s a kind of magic! 😉
Guida veramente super! Utilissima, chiarissima, mi ha salvato!!! Grande!
Interessante…..
sarebbe interessante avere altri dettagli:
quando abbiamo completato la procedura che descrivi ci ritroviamo che alcuni package che hanno ancora come riferimento la versione nuova di pciutils. Questo può comportare il malfunzionamento di tutto il resto dei programmi che dipendevano da pciutils?
Nel caso si volesse ripristinare la situazione originale cosa bisogna fare?
i pacchetti che dipendono dalla versione ‘newer’ di pciutils sono necessariamente anche loro ‘newer’ rispetto alla versione attualmente in uso. mi spiego meglio: se io installo pciutils da unstable, il pacchetto installerà da unstable anche tutte le dipendenze richieste e anche i pacchetti che dipendono da pciutils verranno aggiornati a unstable. quando vogliamo tornare a una release precedente, tutti questi pacchetti saranno *necessariamente* marchiati come ‘newer’.
per ripristinare la situazione originale si intende fare il downgrade devi pacchetti aggiornati installati, dovrebbe essere spiegato all’ inizio della guida.