¿Cómo evitar la actualización de un paquete específico?

374

Debido al error # 693758, me gustaría evitar que apt-get upgradeUpdate Manager actualice el paquete "libgtk2.0-0".

¿Cómo se puede lograr esto?

Ivan
fuente
@hhlp: Pero esta pregunta es sobre un paquete que nunca se instaló.
Nathan Osman
1
@George Edison: también hay retención de paquetes, que le permite no actualizar el paquete. así que mantener un paquete básicamente significa que le estás diciendo al administrador de paquetes que mantenga la versión actual sin importar qué. Esto es útil si la versión más reciente de un programa que funciona actualmente se rompe después de una actualización. (no se puede mantener un paquete que nunca se instaló, también veo que mi pregunta es la misma) ... Lo probé ahora mismo - mira, dijodisable packages from the auto-update
hhlp

Respuestas:

554

Participación

Hay cuatro formas de contener paquetes: con dpkg, apt, aptitude o dselect.

dpkg

Poner un paquete en espera:

echo "<package-name> hold" | sudo dpkg --set-selections

Eliminar la retención:

echo "<package-name> install" | sudo dpkg --set-selections

Muestra el estado de tus paquetes:

dpkg --get-selections

Mostrar el estado de un solo paquete:

dpkg --get-selections | grep "<package-name>"

apto

Mantenga un paquete:

sudo apt-mark hold <package-name>

Eliminar la retención:

sudo apt-mark unhold <package-name>

Mostrar todos los paquetes en espera:

sudo apt-mark showhold

dselect

Con dselect, ingrese a la pantalla [S] elect, encuentre el paquete que desea mantener en su estado actual y presione =o H. Los cambios tendrán efecto inmediatamente después de salir de la pantalla de selección [S].


Los siguientes enfoques son limitados en que bloquear / mantener un paquete dentro de aptitude o synaptic no afecta a apt-get / apt.

aptitud

Mantenga un paquete:

sudo aptitude hold <package-name>

Eliminar la retención:

sudo aptitude unhold <package-name>

Bloqueo con Synaptic Package Manager

Vaya a Synaptic Package Manager (Sistema> Administración> Synaptic Package Manager).

Haga clic en el botón de búsqueda y escriba el nombre del paquete.

Cuando encuentre el paquete, selecciónelo, vaya al menú Paquete y seleccione Bloquear versión .

Menú sináptico

Ese paquete ahora no se mostrará en el administrador de actualizaciones y no se actualizará.

hhlp
fuente
44
Esto también funciona para evitar que se instale un paquete. Al instalar devscripts, muchos paquetes se extraen como paquetes recomendados. Como no necesito un servidor de correo (postfix), podría desactivar la instalación ejecutándolo echo postfix hold | sudo dpkg --set-selectionsantes de ejecutarlo sudo apt-get install devscripts. Esta acción de retención persiste solo para esta instalación, después de la instalación se restablecen las selecciones.
Lekensteyn
3
También vale la pena señalar, las retenciones de paquetes rompen las actualizaciones y parches a veces creando una situación en la que no hay una solución legal que pueda calcular para una dependencia. Si el paquete foo tiene una dependencia == <o <= en libbar, entonces apt se negará a actualizar libbar y foo. Con el tiempo, estas dependencias en cascada pueden crecer para bloquear una gran cantidad de actualizaciones, incluidas las actualizaciones de seguridad importantes. Tendrá que eliminar la retención y dejar que ocurra la actualización, o reconstruir los paquetes que tiene con versiones más nuevas de sus dependencias si esto sucede.
Stephanie
2
Solo una nota: apt-markno es compatible holdcon la versión 0.7.25 (Ubuntu Lucid)
Joril
1
Esto es especialmente útil cuando se trata de contener controladores de gráficos. Para los usuarios de ATI, apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
earthmeLon
8
Actualmente, Synaptic y Aptitude solo bloquean paquetes dentro de esos programas. "Cualquier otra cosa que haga actualizaciones de paquetes (léase: Administrador de actualizaciones, apt-get, aptitude, etc.) ignora esto". De esta pregunta .
holocronweaver
44

Para poner un paquete "foo" en espera:

echo "foo hold" | dpkg --set-selections

En su caso, vamos a poner el vino en espera:

sudo -i
echo "wine hold" | dpkg --set-selections

Para eliminar la retención:

sudo -i
echo "wine install" | dpkg --set-selections
Pantera
fuente
También tenga en cuenta que mientras un paquete está en espera, puede instalar una versión específica a través de apt-get install wine=1.2.3. Estar en espera impide apt-get (dist-)upgradecambiarlo.
rcoup
@rcoup Si tiene una versión anterior en espera, y luego actualiza manualmente a una nueva versión sin eliminar la retención como se describe, ¿se mantendrá la versión anterior en la caché para que pueda volver a ella?
cxrodgers
1
@cxrodgers el caché local (típicamente /var/cache/apt/archives) es independiente de las retenciones y actualizaciones y demás, por lo que todas las versiones que haya descargado estarán allí hasta que se ejecuteapt-get [auto]clean
rcoup
35

Estaba buscando lo mismo y después de mucha investigación descubrí que usando la siguiente sintaxis puedes prohibir una versión específica pero permitir la próxima actualización:

Paquete: compiz-plugins-main
Pin: versión 1: 0.9.7.0 ~ bzr19-0ubuntu10.1
Prioridad de pin: -1

Esto va al archivo / etc / apt / preferencias.

soger
fuente
99
Esta es una forma mucho mejor que evitar actualizaciones indefinidamente
Eero Aaltonen
Creo que con este método, hay más posibilidades de evitar que ubuntu 'adware' como ubuntu one o el ícono de amazon se reinstalen con la próxima actualización de lanzamiento ...
Daniel Alder
19

Instalar synapticusando sudo apt-get install synaptic.

Ejecute usando gksudo synapticy en el cuadro de búsqueda busque el paquete que desea bloquear, es decir:gedit

ingrese la descripción de la imagen aquí

En el menú del paquete, seleccione Versión de bloqueo :

ingrese la descripción de la imagen aquí

Y eso es todo, la versión instalada actualmente en el momento del bloqueo permanecerá instalada incluso durante las actualizaciones.

Bruno Pereira
fuente
77
Mire "La versión de bloqueo no es tan inteligente como parece. Se supone que debe hacer lo que dice en la lata, bloquear la versión ... Pero solo la bloquea en Synaptic. Cualquier otra cosa que haga actualizaciones de paquetes (lea: Administrador de actualizaciones , apt-get, aptitude, etc.) ignora esto. Probablemente sea un comportamiento defectuoso, por lo que esperaría que esto se solucione a tiempo ". de askubuntu.com/questions/9607/what-does-lock-version-do . ¿Cuál es el estado actual? Si algo está bloqueado en Synaptic, ¿otros administradores de paquetes "honrarán" el bloqueo?
2
vasa1: a partir de la versión 0.75.13, todavía no :( Mismo problema con la aptitud.
syockit
16

La prevención de la instalación de un paquete se llama "retención de paquetes" y es muy simple de hacer:

echo nombre_paquete hold | dpkg --set-selections

... donde * nombre_paquete * es el nombre del paquete que desea evitar que se instale.

Nota: el comando anterior asume privilegios de root. En otras palabras, probablemente necesitará escribir sudo suantes de ejecutarlo.

RobotHumanos
fuente
Perfecto, esta fue la respuesta. Gracias.
asoundmove
s/sudo su/sudo -s/g(o sudo -i) ( -idará un shell de inicio de sesión, -sno lo hará).
derobert
6

Dado que apt-getse reemplaza algún tiempo apt, por ejemplo, quiero evitar que Firefox se actualice a la versión superior a 56, porque muchos complementos, como "Grupos de pestañas" ya no funcionan con el nuevo Firefox 57 (consulte "Extensiones web" Actualizar").

Es posible contener más de un paquete con un comando y usar comodines.

Evitar que Firefox se actualice

sudo apt-mark hold firefox firefox-locale-*

Si desea deshacerse de ellos más tarde, ese sería el comando:

sudo apt-mark unhold firefox firefox-locale-*
rubo77
fuente
4

Sinéptico, puede congelar la versión de un paquete específico. No estoy 100% seguro de si esto modificará apt-get, pero definitivamente detendrá el administrador de actualizaciones.

Para congelar un paquete, selecciónelo en sináptico, luego abra el menú del paquete y seleccione la versión congelada.

Espero que esto ayude

editar: Esta pregunta 16668 trata una situación similar

Alano
fuente
3

Vea los errores # 75332 , # 158981 y # 72806 .

El resumen es que la retención en el nivel apt-get / aptitude no está activando el estado de retención en dpkg (vea el error 72806 especialmente) y el administrador de actualizaciones lee el estado de dpkg.

La solución se ejecuta como root: echo "package hold" | dpkg --set-selections

jaspe
fuente
2

Puede usar en aptitude el "override específico", así:

aptitude reinstall ~i oracle-java8-jre:

Este es un uso único de (no almacenado para futuras reinstalaciones), mantener anulación específica, para reinstalar todos los paquetes en su sistema pero no oracle-java8-jre.

Si utiliza una anulación específica de mantenimiento, el paquete estará momentáneamente en un estado de mantenimiento y una aptitud no intentará instalarlo.

Una cosa muy buena si cree que su sistema se vio comprometido de alguna manera.

cabonamigo
fuente
1

Si tiene Synaptic instalado, puede seleccionar el paquete y usar el menú Paquete -> Bloquear versión para evitar que se actualice.

Puede instalar Synaptic con sudo apt-get install synaptic. Personalmente, lo encuentro más útil que el Centro de software ... por otra parte, soy bastante viejo. :)

Dinchamion
fuente
0

Ocasionalmente, uno podría querer retener todos los paquetes actualmente instalados. Así es cómo.

Primero guarde el estado actual, para que pueda deshacer:

dpkg --get-selections > current_selections.txt

Luego, para retener todos los paquetes:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

Finalmente, cuando desee volver al estado anterior:

dpkg --set-selections < current_selections.txt

Un caso de uso para esto podría ser al crear una instantánea de VM o Amazon AMI para migrar desde un QA al entorno de producción.

JVW
fuente
0

Agregar detalles a los comentarios de @ soger en relación con Ubuntu 16.04.

Ubuntu 16.04 no tiene un archivo / etc / apt / preferencias existente por defecto. Si no tiene uno actualmente, simplemente cree un nuevo archivo y complételo con una estrofa como @soger describe anteriormente para excluir el paquete dado y sus dependencias de las actualizaciones.

Luego, corre apt updatey eres GTG. : 0)

Por ejemplo, tengo un servidor Ubuntu 16.04.5 LTS con tarjeta de video Intel integrada y una tarjeta NVidia. La tarjeta NVidia es la única utilizada. El servidor también usa controladores CUDA. Tuve un problema donde aptinsistí

va-driver-all

(Controladores Intel) requirieron una actualización, pero no pudo determinar qué versión instalar. Esto me estaba volviendo loco, y no necesitaba los controladores Intel de todos modos. Ingresé este texto en el archivo de preferencias y me sonrojé, problema resuelto.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
Señor Cara de Papa
fuente