¿Por qué las versiones anteriores de los paquetes de Debian desaparecen en los repositorios de paquetes? (muy relevante para la configuración del sistema controlada por versión)

39

Escenario: en la configuración del sistema controlada por la versión basada en Puppet, Chef, etc., es necesario reproducir un cierto estado del sistema. Esto se realiza especificando explícitamente las versiones del paquete del sistema.

Recientemente nos encontramos con un problema en el que faltaban ciertas versiones de paquetes en los repositorios de Debian. Un ejemplo: el paquete "parche" se requería en la versión 2.7.5-1 + deb9u1, pero solo 2.7.5-1 + deb9u2 estaba disponible. Otro ejemplo aún más severo: se requiere "linux-headers-4.9.0-9-common" (debido a que se está instalando el kernel asociado) y solo está disponible "linux-headers-4.9.0-11-common".

Esto hace que sea imposible reproducir un cierto estado de un sistema.

Los paquetes anteriores son solo ejemplos (que de hecho encontré). Estoy interesado en comprender y resolver el problema general.

¿Cuál es la idea detrás de estas actualizaciones, 'desaparecer' paquetes y versiones de paquetes?

¿Dónde puedo obtener versiones anteriores (no versiones realmente antiguas, sino versiones que tienen un par de semanas) de paquetes Debian? Debería ser posible automatizar el proceso de instalación de manera general.

Flo
fuente
1
Depende un poco del software utilizado para configurar el repositorio. Reprepro, iirc, solo permite una única versión de cada paquete
muru
2
stablepermanece constante, al menos hasta el próximo punto de lanzamiento. Las actualizaciones estables, las pruebas y las inestables solo contienen la última versión de cualquier paquete dado. Para cualquier otra cosa, tendrá que buscar en archive.debian.org (o snapshot.debian.org como se menciona en la respuesta de SK)
cas
55
¿Hay alguna razón por la que no está ejecutando su propio repositorio en el que puede controlar la política de reemplazo y las versiones de pin (que tendrá la ventaja de hacer que las futuras instalaciones automáticas sean locales)?
Eric Towers
2
El nuevo linuxnombre del paquete es una excepción: en general, los paquetes de Debian stable tienen el mismo nombre de paquete y solo cambian el número de versión. linux-image-amd64nunca cambia de nombre y siempre depende de lo último linux-image-4.9.0-*. El nuevo linux-image-4.9.0-*nombre del paquete marca los cambios incompatibles de ABI del kernel necesarios para respaldar algunas correcciones de errores y permite tratar con la compilación necesaria de módulos personalizados (dkms, etc.). Del mismo modo para linux-headers-*.
ignis
1
¿Cuál es la idea detrás de estas actualizaciones? apt-get changelog packagename
ignis

Respuestas:

65

Ser capaz de reproducir una configuración específica, hasta la versión exacta, es su requisito, no el de Debian.

Debian solo admite una única versión de cada paquete binario en cualquier versión dada; La contrapartida de eso es que se tiene mucho cuidado para garantizar que las actualizaciones de paquetes en cualquier versión dada no introduzcan regresiones, y cuando tal cuidado no es posible, documentar ese hecho. Mantener varias versiones de un paquete dado solo aumentaría la carga de soporte y los requisitos de prueba: por ejemplo, los mantenedores de paquetes tendrían que probar los paquetes actualizados contra todas las versiones disponibles de las bibliotecas que usan, en lugar de solo las versiones compatibles actualmente ... Los paquetes solo se actualizan en una versión estable cuando es realmente necesario, es decirpara corregir un error grave (incluidos problemas de seguridad). En el caso del kernel, esto a veces significa que la ABI del kernel cambia, y el nombre del paquete cambia como resultado de eso (para forzar la reconstrucción de paquetes dependientes); hay meta-paquetes que se puede tirar en lugar de codificar duro la ABI ( linux-image-amd64, linux-headers-amd64, etc.).

Sin embargo, existe una solución para su situación: cada fuente publicada y paquete binario se archiva en snapshot.debian.org . Cuando crea una configuración versionada, puede elegir la instantánea correspondiente (por ejemplo, una de las instantáneas de septiembre de 2019 ) y usarla como URL del repositorio:

deb https://snapshot.debian.org/archive/debian/20190930T084755Z/ buster main

Si termina confiando en esto, utilice un espejo de caché de algún tipo, por ejemplo Apt-Cacher NG . Esto no solo reducirá la carga en el servidor de instantáneas, sino que garantizará que tenga una copia local de todos los paquetes que necesita.

(La situación con respecto a los paquetes fuente es un poco más compleja, y los archivos llevan múltiples versiones de algunos paquetes fuente en una versión dada, debido a las dependencias de licencias. Pero eso no es relevante aquí. Estrictamente hablando, Debian proporciona múltiples versiones de algunos binarios en versiones compatibles: la versión actual en la versión de punto actual, junto con cualquier actualización en los repositorios de seguridad y repositorios de actualización; estos últimos se pliegan en la próxima versión de punto. Por lo tanto, es posible mantener una configuración del sistema reproducible y controlada por la versión sin recurrir a las instantáneas, siempre que las actualice cada vez que se realiza un lanzamiento puntual).

Stephen Kitt
fuente
Tenga en cuenta que a veces algunas versiones anteriores están disponibles: apt-cache madison packagenamemostrarán todas las versiones que aptpueden ver a través de repositorios configurados.
Ivanivan
55
(No sobrecargue los servidores de instantáneas / archivos utilizándolos innecesariamente, en lugar de un espejo cercano. Por lo tanto, deje su espejo normal en su lista sources.list con mayor prioridad que la instantánea, de modo que los paquetes que aún están disponibles desde allí se puedan recuperar de esa manera .)
Peter Cordes
3
Solo para verificar que he entendido correctamente: en la práctica, no se trata de las versiones que especifico al instalar paquetes (porque las versiones anteriores pueden no estar disponibles), sino más bien del estado de los repositorios de paquetes que estoy usando. Entonces, si quiero un Debian 9.8 'nuevo', necesito el repositorio de paquetes en ese mismo estado (por ejemplo, una instantánea o un repositorio que yo mismo creé), y luego, por supuesto, el paquete linux-header- * correcto sigue estando disponible . Si quiero migrar a Debian 9.9, obtengo el repositorio de paquetes al estado asociado y ejecuto apt-get dist-upgrade. ¿Es esto correcto?
Flo
2
Si eso es correcto.
Stephen Kitt
3
@Flo tenga en cuenta que las versiones puntuales (como debian X.9 o X.8) están destinadas solo a iso descargables, por lo que las nuevas instalaciones no descargan toneladas de paquetes. En los repositorios, no hay una distinción entre ninguno de los lanzamientos puntuales, siempre obtienes el último paquete.
Braiam el
16

No confíe en servidores que no están bajo su control para reproducir un estado específico del sistema. Aunque los servidores Debian son bastante confiables, nunca se sabe lo que podría suceder en el futuro. Esto es especialmente relevante con otros repositorios, puede usar.

Debe mantener su propio espejo para obtener estados de sistema capaces de reproducirse. De esta forma, incluso puede tener un estado de producción para sus sistemas normales y varios estados de prueba para nuevas configuraciones.

La herramienta de gestión de repositorio de acierto es capaz de crear espejos de repositorios. Puede elegir los paquetes para duplicar, crear instantáneas del contenido del repositorio en un momento específico y combinar varias duplicaciones o instantáneas en un solo repositorio. De esta manera, puede reproducir completamente los estados del sistema.

charlestón
fuente
8

Si bien la respuesta de Stephen Kitt ciertamente es una posible solución, creo que sería más seguro que conserve sus propias copias de los paquetes necesarios.

Cuando grabe una configuración del sistema, asegúrese de guardar copias de los .debarchivos de /var/cache/apt/archives/. También puedes usar apt-get download.

Al restaurar una configuración del sistema, debe ser muy estricto aptpara evitar desencadenar acciones automáticas potencialmente peligrosas.

Probablemente será más fácil de usar dpkgdirectamente para instalar exactamente lo que desea.

Stig Hemmer
fuente
66
Un enfoque aún mejor de la OMI sería utilizar un caché APT local. Eso evita los problemas en su tercer párrafo, y también evita tener que cosechar /var/cache/apt.
Stephen Kitt
3
Hay dos variantes de esto: una es usar algo como apt-mirror para clonar un repositorio completo, la otra es descargar solo paquetes específicos y dependencias . Luego tome una instantánea del directorio, por ejemplo, con btrfs como pkgs-20190501, luego publique el directorio de instantánea como un repositorio. En el momento de la compilación, coloque la URL del repositorio versionada (por ejemplo http://debmirror/pkgs-20190501/...) en sources.list, luego ejecute apt-get update, apt-get install $ pkgs, etc.
bain