Este artículo es el fruto de una pequeña “investigación” que realicé para satisfacer mi curiosidad sobre el origen de los paquetes que integran los repositorios de Ubuntu, cuyos resultados pienso que pueden ser interesantes para compartir con nuestra comunidad.

¿Qué me motiva a realizar esta tarea?

Como desarrollador de Nova — distribución cubana de GNU/Linux — no pocas veces he formado parte de todo tipo de discusiones sobre si Nova es una distribución por mérito propio o una remasterización de Ubuntu. En un artículo anterior abordé el tema tratando de mostrar algunas de las características que definen a una distribución. Esto no es una ciencia exacta, y siempre hubo quien no estuvo de acuerdo con estas apreciaciones. Para algunos, Nova no mantiene la suficiente cantidad de paquetes propios para ser considerada una distribución. Otros compañeros y yo siempre hemos respondido a estas apreciaciones con que ninguna distribución se desarrolla desde cero y que las distribuciones derivadas como Ubuntu reutilizan la mayoría de los paquetes que se encuentran en los repositorios de las distros padres, pero yo mismo siempre he tenido la duda: ¿Qué porciento de los paquetes que conforman los repositorios de Ubuntu es mantenido únicamente por ellos? ¿Qué porciento es tomado de los repositorios de Debian? ¿Cuántos paquetes nativos contienen los repositorios de Ubuntu? Dadas estas interrogantes y otras similares, decidí que explorar las índices del repositorio de Ubuntu 14.04 Trusty Tahr en busca de información era el camino a seguir.

Metodología

Como yo no uso Trusty, tuve que bajar los índices de su repositorio pues como es obvio, el listado de paquetes no se encontraba en mi caché de apt. Los índices con los que trabajaré son los denominados Sources que contienen la información de los paquetes fuentes (.dsc y compañía), pues considero que los paquetes binarios (.deb o .udeb) tienden a distorsionar los resultados: lo que mantiene un desarrollador es un paquete fuente y este puede generar varios paquetes binarios. Para bajar estos índices utilizo un poco de la magia de Bash con wget:

for i in main restricted universe multiverse; do wget -O $i http://ubuntu.uci.cu/ubuntu/dists/trusty/$i/source/Sources; done

Los índices en este caso los estoy bajando del espejo de la UCI, pero se pueden utilizar el repositorio oficial o cualquier otro espejo que contenga el código fuente. Solo utilizamos el canal principal e ignoramos las actualizaciones y backports pues son repos incompletos. Con esto obtenemos cuatro ficheros correspondientes a cada una de las secciones del repo de Trusty:

  • main (paquetes libres considerados como principales para definir la distribución y mantenidos por los desarrolladores principales de Ubuntu)
  • restricted (paquetes no libres considerados como principales para definir la distribución y mantenidos por los desarrolladores principales de Ubuntu)
  • universe (el resto de los paquetes libres, mantenidos por la comunidad de Ubuntu)
  • multiverse (el resto de los paquetes no libres, mantenidos por la comunidad de Ubuntu)

Sobre cada uno de estos ficheros haré algunas búsquedas con grep y contaré con wc para obtener la información que necesito. Por ejemplo, para obtener la cantidad de paquetes que hay en main:

grep ^Package: main | wc -l

Con lo que obtenemos que en main hay 3171 paquetes fuentes. Es importante conocer el total para comprobar que la suma de los resultados de nuestros filtrados con grep se corresponde con la cantidad de paquetes que realmente hay. Ahora lo que queda es organizar cómo vamos a aplicar el filtrado sobre el índice.

Nuestro objetivo es clasificar los paquetes en dos grupos: “mantenidos por Ubuntu” y “mantenidos por Debian”. Efectuamos la búsqueda con grep sobre los campos del índice con un orden de prioridad que a continuación se expone:

  1. Buscamos los campos “Version” que contengan “ubuntu”. Los paquetes que tienen este formato de versionado son aquellos que no son originalmente de Ubuntu pero que han recibido algún parche de los mantenedores de la distribución, por lo que se consideran mantenidos por Ubuntu:
    grep ^Version: main | grep ubuntu | wc -l
  2. Los paquetes que no cumplen con el criterio anterior, se pueden dividir en dos grupos: los que contienen en la versión un separador entre versión original y revisión de Debian (como son “~”, “+”, -), todos estos son paquetes mantenidos por Debian cuyos códigos fuentes originales son de terceros (por ejemplo, dnsmasq, cuya versión en Trusty es 2.68-1); y los que sólo contienen versión original, los cuales son conocidos como paquetes nativos, es decir, que son desarrollados dentro de la misma distribución (por ejemplo, devscripts, cuya versión en Trusty es 2.14.1). Obtener los paquetes no nativos y mantenidos por Debian que no fueron filtrados por el criterio anterior, se logra con:
    grep ^Version: main | grep -v ubuntu | grep [~+-] | wc -l
  3. Quedarían solo los paquetes nativos que no fueron filtrados por los criterios anteriores. El problema es que dentro de los nativos hay nativos de Debian y nativos de Ubuntu. La forma que encontré de diferenciar unos de otros desde los índices del repositorio, es ver si la dirección de correo electrónico de cada mantenedor está en los dominios “ubuntu.com” o “canonical.com”, lo cual situaría al paquete como nativo de Ubuntu. Los que no cumplan este criterio asumiremos que son nativos de Debian:
    grep -C 5 -x -F "$(grep ^Maintainer: main | grep -e ubuntu.com -e canonical.com)" main | grep ^Version: | grep -v ubuntu | grep -v [~+-] |  wc -l
  4. El valor que retorne el comando anterior hay que restárselo a la cantidad total de paquetes nativos para así obtener la cantidad de paquetes nativos de Debian. El total de paquetes nativos se obtiene con:
    grep ^Version: main | grep -v ubuntu | grep -v [~+-]| wc -l

Estoy consciente de que este método no es 100% exacto, pero considero que sus resultados están bastante cercanos a la realidad.

 Resultados

En los siguientes gráficos podemos apreciar la cantidad de paquetes que son mantenidos por Debian y por Ubuntu en cada una de las secciones del repositorio de Ubuntu:

sections-percentages-debian-ubuntuSi totalizamos estos valores para ver a nivel de todo el repositorio cómo se comporta esta clasificación de los paquetes , obtenemos el resultado que se observa en el siguiente gráfico:

total-percentages-debian-ubuntuViendo lo interesante de esta información me pareció oportuno hacer un análisis más detallado de los orígenes de los paquetes que distribuye Ubuntu. Así que, más allá de clasificarlos solo en “mantenido por Debian” o “mantenido por Ubuntu”, decidí aplicar la metodología antes descrita con algunos necesarios ajustes para clasificar los paquetes en cinco grupos:

  • Nativos de Debian
  • Nativos de Ubuntu
  • Mantenidos por Debian desarrollados por terceros
  • Mantenidos por Ubuntu desarrollados por terceros
  • Mantenidos por Ubuntu tomándolos del repositorio de Debian y modificándolos

Para diferenciar los paquetes mantenidos por Ubuntu y tomados de terceros de los que son tomados del repo de Debian, tomé como referencia la versión del paquete, más específicamente la parte de la revisión que le hacen Debian y Ubuntu. Un paquete cuya revisión empiece con “-0ubuntu” significa que no tiene revisiones de Debian, y en consecuencia es mantenido directamente por Ubuntu. Esto no es tan exacto, ya que un paquete nativo como upstart (la implementación de init de Canonical) que por lógica debería tener una versión de paquete nativo, es decir, sin revisión, tiene un formato de versión de paquete de tercero: 1.12.1-0ubuntu4. ¿Será que Canonical tenía la esperanza de que Debian adoptara upstart? En fin, que para diferenciar los paquetes que son mantenidos directamente por Ubuntu de los “heredados” de Debian, nos sirve este comando:

grep ^Version: main | grep '\-0ubuntu' | wc -l

Y los “heredados” de Debian serían todos los demás que contengan “ubuntu” en la revisión, excluyendo a los anteriores:

grep ^Version: main | grep ubuntu | grep -v '\-0ubuntu' | wc -l

A continuación muestro los resultados para cada una de las secciones del repositorio:

sections-percentages-five-classifications

Y la totalización de estos datos arroja lo siguiente:

total-percentages-five-classifications

Conclusiones

La libertad que brinda el software libre es su mayor virtud. El trabajo colectivo se combina con esta, permitiendo el máximo de reutilización de código, lo cual conlleva a alcanzar grandes cosas con el mínimo esfuerzo, sin tener que reinventar la rueda. Los desarrolladores de las distribuciones de GNU/Linux son especialistas en incorporar el código que otros desarrollan, y a su vez contribuyen a mejorarlo en el proceso de adaptarlo a las necesidades de cada proyecto. Los desarrolladores de Debian y de Ubuntu no están ajenos a esta realidad y saben aprovechar bien las ventajas que brinda el software libre para lograr sus metas. Una distribución de GNU/Linux no es menos porque reutilice código de terceros, sino por lo que sea capaz de hacer con este. Esa es la esencia de la soberanía tecnológica y de la socio-adaptabilidad que podemos obtener con la utilización de software libre.