¿Por qué los desarrolladores de Linux no pueden crear un formato de empaque universal?

14

Las selecciones de formato de paquete binario del proveedor parecen estar determinadas por una forma de la Ley de Murphy: todas las distribuciones que no usa tienen paquetes. (Corralary: no existe una distribución que satisfaga las dependencias de distribución de su pila de software).

¿Es una cuestión de política, o algo más profundo, que no hemos visto la aparición de un formato de paquete "construir una vez, ejecutar en cualquier lugar"?

jldugger
fuente
3
parece que solo tiene una comprensión superficial de lo que diferencia las distribuciones entre sí. unificar el sistema de paquetes aún no significaría que los paquetes son intercambiables entre distribuciones. Su pregunta no tiene sentido.
3
salto, ¿por qué no escribes una respuesta que dé una descripción menos superficial de las diferencias entre distribuciones? La pregunta se formula ingenuamente, pero hay una respuesta técnica profunda que espera ser dada.
jldugger
Realmente estás buscando la "Base Estándar de Linux"
Bill Weiss
¿Por qué los desarrolladores de Windows tampoco pueden crear un formato de empaque universal? No están empacando Windows aquí, pero tienen la misma cantidad de métodos de instalación de software, y ningún repositorio único como Linux tiene ... (esta es una pregunta retórica, por cierto)
Mark Henderson

Respuestas:

24

Parece apropiado citar a Joel Spolsky en este caso:

(Por cierto, para aquellos de ustedes que siguen el mundo arcano pero políticamente cargado de formatos de alimentación de sindicación de blogs, pueden ver que sucede lo mismo allí. RSS se fragmentó con varias versiones diferentes, especificaciones inexactas y mucha lucha política, y el intento de limpiar todo creando otro formato llamado Atom ha dado como resultado varias versiones diferentes de RSS más una versión de Atom, especificaciones inexactas y mucha lucha política. Cuando intentas unificar dos fuerzas opuestas creando una tercera alternativa, terminas con tres fuerzas opuestas. No has unificado nada y realmente no has arreglado nada.)

(énfasis añadido)

Tiene (al menos) dos sistemas de empaquetado para Linux. Eso es realmente algo bueno. Un solo sistema simplemente creará un tercer sistema.

cletus
fuente
Re: Cuando intentas unificar dos fuerzas opuestas creando una tercera alternativa, terminas con tres fuerzas opuestas. ver también : xkcd.com/927
JamesBarnett
20

Hay muchas razones para esto, y un poco de historia es para poner las cosas en perspectiva.

Recuerde que cuando hablamos de "Linux" a lo que generalmente nos referimos es a una de las muchas distribuciones de Linux diferentes . "Linux" es en realidad solo un núcleo del sistema operativo.

El objetivo original de Linux era crear un sistema basado en Unix que se ejecute en PC (inicialmente el 386). El primer paso fue crear el núcleo en sí. Mientras Linus Torvalds estaba trabajando en el núcleo, Richard Stallman estaba trabajando en su propio sistema Free Unix, bajo el proyecto GNU (GNU's Not Unix) . Para abreviar una larga historia, los dos convergieron un poco porque GNU tenía las utilidades asociadas (compilador C / biblioteca / herramientas de compilación, shell, editores de texto, etc.) pero no tenía un núcleo para ejecutarlo, y Linux tenía el núcleo pero no tenía utilidades para ejecutar encima de él para que sea útil para las masas.

Esta convergencia llegó a conocerse oficialmente como GNU / Linux. Verá que muchas distribuciones todavía se refieren a sí mismas como distribuciones GNU / Linux.

Debido a la naturaleza libre y abierta de GNU / Linux, cualquiera podría recogerlo y crear un sistema integrado para sus gustos específicos. El resultado fue que se utilizaron muchos flujos diferentes de diferentes métodos de configuración para crear estos sistemas, lo que tuvo el efecto secundario de crear casi tantos sistemas de administración de paquetes diferentes para adaptarse a cada uno.

Cada sistema completo diferente tenía sus propios seguidores fuertes que se mantuvieron con ellos a lo largo de los años, dando como resultado lo que tenemos hoy: un puñado de sistemas de administración de paquetes ampliamente utilizados, profundamente enraizados y estables como RPM , APT / dpkg y Gentoo's Portage .

Hay proyectos, como Autopackage , que intentan resolver el problema, pero la evolución continua de los diversos sistemas de gestión de paquetes admitidos significa que hay muchos objetivos en movimiento a seguir.

Lo que algunos proveedores de software terminan haciendo es agrupar los binarios específicos y las copias de las dependencias que requieren en un gran paquete que funcionará en sistemas específicos.

Wayne Koorts
fuente
8
Hay más que esto. Incluso si todo el mundo se unificara en decir rpm, aún no tendría el paquete una vez, ejecute en cualquier lugar que el OP prevea. Los paquetes son específicos en su mayor parte para su distribución, ya que dependen de todos los demás paquetes. La única forma de tener un mundo de "paquete una vez, ejecutar en cualquier lugar" sería tener no solo un sistema de empaquetado único, sino también una sola distribución.
Cian el
9

Tener el mismo formato de paquete no ayudaría de todos modos. Simplemente no puede usar el mismo paquete en otras distribuciones. A menudo ni siquiera puede usarlo en la versión diferente de la misma distribución. E incluso construir el paquete puede tener los mismos problemas.

Para instalar un paquete, debe cumplir con las dependencias que se forman durante la construcción del paquete. Para compilar un paquete, debe cumplir con las dependencias de compilación. Y estas cosas cambian. Para poder implementar los cambios, es más fácil admitir solo los paquetes que puede modificar para que funcionen después de los cambios.

Si todas las dependencias fueran iguales, no sería una distribución diferente o una versión diferente de la misma distribución.

iny
fuente
44
¿No sería posible versionar bibliotecas y usar dependencias de versión para resolver el problema que mencionas?
jldugger
Menciona que no puede usar debs de una versión en otra. Eso no es del todo cierto, hay excepciones a esa regla. Si el paquete es principalmente python, o si todos los bits se compilaron estáticamente, entonces puede hacerlo. Incluso hay un par de proveedores que simplemente incluyen todas las dependencias como parte del paquete, esto desperdicia espacio en disco, pero crea un paquete multiplataforma.
Zoredache
Incluso si un paquete es arch: all, o lenguajes de scripting, existen diferencias significativas entre python2.4 y python2.6 que causarán un paquete que funcione en la plataforma para la que fue creado y fallarán en otros.
jldugger
Sí, no se trata solo de dependencias de la biblioteca.
iny
Algunas de las actualizaciones de Debian han cambiado donde se suponía que debían colocarse los archivos, o proporcionaron sistemas estandarizados para actualizar los archivos de configuración que se administraron previamente manualmente. Este tipo de cosas es muy específico de la versión / distribución.
pjc50
7

Creo que hay un poco de "Síndrome no inventado aquí". El sistema de empaquetado de Debian es anterior a RedHat y, sin embargo, es superior en muchos aspectos, pero nunca verá el cambio de RedHat. En cambio, ve a mucha gente usando "apt-rpm" que intenta darle algunas de las ventajas de apt con archivos rpm.

Paul Tomblin
fuente
44
apt-rpm ha muerto hace bastante tiempo (última versión hace más de 1 año y medio) ahora y la mayoría de las personas se han mudado para usar yum. Yum sí ofrece un buen montón de características interesantes que eclipsan las ofertas de apt ..
rasjani
1
No creo que el empaque de Debian sea mejor que el Redhat de hoy. Solía ​​ser que Debian tenía un mejor sistema de actualización , pero eso ya no parece ser cierto. Yum se ha vuelto muy bueno. Todavía lento en comparación con Smart , pero muy manejable.
niXar
1
Todo lo que sé es que la última vez que estuve trabajando en CentOS, teníamos muchas más probabilidades de entrar en el infierno de la dependencia, y cambiar a apt-rpm solucionó la mayoría de esos problemas.
Paul Tomblin el
1
El paquete RPM de Redhat sufre de EDS (síndrome de dependencia extrema). Esto no es un comentario sobre RPM sino más bien Redhat. Yum es una buena copia de apt-get plus apt-search, y aporta usabilidad al mundo anteriormente arcano de la invocación de línea de comandos RPM.
kmarsh
3
en realidad, los formatos de paquete .deb y .rpm son incluso técnicamente (pero, IMO .deb tiene un mejor manejo de dependencia, especialmente dependencias versionadas, ofertas, conflictos y paquetes virtuales). apt-get es lo que brilla en el nivel tecnológico, pero lo que realmente hace que los paquetes de Debian se destaquen es el conjunto bien definido de políticas de desarrollador que establecen los estándares que los paquetes deben cumplir. los paquetes de ubuntu heredan eso en gran medida, y ubuntu también hereda también hereda la cultura del desarrollador que lo acompaña.
cas
5

Solo ve por .deb :-)

amh
fuente
2

Hubo varios formatos tentativos, como instalación cero y autoempaquetado . Lamentablemente, ninguno ganó tracción.

wazoox
fuente
2

Creo que Cletus, Wayne e Iny respondieron esto bastante bien. Me gustaría agregar eso realmente, no es un gran problema. Trabajo en un entorno mixto donde tenemos Gentoo (portage), SUSE (rpm / zypper) y OpenBSD (paquetes y puertos). Instalar paquetes en cualquiera de ellos no es difícil, y realmente no me importa qué formato estén usando.

Desde la perspectiva del software de empaquetado, tampoco es demasiado difícil. Ya sea Gentoo, una distribución basada en RPM o una distribución basada en deb, realmente se reduce a tener recetas para construir el software y agregar algunos metadatos. Siempre que el sistema de compilación de lo que está tratando de empaquetar no sea totalmente una locura, generalmente se necesita poco más que escribir un script de shell glorificado para crear un paquete.

Kamil Kisiel
fuente
1

Bueno, siempre hay binarios compilados estáticamente en bolas de alquitrán ... ;-)

Jason Tan
fuente
1
También conocido como "Slackware".
Paul Tomblin
Desafortunadamente, hay problemas con los archivos binarios compilados estáticamente que necesitan cargar las bibliotecas del sistema en tiempo de ejecución (especialmente nsswitch).
pjc50
1

No existe una definición de una interfaz binaria estándar para "Linux", ya que es solo un núcleo. Lo más probable es que su pila de software necesite interactuar con algo más que su núcleo, presentando un desafío particular de mantener un ABI estándar entre cientos de árboles de origen dispares.

Sobre el tema de buenas herramientas de empaque, prefiero Debian GNU / Linux por su excelente formato de empaque binario. Ha cubierto el 90% de mis necesidades de herramientas y aplicaciones estándar. El 10% restante se genera a partir de la fuente debido a la inclusión de componentes no libres o dependencias de biblioteca compartida con errores. Cuando esas aplicaciones deben implementarse, construyo binarios personalizados para los clústeres de producción.

sotavento
fuente
1

Para obtener una compilación única, ejecute el formato de paquete en cualquier lugar sin obligar a todos a usar la misma distribución que necesita un par de características importantes:

  • Nombre de paquete globalmente único, de modo que dos personas / distribuciones no pueden crear independientemente paquetes diferentes con el mismo nombre.

  • La capacidad de instalar en paralelo diferentes versiones de bibliotecas cuando los paquetes tienen requisitos conflictivos. Una distribución puede decidir qué versión de cada biblioteca usar y forzar a todos los paquetes a usar esa versión. Un sistema que funciona en todas las distribuciones debe ser más flexible.

Zero Install ofrece ambas características:

  • Los nombres son URI (por ejemplo, http://rox.sourceforge.net/2005/interfaces/ROX-Filer ). Solo el propietario de un dominio puede crear paquetes dentro de ese espacio de nombres de forma predeterminada.

  • Cada versión de cada paquete va en su propio directorio. Cada aplicación ve solo las bibliotecas que necesita, con las versiones con las que es compatible.

Por ejemplo, la aplicación Editar depende de Python <3 como este:

<command name="run" path="Edit/AppRun">
  <runner interface="http://repo.roscidus.com/python/python">
    <version before="3"/>
  </runner>
</command>

Ver también: http://www.osnews.com/story/16956/Decentralised-Installation-Systems

[Nota: soy un desarrollador de instalación 0]

user5746
fuente