Come posso effettuare il downgrade dei pacchetti senza rimuovere i loro dipendenti?


17

Ho un certo numero di pacchetti mesa che avevo aggiornato a una versione PPA, prima di eliminare PPA in modo da poter aggiornare il mio sistema. Le differenze nelle versioni sono minori (sono tecnicamente le stesse, solo un set di librerie proveniva da git e le altre sono le versioni finali).

Se provo a effettuare il downgrade tramite Synaptic, apt-get o aptitude, vengo gettato nell'inferno della dipendenza.

C'è un modo per eseguire il downgrade manuale dei pacchetti (forse uno per uno) e contrassegnare i loro pacchetti dipendenti come immobili (se ciò ha senso) fino a quando non ho finito?

PS questa domanda: come eseguire il downgrade di un pacchetto tramite apt-get? è un po 'diverso e non aiuta questa situazione.


Perché non lo fai per ppa-purgeprimo?
Landroni,

È possibile reinstallare il pacchetto. Ad esempio, se si utilizza synaptic, quando si seleziona il pacchetto xyz, tutte le dipendenze verranno selezionate per impostazione predefinita, ma è sempre possibile deselezionare tutte le dipendenze e installare solo il pacchetto principale. Successivamente è possibile installare tutte le dipendenze. funziona solo se sei pronto per la reinstallazione.
Utente registrato

@landroni se spurgo, rimuoverà i pacchetti che non voglio rimuovere.
RolandiXor

Risposte:


13

Non ci avevo mai giocato prima, ma suggerirei a te hold(o lock) la versione delle dipendenze che ti causano problemi. In questo modo aptha un numero più limitato di possibili soluzioni e forse non si confonde quando si tenta di effettuare il downgrade degli altri pacchetti.


Se nient'altro funziona, potresti seguire l'approccio manuale suggerito in questa risposta: Come eseguire il downgrade di un pacchetto tramite apt-get? . Fondamentalmente, scaricare i necessari .debpacchetti manualmente, quindi installare uno ad uno con il livello inferiore dpkge uno dei suoi argomenti forti: --ignore-depends, --force-depends, --force-depends-version, o addirittura --force-all.

Nello stesso spirito di cui sopra, hai l' --force-downgradeargomento:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Ma questo presuppone che tu abbia letto man dpkge che tu capisca cosa fai:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Vedi Errore: il numero di versione non inizia con cifre e Come installare una versione precedente di Java e Come installare una versione precedente del pacchetto come liquid 2.2.2? per esempi di:

sudo dpkg --force-downgrade -i your_mesa_package.deb

E vedi Come posso installare un pacchetto senza installare alcune dipendenze? per un esempio (insieme all'avvertenza appropriata) di:

sudo dpkg --force-all -i your_mesa_package.deb

Un altro approccio sarebbe quello di creare un .debpacchetto fittizio usando il equivspacchetto (e forse un nome leggermente diverso). Quindi l'installazione del pacchetto fittizio dovrebbe consentire di rimuovere il pacchetto "vero" mantenendo i deps pertinenti, quindi installare la versione precedente. Non sono sicuro di come funzioni esattamente, ma controlla questo thread pertinente per i dettagli: Come rimuovere un deb senza rimuoverne le dipendenze .


4

È possibile innanzitutto utilizzare apt-markper contrassegnare tutte le dipendenze del pacchetto di destinazione (e forse anche quelle consigliate / consigliate) installate nel sistema come installazioni manuali . Dopo averlo fatto, installa le versioni precedenti del software apt-getcitando esplicitamente la versione.

  • Per elencare i pacchetti di dipendenza, consigliati e suggeriti per il pacchetto target:

    apt-cache show <target-package-name>
    
  • Contrassegnare i pacchetti come installati manualmente :

    sudo apt-mark manual <package-name(s)>
    

    (usalo per tutte le dipendenze, raccomanda e suggerisce).

  • Rimuovi il pacchetto target:

    sudo apt-get remove <target-package-name>
    
  • Per visualizzare un elenco delle versioni del pacchetto che è possibile eseguire il downgrade / upgrade, utilizzare:

    apt-cache policy <target-package-name>
    
  • Installa la versione di destinazione del pacchetto richiesto:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    o

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Se l'elenco di dipendenze / pacchetti consigliati / suggeriti , ad esempio quelli che devono essere contrassegnati con, apt-markè grande, salvare l'elenco previsto dell'output del pacchetto da apt-cache show <target-package-name>in qualsiasi file dire /path/to/fooe utilizzare apt-markin una combo come questa:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese

Questo metodo può funzionare, ma invece di contrassegnare più di 100 pacchetti, ho semplicemente scelto l'altra risposta.
RolandiXor

@RolandiXor, è possibile utilizzare apt-cache policy <target-package-name>per avere un elenco di versioni del pacchetto che è possibile eseguire il downgrade / aggiornamento a ..
preciso

.. si prega di fare riferimento alla modifica apportata al post; se si desidera contrassegnare un numero maggiore di file, è possibile utilizzare la combinazione di comandi inclusa ...
preciso

Non penso che tu mi stia capendo. Comunque, l'ho risolto ora e ho dato la taglia (non posso cambiarlo).
RolandiXor

1

Ho appena attraversato il dolore della palla per l'aggiornamento a una versione a monte di un pacchetto e quindi decidere di effettuare il downgrade. Questo avveniva tramite un repository privato dei manutentori. Nel mio caso, si trattava di provare l'ultima versione di systemd 233 (non ancora pubblicata).

La chiave è capire che è necessario specificare tutti i pacchetti che devono essere sottoposti a downgrade. Se lo capisci bene, è probabile che faranno quello che vuoi. Se perdi qualcosa, apt ti dirà che l'azione causerà la rimozione di molti pacchetti. Per essere sicuri di usare il flag '-s' per provare il downgrade prima di farlo.

I passi che devi compiere sono quindi:

1) Elenca tutte le dipendenze che sono state aggiornate a monte (usa qualche altra parola chiave se la tua situazione è diversa):

dpkg -l|grep upstream

Questo ti dà un elenco di pacchetti con un numero di versione upstream.

2) Elencare qual è la versione stabile corretta per ciascun pacchetto:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Ricontrolla tutto bene:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(non sono sicuro se - reinstall era richiesto tra l'altro, ma questo è quello che ho fatto)

4) Rimuovere il -s e farlo.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.