¿Cómo puedo degradar paquetes sin eliminar a sus dependientes?

17

Tengo una serie de paquetes de mesa que había actualizado a una versión de PPA, antes de purgar el PPA para poder actualizar mi sistema. Las diferencias en las versiones son menores (técnicamente son las mismas, solo un conjunto de bibliotecas eran de git y las otras son las versiones finales).

Si trato de degradar a través de Synaptic, apt-get o aptitude, me arrojan al infierno de la dependencia.

¿Hay alguna manera de degradar los paquetes manualmente (quizás uno por uno) y marcar sus paquetes dependientes como inmuebles (si eso tiene sentido) hasta que termine?

PD: esta pregunta: ¿Cómo degradar un paquete a través de apt-get? es un poco diferente y no ayuda a esta situación.

RolandiXor
fuente
¿Por qué no lo haces ppa-purgeprimero?
landroni
Puede volver a instalar el paquete. Por ejemplo, si usa synaptic, cuando selecciona el paquete xyz, todas las dependencias se seleccionarán de forma predeterminada. Pero siempre puede anular la selección de todas las dependencias y simplemente instalar el paquete principal. Más tarde puede instalar todas las dependencias. esto solo funciona si está listo para reinstalar.
Usuario registrado
@landroni si purgo, eliminará los paquetes que no quiero eliminar.
RolandiXor

Respuestas:

13

Nunca jugué con esto antes, pero sugeriría que usted hold(o lock) la versión de las dependencias que le causan problemas. De esta forma apttiene un número más limitado de posibles soluciones, y tal vez no se confunda cuando intente degradar los otros paquetes.


Si nada más funciona, podría tomar el enfoque manual sugerido en esta respuesta: ¿Cómo degradar un paquete a través de apt-get? . Básicamente, descarga las necesarias .debpaquetes manualmente, a continuación, instalar uno por uno con el de nivel inferior dpkgy uno de sus argumentos contundentes: --ignore-depends, --force-depends, --force-depends-version, o incluso --force-all.

En el mismo espíritu que el anterior, tiene el --force-downgradeargumento:

          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.

Pero esto supone que has leído man dpkgy que entiendes lo que haces:

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

Consulte Error: el número de versión no comienza con dígitos y ¿Cómo instalar una versión anterior de Java y Cómo instalar una versión anterior de paquete como liquid 2.2.2? para ejemplos de:

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

Y vea ¿Cómo puedo instalar un paquete sin instalar algunas dependencias? para un ejemplo (junto con la advertencia apropiada) de:

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

Otro enfoque sería crear un .debpaquete ficticio utilizando el equivspaquete (y quizás un nombre ligeramente diferente). Luego, la instalación del paquete ficticio debería permitirle eliminar el paquete "verdadero" mientras conserva los detalles relevantes y luego instalar la versión anterior. No estoy seguro de cómo funcionaría exactamente esto, pero revise este hilo relevante para obtener detalles: cómo eliminar un deb sin eliminar sus dependencias .

Landroni
fuente
4

Primero puede usar apt-markpara marcar todas las dependencias del paquete de destino (y tal vez las recomendadas / sugeridas también) instaladas en el sistema como instalaciones manuales . Después de hacer eso, instale las versiones anteriores del software apt-getmencionando explícitamente la versión.

  • Para enumerar la dependencia, los paquetes recomendados y sugeridos para el paquete de destino:

    apt-cache show <target-package-name>
    
  • Marcar paquetes como instalados manualmente :

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

    (use esto para todas las dependencias, recomienda y sugiere).

  • Elimine el paquete de destino:

    sudo apt-get remove <target-package-name>
    
  • Para ver una lista de versiones de paquetes a las que puede degradar / actualizar, use:

    apt-cache policy <target-package-name>
    
  • Instale la versión de destino del paquete requerido:

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

    o

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

PD. Si la lista de dependencias / paquetes recomendados / sugeridos , es decir, aquellos con los que se va a marcar apt-markes grande, guarde la lista deseada de la salida empaquetada apt-cache show <target-package-name>en cualquier archivo, /path/to/fooy use apt-marken un combo como este:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
preciso
fuente
Este método puede funcionar, pero en lugar de marcar más de 100 paquetes, simplemente fui con la otra respuesta.
RolandiXor
@RolandiXor, puede usarlo apt-cache policy <target-package-name>para tener una lista de versiones de paquetes que puede degradar / actualizar a ...
preciso
... consulte la edición realizada en la publicación; si han de ser marcados mayor número de archivos que podría utilizar la combinación de los comandos incluido ...
precisa
No creo que me entiendas. De todos modos, lo solucioné ahora y he dado la recompensa (no puedo cambiarlo).
RolandiXor
1

Acabo de pasar por la molestia de actualizar a una versión anterior de un paquete y luego decidir degradar. Esto fue a través de un repositorio privado de mantenedores. En mi caso, se trataba de probar la última versión de systemd 233 (aún no publicada).

La clave es comprender que necesita especificar todos los paquetes que deberían ser degradados. Si lo hace bien, es probable que haga lo que quiera. Si pierde algo, apt le dirá que la acción hará que se eliminen muchos paquetes. Para asegurarnos de que usamos la bandera '-s' para probar la degradación antes de hacerlo.

Los pasos que debe seguir son los siguientes:

1) Enumere todas las dependencias que se actualizaron a upstream (use alguna otra palabra clave si su situación es diferente):

dpkg -l|grep upstream

Esto le proporciona una lista de paquetes con un número de versión ascendente.

2) Enumere cuál es la versión estable correcta para cada paquete:

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) Verifique que todo esté bien:

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.

(no estoy seguro si --reinstall fue necesario por cierto, pero esto es lo que hice)

4) Elimina los -s y hazlo.

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
usuario2427436
fuente