Come rimuovere un deb senza rimuoverne le dipendenze


43

Vorrei installare la versione più recente di boto , che faccio tramitepython setup.py install

Tuttavia quando provo a rimuovere la vecchia versione vengono rimossi anche i seguenti pacchetti:

apt-get remove python-boto
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  cloud-init cloud-utils euca2ools python-boto

Come posso dire al gestore di pacchetti di rimuovere boto, e loro lo contrassegnano come installato esternamente (o qualcosa del genere) in modo che apt non provi a riparare la dipendenza mancante?

Grazie
Maxim.


Hai provato <code> sudo dpkg --remove python-boto </code>?
dkuntz2,

Risposte:


16

È possibile creare un pacchetto fittizio .deb utilizzando l' equivsutilità, fornirà la dipendenza senza installare alcun file. Quindi basta sostituire il pacchetto attualmente installato con la versione fittizia utilizzando dpkg -i fake.deb.


60

Usa direttamente dpkg, non apt-get o aptitude:

sudo dpkg -r --force-depends "packagename-version"

1
Giusto ma quando proverò ad usare apt per installare qualcosa, rileverà che il pacchetto che ho rimosso con dpkg è mancante e lo reinstallerò. La domanda come posso fare per non voler reinstallarlo / ignorare il suo stato di coerenza?
Maxim Veksler

15

So che questo è un vecchio post, ma dato che di recente ho avuto un problema simile, vorrei condividere la mia soluzione nella speranza che qualcuno in futuro lo trovi utile.

Se hai installato un pacchetto tramite aptitude, assegna automaticamente i flag alle dipendenze (auto) e quando tenti di rimuovere di nuovo il pacchetto, prova a rimuovere tutte le sue dipendenze che hanno ancora impostato il flag automatico.

Come puoi vedere nel mio caso è lo zabbix che voglio rimuovere:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  apache2{u} dbconfig-common{u} fping{u} javascript-common{u} libhtml-template-perl{u} libiksemel3{u} libjs-prototype{u} 
  libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} mysql-server{u} mysql-server-5.1{u} mysql-server-core-5.1{u} php5{u} php5-gd{u} 
  php5-mysql{u} snmpd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 20 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 44.9 MB will be freed.
Do you want to continue? [Y/n/?]

E se cerchiamo il pacchetto apache sembra così

uman@mango:~$ aptitude search ^apache2
i A apache2        - Apache HTTP Server metapackage
<snip>

il primo flag "i" ci dice che è installato apache
Il prossimo flag "A" sta per installato automaticamente

Quindi per risolvere questo problema e non avere disinstallato apache, mysql e php, possiamo semplicemente rimuovere il flag automatico con aptitude in questo modo:

uman@mango:~$ sudo aptitude unmarkauto apache2 mysql-server php5
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.

Ora appare così quando si rimuove il pacchetto zabbix:

uman@mango:~$ sudo aptitude purge zabbix-server-mysql zabbix-frontend-php
The following packages will be REMOVED:  
  dbconfig-common{u} fping{u} javascript-common{u} libiksemel3{u} libjs-prototype{u} libjs-scriptaculous{u} libopenipmi0{u} libt1-5{u} 
  php5-gd{u} wwwconfig-common{u} zabbix-frontend-php{p} zabbix-server-mysql{p} 
0 packages upgraded, 0 newly installed, 12 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 16.6 MB will be freed.
Do you want to continue? [Y/n/?] 

Per maggiori dettagli, controlla la pagina man di aptitude


Questa sembra la migliore risposta di tutte (a seconda della situazione). Non dovrebbe essere troppo difficile eseguire un comando che trovi tutti i dipendenti e li instrada a unmarkauto.
johny perché il

13

Questo è esattamente ciò che apt-mark holdserve.

apt-mark hold package_name

Dalla documentazione:

hold è usato per contrassegnare un pacchetto come trattenuto, che impedirà l'installazione, l'aggiornamento o la rimozione automatici del pacchetto. Il comando è solo un wrapper attorno a dpkg --set-selections e lo stato è quindi

Per annullare un pacchetto:

apt-mark unhold package_name


1
Per la mia situazione, questo è l'approccio raccomandato.
Paulo Coghi - Ripristina Monica

1
Sfortunatamente, questo non riesce a mantenere le dipendenze. Vale a dire se installo i pacchetti A e B e condividono una dipendenza comune X, tenendo premuto A non si terrà X, e la rimozione di B non riuscirà con "E: Errore, pkgProblemResolver :: Risolvi interruzioni generate, ciò può essere causato da pacchetti sospesi".
Salterio,

Ho appena ricevuto un errore quando The following packages have unmet dependencies: mysql-server-5.7 : Depends: apparmor (>= 2.10) but it is not going to be installed E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
provo


0

Per completare la risposta di João Pinto, puoi usare il mio piccolo script per correggere il pacchetto rotto, questo script creerà un pacchetto fittizio con equivs e lo installerà. Puoi trovare un articolo sul mio blog in francese .

O direttamente sul codice gist .

Per usarlo:

$ ./gen-dummy-package.sh --install|i [packageName]+
# e.g. :
$ ./gen-dummy-package.sh -i rfkill nome-bluetooth bluez
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.