Rosetta, Babel y Packlets
(by Diego Saravia, dsa@unsa.edu.ar)
Esta página es parte del proyecto http://www.sumapack.org
Introduccion: El proceso de distribución del Software Libre y su ontología.
Ontología
Gran parte del Software Libre se adquiere e instala en cada computadora mediantes "paquetes binarios" por diferentes herramientas desde determinados conjuntos de repositorios. A estos mecanismos que combinan: paquetes binarios en ciertos formatos, distribuidos desde conjuntos de repositorios, mediante determinadas herramientas que mantienen bases de datos de paquetes locales a cada computadora; se les suele denominar "Distribuciones". Estas también suelen tener herramientas propias y diferenciadas de instalación, configuración, y administración del sistema.
Los conjunto de repositorios son accesibles via internet u otras vías: como cdroms, dvds, etc..
Estos repositiorios dividen y unifican los proyectos originales en diferentes paquetes asignandoles nombres diferentes entre si, diferentes a los nombres originales y diferentes de distro a distro. Algunos clasificados en desarrollo, documentos, binarios, librerias, etc, creando tantos binarios como arquitecturas y esquemas de configuración se desee.
Los repositorios tambien suelen proveer un paquete fuente para cada paquete binario provisto, cumpliendo los requisitos de la distribución del software libre.
Existen repositorios independientes que proveen paquetes extra a una o mas distribuciones.
Algunos repositorios son versionados en el sentido de que un subconjunto de paquetes son sindicados como integrantes de una version que cambia periodicamente. Asi se transforma un problema de tantas dimensiones como paquetes hay en un sistema en un problema en cada momento unidimensional, simplificando las herramientas relacionadas. Tambien se versionan variantes o mas nuevas o mas viejas, para permitir sistemas "estables" donde no existan novedades mas alla de las estrictamente necesarias para asegurarlos.
Existen otros mecanismos, como Gentoo, o los descriptos en "Linux from Scratch", basados generalmente en: wget, tar, configure, make y make install; para usar codigo fuente e instalarlo previa compilacion. Estos obtienen el software directamente desde los proyectos originales sea mediante paquetes fuentes o sistemas de control de cambios como svn, git, etc..
Estos otros métodos aportan instrucciones adicionales a los paquetes originales sea en forma de libro como Linux From Scratch o en forma de scripts (ebuilds de Gentoo).
Estos sistemas mas que como "distros" actuan como creadores de distribuciones o como formas particulares para crear repositorios y distribuciones.
Es posible si bien menos habitual, mezclar para un sistema o computadora todos los mecanismos preexistentes.
El proceso de distribucion y sus elementos:
- Desarrollo de software y almacenamiento compartido y dinámico mediante sistemas de: Control de Cambios: svn, cvs, git, etc..
- Publicación períodica de las fuentes por los equipos de desarrollo: Paquetes originales
- Creación de información adicional aportada por los empaquetadores: .ebuild, debian/control dsc, .spec, etc. que no se incorpora en cada paquete fuente y que presenta diferencias no siempre necesarias entre diferenes distros: Información de empaquetado.
- Publicación de Repositorios, produciendo, compilando y empaquetando en forma coherente los paquetes fuentes entre si, con la información adicional y decisiones globales de cada distro: Repositorios y paquetes binarios.
- Instalacion de los paquetes en cada máquina, desde los repositorios, por internet o medios físicos, creando una base de datos local y usando herramientas específicas: bases de datos locales, herramientas de gestión, software instalado en cada máquina.
Crítica
Esta situación puede haberse construido en su momento para garantizar la venta períodica de CDROMS, medios, y subscripciones.
La clave de la fragmentación del espacio gnu/linuxero se encuentra en el desarrollo de formatos, repositorios (para colmo versionados) y herramientas incompatibles entre si con el fin de asegurar el control del usuario y su fidelización con la "distro", sea por intereses comerciales o poder atencional de diferentes "comunidades", organizaciones o líderes.
Así este poder se desplaza desde los desarrolladores de los miles de paquetes de software libre, donde reside la creatividad que impulsa el emprendimiento, a los empaquetadores de las distros, que cobran protagonismo al auto-desarrollar herramientas incompatibles que refuerzan su necesidad de existencia, como cualqueir burocracia conocida. Lo que paso con el proyecto GNU y Linux, pasa con miles de desarrolladores y unas pocas "distros".
Nada impediría tener herramientas ortogonales en cuanto a los repositorios, bases de datos locales y formatos de empaquetamiento, de hecho algunos proyectos han avanzado en esta dirección, como smart.
Nada impediria automatizar y sistematizar el proceso de empaquetamiento de forma que pueda hacerlo en gran parte, sin esfuerzo ni gran atención, el desarrollador de software, quedando para los distribuidores aspectos de interoperatibidad con otros paquetes y sincronización de cada "release" de distro, que es lo que realmente aporta una distro, la capacidad de distribuir y la capacidad de hacer interoperar los paquetes.
La paqueteria binaria presenta un conjunto de consideraciones a tener en cuenta: arquitectura, procesador, librerias, opciones de compilacion, combinacion de paquetes, etc.. Así que ciertamente hay necesidad de que en cada computadora todos los binarios compartan las librerías dinámicas y metodologías de configuracion. Esto dificulta o imposibilita en principio usar diferentes conjuntos de repositorios binarios en un mismo sistema. Pero a esta cuestión central y objetiva no es necesario aplicarle confusión adicional en cuanto a formatos, programas y distros. En pricipio no debiera haber problema si una persona instalo debian en un sistema y hace dist-upgrade a un suse.
También es cierto que la consigna de la FSF de distribuir software fuente y no binario y de no preparar herramientas que cubran esta última milla para favorecer la distribución de fuentes, complica el panorama. Los vacios se ocupan y no siempre de la mejor manera.
Existe una necesidad concreta de generar repositorios de binarios por terceros para facilitar el uso del software libre en cada computadora. No se puede pedir a cada proyecto de software libre que mantenga servidores propios desde los cuales se descarguen todos los binarios del mundo. Tampoco es razonable que todos compilen todo su software. Es razonable que existan repositorios de binarios y que estos sean conocidos como "distros". Repositorios cuyos paquetes reflejen una gran diversidad en cuanto a opciones de compilacion y uso de librerias y que cada uno de ellos tenga una seleccion de las mismas coherente entre si.
Lo que no es razonable es la existencia de una integracion vertical no interoperable entre los repositorios, los formatos de empaquetamiento, las herramientas y las bases locales. Esto va en contra de los criterios de diseño de un buen software que para una accion que debe operar con todos los formatos de datos conocidos.
Propuesta
Los problemas mencionados son los que queremos ayudar a visualizar y superar con SumaPack.
Desde ya incorporamos los mecanismos preexistentes y en cierta forma proponemos integrar sus contribuciones para conformar un método mas racional de producir software, paquetes y repositorios sin la fragmentacion adicional de las distros tal como hoy se las conoce.
Entonces el objetivo central de este software es apoyar un proceso que vaya tendiendo a construir herramientas interoperables en la distribución del software libre
En cuanto al proceso de creación y distribución de software Sumapack plantea incorporar la maxima cantidad posible de informacion extra necesaria hoy aportada por los empaquetadores en los paquetes originales mediante un formato comun, archivo: paquete.summa integrado en el trabajo del configure.ac y los makefiles.am de las autotools.
De tal forma es posible con las makefiles originales generar paquetes binarios de todo tipo y color.
A los efectos de poder usar estos paquetes y sus dependencias en todas las distros y ayudar a la prueba y desarrollo de un software en cualquier distro, se proveen herramientas de instalacion que interoperan con todas las herramientas particulares, y un esquema de traduccion de nombres de paquetes entre repositorios.
Conceptos de Rosetta y Babel en SumaPack
Dada la situación antes descripta SumaPack pretende ayudar en un proceso de homogeneizacion de la paquetería y herramientas.
Con babel SumaPack aporta comandos tipo "wrappers" que traducen las diferencias entre las herramientas y con rosetta una infraestructura para unificar y traducir los nombres de los paquetes en distintos repos.
Esto facilita a los usuarios el moverse entre diferentes distribuciones y a los desarrolladores facilitar la construccion de sus paquetes fuentes y hacer instaladores graficos que funcionen en todos lados, entre otras ventajas.
Asi se provee:
- el comando sp para integrar:
- las herramientas, mediante Babel y sus wrappers conocidos como packlets
- los nombres de los paquetes en los diferentes repos, mediante Rosetta, con un archivo diccionario llamado rosetta.dat
- Un script para generar comandos de bootstrapping para instalar SumaPack por primera vez en un sistema.
Se puede pensar en un microlenguaje de administración de paquetes formado por frases donde la primera palabra es una accion y le siguen varios objetos. Segun la accion y el tipo de objeto se ejecuta el packlet específico para cada herramienta con el comando interno de packlet que corresponda. los packlets segun la siguiente tabla.
Babel clasifica los objetos segun su tipo y los agrupa segun el packlet que debera tramitarlos.
El comando babel toma como argumentos, una orden, un posible argumento opcional y luego un argumento por cada "elemento" sobre el que operar y termina ejecutando un packlet o eventualmente generando un comando para hacer bootstraping del propio babel.
- Acciones de babel (su primer argumento):
- install
- remove
- clean
- fix
- search
- info
- Tipos de objetos del comando babel que van como sus argumentos:
- PACKAGES en PACKAGES-LIST (listas de argumentos) identifican con precision un paquete, quizas definido por rosetta a partir de algun proyecto o funcion. (accion de rosetta: traducción de nombres de paqueteria)
- PACKAGES-SETS: WORLD, SYSTEM, ALL: conjuntos especiales (sets) de paquetes en la computadora (en definitiva paquetes descriptivos de archivos instalados).
- ALL todo el repo
- SYSTEM todos los instalados incluyendo los basicos dist-upgrade
- WORD los instalados menos los basicos algunos comandos que operan sobre paquetes por defecto toman esto upgrade fix
- REPO: identifican con precision un repositorio
- CACHE: para indicar que se opera con la base local de paqutes de cada sistema-
- NAMES: para buscar PACKAGES
- Packlets, (wrappers o backends): PAQ-emerge.sh PAQ-pacman.sh PAQ-slapt.sh PAQ-urpmi.sh PAQ-yum.sh PAQ-apt.sh PAQ-feta.sh PAQ-smart.sh PAQ-uget.sh source.sh comain.sh, etc
- bootstrap SumaPack
Interaccion entre Acciones, Objetos y Packlets
Tabla que muestra para cada accion de babel y tipo de objeto (cuanfo es un paquete de un repo) el comando interno del packlet que se ejecuta. Además se indica que tipo de informacion modifica el comando en el sistema.
Clave de la tabla
. | Objeto: NAME, PACKAGES, ... |
Accion: install, remove ... | Comando interno de Packlet que corresponde. |
. | Que modifica |
Tabla
. | NAMES | PACKAGES | PACKAGES | REPO | WORLD | SYSTEM | ALL | CACHE |
install | . | . | install | addrepo | update | distupdate | . | refresh |
remove | . | . | remove | delrepo | . | . | . | . |
clean | . | . | clean | . | depclean | . | . | clean |
fix | . | . | fix | . | fix | . | . | . |
search | search | . | . | . | . | . | . | . |
info | . | info | . | . | stats | stats | stats | stats |
MODIFICA | No M. P. I. | No M. P. I. | M. F.S. | M. Conf. | M. F.S. | M. F.S. | M. F.S. | M. Cache |
F.S.: file system, archivos de la computadora provenientes de los paquetes
Conf.: Configuracion del sistema empaquetador
No M. P.I.: no modifica, produce información.
Se ejecutan distintos packlets segun la distribucion y el tipo de objeto, Todos los packlets deben tener similares comandos que cumplan la funcion dada.
No se instrumento todavía el comando query que suele ejecutar consultas sofisticadas al cache o base de datos.
Ademas los packlets tienen la accion special, que sirve para ejecutar comandos particulares no planteados en Babel.
Notas: Para actualizar el sistema pero no los paquetes relativos a la version, es "install WORLD", para cambiar todo hasta la version es "install SYSTEM", ejecutar "install ALL" debiera instalar todo el repositorio en la maquina, no se instrumento todavia. Para actualizar o instalar desde cero, el cache es "install CACHE". Install REPO es traducido como addrepo REPO.
El comando de packlet update, en debian suele conocerce como upgrade, el refresh es conocido en debian como update.
No siempre se logra que todas las herramientas hagan todas las funciones o exactamente lo mismo.
Los Objetos
Cada uno de los objetos comienza con un codigo de objeto que identifica el tipo y como esta empaquetado en caso de ser paquete, luego sigue la ubicación de donde se adquiere el mismo y su identificación.
- EBUILD archivo de paquetria de gentoo, a ejecutar con comandos de bajo nivel
- SUMMA archivo de paqueteria sumapack, a ejecutar con comandos de bajo nivel
- PKG paquete cygnus, a ejecutar con comandos de bajo nivel
- RPM paquete rpm, a ejecutar con comandos de bajo nivel
- DEB paquete debian, a ejecutar con comandos de bajo nivel
- TXZ nuevo paquete slackware, a ejecutar con comandos de bajo nivel
- TGZ viejo paquete slackware, a ejecutar con comandos de bajo nivel
- TBZ paquete ututo, a ejecutar con comandos de bajo nivel
- SOURCE paquete fuente
- SVN repositorio subversion
- CPAN repositorio perl
- SH archivo con instrucciones para instalar un software,
- LSH comando a ejecutar
- COMMAND ejecutar el packlet particular que sigue
- PAQ paquete estandar para el sistema en cuestion, a ejecutar con el sistema de paqueteria del sistema, se coloca por defecto cuando no esta, puede ser su nombre, un archivo, etc.
- REPO repositorio
- NAME cadena con el que se buscara el nombre de un paquete, se coloca por defecto cuando no esta y el comando es search
Paquetes, funciones y proyectos.
Todos los códigos anteriors desde EBUILD hasta PAQ corresponden a paquetes,(PACKAGE), que son elementos en listas de paquetes (PACKAGES-LIST), y pueden especificar los paquetes de muchas formas segun su código.
En Rosetta cada funcion del sistema se la identifica con un nombre, que puede estar asociado en rosetta.dat con varios proyectos de software que brindan esa funcion. El sistema ante cada funcion puede instalar uno o mas proyectos alternativos o complementarios, permitiendo definir en cada caso el comportamiento y proveyendo uno por defecto. Cada proyecto para cada "distribucion" ofrece uno o mas paquetes para su instalacion. Entonces hay tres niveles involucrados: Funcion, Proyecto y Paquete. Para cada Funcion y cada Distro rosetta propone diferentes paquetes para su instalacion. Babel toma estos paquetes y los instalan.
Documento Específico sobre Rosetta (falta)
Conjuntos de Repositorios.
Un conjunto de repositorios contiene paquetes binarios (y sus versiones
fuentes) compilados en forma coherente para que puedan interoperar. Los repositorios pueden distribuirse por redes como Internet o por medios físicos.
Existen varios conjuntos, en principio uno por cada distribución.
Se accede a ellos con diferentes herramientas que instalan en cada sistema los paquetes requeridos y almacenan localmente informacion en diferentes bases de datos. Existen herramientas de diverso nivel, algunas garantizan la instalacion de paquetes y los paquetes de los cuales dependen, otras no. En muchos sisemas existe una herramienta de bajo nivel y otra de alto nivel que garantiza las dependencias. SumaPack intenta operar con las herramientas de mayor nivel de cada sistema. Algunas herramientas como smart intentan operar con diversos repositorios.
Algunos repos existentes:
- Slackware: opera con slapt-get y otras herramientas; por debajo installpkg, removepkg, upgradepkg
- Debian - Ubuntu operan con las mismas herramientas: apt; dpkg
- Suse: zypper; rpm
- RedHat: yum; rpm
- Ututo - Gentoo: uget, emerge para las fuentes (gentoo); ebuild
- Mandriva: urpmi; rpm
- Arch:pacman
Wrappers: Packlet
Cada uno de estas herramientas suele permitir, al usuario o administrador del sistema, realizar diversas operaciones con sus paquetes: adquirirlos, instalarlos, removerlos, buscarlos, conectarse con un repositorio, etc no todas las opciones funcionan en todos los sistemas no en todas hacen exactamente lo mismo
Disponemos de packlets en diferente avance de desarrollo para:
- Generico: PAQ.sh llama a los otros PAQ-*.sh
- Para sistemas que instalan dependencias (alto nivel): *PAQ-emerge.sh* PAQ-pacman.sh PAQ-slapt.sh PAQ-urpmi.sh PAQ-yum.sh PAQ-apt.sh PAQ-feta.sh PAQ-smart.sh PAQ-uget.sh PAQ-wajig.sh PAQ-zypper.sh. Estos packlets tienen comandos internos para hacer diferentes operaciones concretas:
- install
- remove
- clean
- fix
- search
- info
- addrepo
- delrepo
- update
- deplclean
- distupdate
- refresh
- Para interactuar con programas de "bajo" nivel: installpkg.sh ebuild.sh rpm.sh dpkg.sh
- Para instalar y compilar fuentes: source.sh svn.sh comain.sh cpan.sh. Source baja los paquetes y comain ejecuta ./configure, make, make install, segun se le indique. Cpan baja las fuentes de módulos perl.
- Para casos particulares de paquetes no estandar: svn2cl-suse.sh
Algunos de ellos admiten opciones y pueden operar sobre distintos argumentos
Acciones de babel
Install PACKAGE-LIST PACKAGE-SETS REPO-LIST CACHE
Instala el objetivo, sea paquete, conjunto de paquetes o repositorio.
Este comportamiento es optimo para interactuar con rosetta y rosetta.dat, ya que rosetta describe una lista de acciones necesarias para instalar un paquete, incluida la configuracion de nuevos repositorios.
En el caso de un paquete de los repositorios configurados lo instala con sus dependencias y lo lleva a su ultima version (upgrade).
Con opciones se le puede indicar en esta accion:
- que reinstale el paquete aun cuando no haya que actualizarlo. Ver la cuestion de la reconfiguración.
- que baje el paquete, sin instalarlo
- que use el paquete fuente, sea para bajarlo, desempaquetarlo, construirlo, configurarlo o instalarlo, en forma directa o recreando paqueteria binaria.
- que lo instale sin dependencias o que incluya las dependencias para compilarlo.
En el caso de un repositorio lo instala y reconstruye el cache acorde con el nuevo repositorio.
En el caso de un paquete fuente, sea binario, repositorio subversion, o cpan, lo instala, pudiendo optarse, por solo bajarlo, desempaquetarlo, configurarlo, construirlo, instalarlo en forma directa o mediante la recreacion de paqueteria.
Las opciones se incorporan mediante —opts OPCION
OPCION Consiste en dos palabras separadas por un _
La primera consta de 5 letras, no importa que vaya en cada una, en tanto sea diferente de 0, otro caracter activa la opcion. Los cinco caracteres corresponden a:
- SOURCE, si esta instala a partir del paquete fuente
- NO_DEPS, si esta no instala dependencias
- NO_UPGRADE, si esta no hace upgrade al instalar, o sea si el paquete ya esta instalado no pone una version nueva.
- FORCE, si esta el paquete se reinstala aunque ya este instalado, ver que pasa con la configuracion en cada sistema.
- BUILD_DEPS, si esta se instalan junto con el paquete fuente las dependencias binarias para poder compilarla.
La segunda puede ser una de las siguientes:
- dwld solo baja el paquete
- tar solo lo desempaqueta
- configure lo configura (si es fuente)
- all hace make (si es fuente)
- package hace paqueteria apropiada (si es fuente)
- srcinstall construye paqueteria apropiada y lo instala con esta (si es fuente)
- install hace make install (si es fuente)
SDUFB_dwld|tar|configure|all|package|srcinstall|install
Remove PACKAGE-LIST REPO
Elimina los archivos que un paquete incorpora en el sistema o elimina un repositorio de la configuracion de la herramienta de paqueteria.
clean PACKAGE-LIST PACKAGE-SETS CACHE
Limpia para cada paquete (clean) o conjunto de paquetes (depclean en WORLD) o el cache (clean,autoclean) las dependencias no usadas
En los cache puede sacar todo o solo lo que no se usa
Puede mostrar los paquetes a ser "limpiados" con una opcion (check)
fix PACKAGE-LIST PACKAGE-SETS
Corrije problemas en los paquetes o conjuntos indicados, generalmente problemas de dependencias.
search NAME
Búsqueda de paquetes en su nombre, o su descripcion y otra informacion.
Si la primera palabra de la opcion unica es "all", busca en toda la info disponible, si no solo en su nombre.
info PACKAGE-LIST PACKAGE-SETS CACHE
Muestra informacion relativa a cada paquete contenido en la lista, en los conjuntos seleccionados, o en el cache.
special NON-TRANSLATED-COMMAND
Para actuar directamente sobre la herramienta subyacente y pasarle un comando nativo no traducido.
Referencias
Manifiesto Anti Distros. Diego Saravia http://docs.hipatia.info/distros/
How package management changed everything. Ian Murdock. http://ianmurdock.com/solaris/how-package-management-changed-everything/
http://en.opensuse.org/Software_Management_Command_Line_Comparison http://wiki.archlinux.org/index.php/Pacman_Rosetta
http://www.packagekit.org/index.html http://en.wikipedia.org/wiki/PackageKit
http://ututo.org/manual/index.php/Par%C3%A1metros_de_Uget http://ututo.org/freewiki/index.php/UTUTO-get_Serie_1
http://en.wikipedia.org/wiki/Smart_Package_Manager http://www.labix.org/smart/ http://www.labix.org/smart/faq http://labix.org/smart/user-guide/Command%20Line%20Interface
http://packages.debian.org/etch/feta http://www.togaware.com/linux/survivor/Wajig_Packages.html http://wiki.xtronics.com/index.php/Wajig http://en.wikipedia.org/wiki/Advanced_Packaging_Tool https://bugs.launchpad.net/ubuntu/+source/apt-setup http://cpansearch.perl.org/src/IANK/Config-Apt-Sources-0.10/lib/Config/Apt/SourceEntry.pm http://mirrorer.alioth.debian.org/reprepro.1.html
http://en.opensuse.org/Zypper/Usage/11.2 http://lilypond.org/blog/janneke/openSUSE-HOWTO#347624
http://www.gentoo.org/doc/es/handbook/handbook-x86.xml?part=2&chap=1 http://en.wikipedia.org/wiki/Portage_%28software%29
http://www.slackware.cl/docs/guia/arreglo/cap_4_8.html http://en.wikipedia.org/wiki/Pkgsrc
http://www.archlinux.org/pacman/pacman.8.html http://search.cpan.org/~juster/ALPM-0.03/lib/ALPM.pod
http://es.wikipedia.org/wiki/Urpmi http://emerde.freaknet.org/changelog.php